[英]node.js 13 - import is not working properly
$ node --version v13.8.0
让我们创建三个文件:
// package.json
{
"type": "module"
}
// foobar.js
function foo() { console.log('foo') }
export default {foo}
// index.js
import Foo from './foobar.js';
Foo.foo();
运行 index.js
$ node index.js
(node:22768) ExperimentalWarning: The ESM module loader is experimental.
foo
所有的工作。
现在改变'./foobar.js'; 到'./foobar';
// index.js
import Foo from './foobar';
Foo.foo();
我们得到一个错误!
(node:22946) ExperimentalWarning: The ESM module loader is experimental.
internal/modules/esm/resolve.js:58
let url = moduleWrapResolve(specifier, parentURL);
^
Error: Cannot find module /foobar imported from /index.js
目录中没有其他文件。
为什么会发生? 为什么没有扩展名的导入不起作用?
更新: https : //nodejs.org/api/esm.html
package.json“类型”字段
当最近的父 package.json 文件包含值为“module”的顶级字段“type”时,以 .js 结尾或缺少任何扩展名的文件将作为 ES 模块加载。
所以 './foobar' 必须工作。
更新 2:
我相信文档所说的“无扩展文件”是没有扩展名的字面文件,而不是没有扩展名的导入文件。
例如,如果您使用 import Foo from './foobar'; 导入您的文件,并且您的文件名为 foobar 而没有 .js 扩展名,它会正常工作。
感谢@Seblor
查看文档,在Differences Between ES Modules and CommonJS
的Differences Between ES Modules and CommonJS
类别中,更准确地说,在“强制文件扩展名”部分,它说.js
文件扩展名必须存在才能使导入工作:
使用 import 关键字时必须提供文件扩展名。 目录索引(例如'./startup/index.js')也必须完全指定。
此行为与导入在浏览器环境中的行为方式相匹配,假设服务器是典型配置的。
我不知道为什么你的最后一个问题是关于进口无extention不再工作。 我猜你在某个时候一直在使用像 babel 这样的转译器来解析没有扩展名的文件。
编辑 :
我相信文档所说的“无扩展文件”是没有扩展名的字面文件,而不是没有扩展名的导入文件。
例如,如果您使用import Foo from './foobar';
导入文件import Foo from './foobar';
,并且你的文件被称为foobar
没有.js
扩展名,它会正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.