ES6导入/导出是否需要".js"扩展名?

kof*_*fus 10 javascript es6-modules

我安装了chrome beta - 版本60.0.3112.24(官方版本)测试版(64位)

在chrome:// flags/I启用'实验Web平台功能'(参见https://jakearchibald.com/2017/es-modules-in-browsers)

然后我尝试了:

<script type="module" src='bla/src/index.js'></script>
Run Code Online (Sandbox Code Playgroud)

其中index.js有一行如下:

export { default as drawImage } from './drawImage';
Run Code Online (Sandbox Code Playgroud)

这是指现有的文件drawImage.js

我在控制台得到的是错误

GET http://localhost/bla/src/drawImage 
Run Code Online (Sandbox Code Playgroud)

如果我更改导出并添加".js"扩展名,它可以正常工作.

这是一个chrome bug还是ES6在这种情况下要求扩展?

webpack也可以在没有扩展的情况下构建它!

pid*_*pid 7

扩展名是文件名的一部分.你必须把它放进去.

作为证明尝试这个:

  • 将文件重命名为 drawImage.test
  • 编辑index.js以包含'./drawImage.test'

重新加载,你会看到扩展jstest完全arbirary,只要你在中指定它export.

显然,测试后恢复到正确/更好的js扩展.

  • 谢谢 !我很困惑,因为导入似乎不需要扩展?如果没有扩展,webpack也可以正常工作! (2认同)
  • @pid是更好的明确,完全同意.如果您的环境允许其他东西,很好,但没有理由让模块或模块系统猜测 (2认同)

Ber*_*rgi 6

不,模块不关心扩展。它只需要是一个解析为源文件的名称即可。

在您的情况下,http://localhost/bla/src/drawImageis不是文件,http://localhost/bla/src/drawImage.js而是is,所以这就是错误的出处。例如,您可以将服务器配置为忽略扩展名。Webpack也是一样。

  • 一般来说,这是不正确的:“模块不关心扩展”。Webpack 可能能够解析没有“.js”的文件,但浏览器目前还不能。 (5认同)
  • @Luke 浏览器解析 url 的路径,但它们对扩展没有任何作用,因为它们不知道您的网络服务器上存在哪些资源。他们只是获取已解析的网址。如果您的服务器实际上在无扩展名的 url 上有一个模块,那么它也可以正常工作。 (2认同)