[GPT] nodejs 什么情况下可以使用 import 来引入 export 的模块

在 Node.js 中,原生并不支持 ES6 的 import 语句来引入模块。

不过从 Node.js v12 开始,通过实验性功能(--experimental-modules)可以使用 .mjs 扩展名的文件来启用对 ES6 模块的支持,并使用 import 语句。

新版本 Nodejs 已移除了 --experimental-modules

但是,在生产环境中,为了确保兼容性和广泛支持,通常会借助工具如 Babel 或 TypeScript 进行转译,将 ES6 模块语法转换为 Node.js 原生支持的 CommonJS (require) 语法。

如果你想在 Node.js 环境中直接使用 import 语句,你需要满足以下条件:

  Node.js 版本要求:使用支持 ES6 模块的 Node.js 版本,并且可能需要开启实验性特性标志。
  文件扩展名:对于使用 import 的模块文件,通常应使用 .mjs 扩展名以指示 Node.js 使用 ES6 模块解析器。
  配置启动参数:启动 Node.js 应用时添加 --experimental-modules 参数以启用 ES6 模块支持。

 

例如,在满足以上条件的情况下,你可以这样导入和导出模块:


// 导出模块 (module.mjs)
export const myValue = 'Hello, world!';

// 导入模块 (main.mjs)
import { myValue } from './module.mjs';
console.log(myValue);

 

然后运行 main.mjs 文件:

  node main.mjs

 

然而,由于 Node.js 对于原生支持 ES6 模块仍在不断发展和完善中,实际开发中往往还是推荐使用工具进行编译转换。

 

以 .mjs 结尾的文件总是作为 ESM 模块加载,且不受最近的父 package.json 的影响。

同样的,以 .cjs 结尾的文件总是作为 CommonJS 加载,且不受最近的父 package.json 的影响。


Node.js开箱即支持以下情况:

"import" - 当包通过 import 或 import() 加载,或通过 ECMAScript 模块加载器的任何顶层导入或解析操作加载时,该条件就会匹配。无论目标文件的模块格式如何,都适用。 "import" 总是与 "require" 互斥。

"require" - 当包通过 require() 加载时匹配。被引用的文件应该可以用 require() 加载,尽管该条件与目标文件的模块格式无关。预期的格式包括 CommonJS、JSON 和本地插件,但不包括 ES模块,因为 require() 并不支持它们。 "require" 总是与 "import" 互斥。

"node" - 匹配任何 Node.js 环境。可以是 CommonJS 或 ESM 模块文件。这个条件应该总是在 "import" 或 "require" 之后。

"default" - 默认的降级条件。可以是一个 CommonJS 或 ESM 模块文件。这个条件应该总是排在最后。

 

Link: https://www.cnblogs.com/farwish/p/18071700

posted on 2024-03-13 22:24  ercom  阅读(24)  评论(0编辑  收藏  举报