【node:19212】 解决 Node.js 报错 “将文件视为 CommonJS 模块”
当在 Node.js 中运行 JavaScript 文件时,可能会遇到类似以下的报错信息:
(node:19212) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
D:\my_dev\frontend\svelte\demo1\svelte-demo\src\test\test.js:1
import handleHashChange from "./test-module/test1";
^^^^^^SyntaxError: Cannot use import statement outside a module
这个报错表明 Node.js 在处理 JavaScript 文件时遇到了 import
语句,但未将文件视为 ES 模块。下面是解决这个问题的几种方法。
方式一
1. 设置 “type”: “module”:
在项目的 package.json
文件中添加 "type": "module"
字段,告诉 Node.js 该项目使用 ES 模块。
{"type": "module",...
}
这样做后,Node.js 将会将所有 .js
文件视为 ES 模块。
2. 使用 .mjs 扩展名:
将文件的扩展名从 .js
改为 .mjs
,这样 Node.js 将会将文件视为 ES 模块。
mv ./src/test/test.js ./src/test/test.mjs
这样做后,Node.js 将会自动将文件视为 ES 模块。
3. 使用 --experimental-modules 标志:
在运行 Node.js 时,使用 --experimental-modules
标志启用 ES 模块支持。
node --experimental-modules ./src/test/test.js
这样做后,Node.js 将会将文件视为 ES 模块。
方式二
1. 在顶部添加 require 语句:
在文件顶部添加一个 require
语句,将 import
语句转换为 CommonJS 的 require
语法。
const handleHashChange = require("./test-module/test1").default;
这样做后,Node.js 将会将文件视为 CommonJS 模块。
2. 使用 Babel 转换:
使用 Babel 将 ES 模块转换为 CommonJS 模块,然后在 Node.js 中运行。
- 安装 Babel 相关的依赖:
npm install @babel/core @babel/cli @babel/preset-env --save-dev
- 创建
.babelrc
文件来配置 Babel:
{"presets": ["@babel/preset-env"]
}
- 使用 Babel 转换代码:
npx babel ./src/test/test.js --out-file ./dist/test.js
- 在 Node.js 中运行转换后的代码:
node ./dist/test.js
以上是两种常见的解决方案,你可以根据自己的需求选择其中一种。每种方法都有其优缺点,你可以根据项目的具体情况选择最适合的方法。