You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不设置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语法,无需修改文件结构或全局配置:

  1. 安装Babel依赖:
npm install @babel/core @babel/cli @babel/preset-env --save-dev
  1. 在项目根目录创建.babelrc配置文件:
{
  "presets": ["@babel/preset-env"]
}
  1. 更新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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 15:09:24