在 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