Javascript ES6导入/导出是否需要;。js";分机?

Javascript ES6导入/导出是否需要;。js";分机?,javascript,es6-modules,Javascript,Es6 Modules,我安装了chrome beta版60.0.3112.24(官方版本)beta版(64位) 在chrome://flags/ 我启用了“实验性Web平台功能”(请参阅) 然后我试着: <script type="module" src='bla/src/index.js'></script> 这是指现有文件drawImage.js 我在控制台中得到的是错误 GET http://localhost/bla/src/drawImage 如果我更改导出并添加“.js”扩展

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

在chrome://flags/ 我启用了“实验性Web平台功能”(请参阅)

然后我试着:

<script type="module" src='bla/src/index.js'></script>
这是指现有文件drawImage.js

我在控制台中得到的是错误

GET http://localhost/bla/src/drawImage 
如果我更改导出并添加“.js”扩展名,它可以正常工作

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


而且webpack没有扩展就可以很好地构建它

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

作为证明,请尝试以下内容:

  • 将文件重命名为
    drawImage.test
  • 编辑
    index.js
    以包含
    './drawImage.test'
重新加载,您将看到扩展名
js
test
完全是任意的,只要您在
导出中指定它即可


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

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


在您的情况下,
http://localhost/bla/src/drawImage
不是文件,而
http://localhost/bla/src/drawImage.js
是,所以这就是错误的来源。例如,您可以在所有导入语句中添加
.js
,或者将服务器配置为忽略扩展名。Webpack也有同样的功能。

ES6导入/导出需要“.js”扩展名。 节点文档中有明确的说明:

  • 相对说明符,如“/startup.js”或“../config.mjs”。它们指的是相对于导入文件位置的路径。对于这些文件,文件扩展名始终是必需的
  • 此行为与导入在浏览器环境中的行为相匹配,假定为典型配置的服务器

  • thx!我很困惑,因为导入似乎不需要扩展?此外,网页包没有扩展也可以正常工作!我从未尝试过这些实验性功能,但在node.js中使用了
    commonJS
    机制。我遇到过类似的问题,解决方法是避免让加载程序猜测扩展。此外,如果您有两个文件,那么这两个文件都可能是可行的,例如
    data.js
    data.json
    。我认为最好是直言不讳,但这只是我的观点。@pid是的,最好是直言不讳,完全同意。如果您的环境允许使用其他内容,那么很好,但是模块或模块系统没有理由猜测这是不正确的:“模块不关心扩展”。Webpack可能能够在没有
    .js
    的情况下解析文件,但浏览器目前无法解析url路径,但它们对扩展没有任何魔力,因为它们不知道您的Web服务器上存在哪些资源。他们只是获取解析的url。如果您的服务器实际上在无扩展的url上有一个模块,那么它也可以正常工作。“ES6导入/导出需要”.js“extension”不是真的。请参阅已接受的答案或您的第一点。
    GET http://localhost/bla/src/drawImage