如何在不设置type=module的情况下执行含ES6 import的Node脚本
问题描述
在package.json中配置了如下Node执行脚本:
"parse-xlsx": "node ./services/orders-parsing/xlsx-parser executeXlsxParsing ./private/testdata/$FILENAME"
执行FILENAME=unfried-xlsx-2.xlsx npm run parse-xlsx时,运行包含ES6 import语法的脚本文件:
import XlsxParser from "./executeExcelParsing"; const executeXlsxParsing = () => { const xlsxParser = new XlsxParser({ fileName: process.argv.slice(2)[1] }) xlsxParser.executeParsing() } export default executeXlsxParsing;
出现报错:
SyntaxError: Cannot use import statement outside a module
尝试添加--input-type=module参数后仍报相同错误,且因某些原因不想在package.json中设置type=module,需在Node 12.22.1和16.17.0版本下找到强制执行该ES6 import脚本的可行方案。
可行解决方案
方案一:修改脚本文件扩展名为.mjs
Node.js会自动将.mjs后缀的文件识别为ES模块,无需全局设置type=module。
- 将目标脚本文件的扩展名改为
.mjs(比如把xlsx-parser改成xlsx-parser.mjs) - 更新
package.json中的脚本路径:
"parse-xlsx": "node ./services/orders-parsing/xlsx-parser.mjs executeXlsxParsing ./private/testdata/$FILENAME"
- 注意:该文件中导入的其他ES语法模块,要么也改为
.mjs后缀,要么在导入时明确指定扩展名(例如import XlsxParser from "./executeExcelParsing.mjs")。
方案二:结合实验性参数(仅适用于Node 12.22.1)
Node 12.x中ES模块仍处于实验阶段,需同时启用实验性模块支持并指定输入类型:
- 更新
package.json中的脚本:
"parse-xlsx": "node --experimental-modules --input-type=module ./services/orders-parsing/xlsx-parser executeXlsxParsing ./private/testdata/$FILENAME"
- 说明:Node 16.x已移除
--experimental-modules参数,此方案仅适配12.22.1版本。
方案三:使用Babel转译后执行
通过Babel将ES6语法转译为Node.js兼容的CommonJS语法,无需修改文件结构或全局配置:
- 安装Babel依赖:
npm install @babel/core @babel/cli @babel/preset-env --save-dev
- 在项目根目录创建
.babelrc配置文件:
{ "presets": ["@babel/preset-env"] }
- 更新
package.json中的脚本:
"parse-xlsx": "babel-node ./services/orders-parsing/xlsx-parser executeXlsxParsing ./private/testdata/$FILENAME"
- 此方案兼容Node 12.22.1和16.17.0两个版本。
方案四:通过环境变量传递Node参数
利用NODE_OPTIONS环境变量临时指定模块类型参数,无需修改脚本本身:
- Node 16.17.0执行命令:
FILENAME=unfried-xlsx-2.xlsx NODE_OPTIONS="--input-type=module" npm run parse-xlsx
- Node 12.22.1执行命令:
FILENAME=unfried-xlsx-2.xlsx NODE_OPTIONS="--experimental-modules --input-type=module" npm run parse-xlsx
package.json中的脚本保持原配置即可。
内容的提问来源于stack exchange,提问作者Morzanne
相关产品推荐
相关产品推荐

