繁体   English   中英

node.js 13 - 导入无法正常工作

[英]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 CommonJSDifferences 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM