我目前正在测试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>
答案 0 :(得分:2)
出乎意料的是,如果不在import语句中包含.js扩展名,我的代码将无效。这是标准行为吗?我以为你可以省略。
浏览器的工作不是猜测资源说明符对服务器意味着什么。您当然可以通过提供具有.js
但该服务器配置的匹配文件来配置您的服务器,以便在没有.js
的情况下响应GET。
在这方面可能会有进化。例如,现在the spec要求模块资源说明符以/
或./
开头。这特别是......
...将来我们可以允许自定义模块加载器为“裸”导入说明符赋予特殊含义,例如
import "jquery"
或import "web/crypto"
。目前,任何此类导入都将失败,而不是被视为相对URL。