在Safari DP中导入ES2015模块需要文件扩展名

时间:2017-01-17 14:52:15

标签: javascript safari ecmascript-6 es6-module-loader es6-modules

我目前正在测试Safari开发者预览版中的ES2015报道(声称支持100%ES2015,包括模块)。

我做了一个简单的测试,使用了我在使用ES2015代码开发时经常使用的相同语法(以及用于转换的Babel.JS和用于捆绑的Browserify)。

出乎意料的是,如果没有在import语句中包含.js扩展名,我的代码就无法运行。这是标准行为吗?我以为你可以省略。

/* filename: scripts/alert.js */
export default class Alert {
    constructor(message) {
        this.message = message;
    }
    
    show() {
        alert(this.message);
    }
}

// Another file


/* filename: scripts/index.js */
import Alert from "./alert.js"; // this won't work if I change it to 'import Alert from "./alert";'

(new Alert("Hello, World!")).show();
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <title>ES2015 Modules</title>
</head>
<body>
    <h1>ES2015 Modules</h1>
    <script async="async" type="module" src"scripts/index.js">
    </script>
</body>
</html>

1 个答案:

答案 0 :(得分:2)

  

出乎意料的是,如果不在import语句中包含.js扩展名,我的代码将无效。这是标准行为吗?我以为你可以省略。

浏览器的工作不是猜测资源说明符对服务器意味着什么。您当然可以通过提供具有.js但该服务器配置的匹配文件来配置您的服务器,以便在没有.js的情况下响应GET。

在这方面可能会有进化。例如,现在the spec要求模块资源说明符以/./开头。这特别是......

  

...将来我们可以允许自定义模块加载器为“裸”导入说明符赋予特殊含义,例如import "jquery"import "web/crypto"。目前,任何此类导入都将失败,而不是被视为相对URL。