Node18+SWC+TS环境导入JSON报ERR_IMPORT_ASSERTION_TYPE_MISSING错误
Node.js 18 + TS + SWC ESM模式下导入JSON文件失败修复
问题背景
项目采用ESM规范,基于TypeScript编写、SWC做编译转译,目标运行环境为Node.js 18,目标编译标准ES2022,核心初始配置如下:
tsconfig.json 核心片段
{ "lib": ["es2022"], "target": "es2022", "module": "nodenext", "moduleResolution": "node", "resolveJsonModule": true }
.swcrc 核心片段
{ "target": "es2022", "module": { "type": "nodenext" } }
启动命令
NODE_ENV=production node --es-module-specifier-resolution=node --experimental-json-modules --no-warnings lib/index.js
故障表现
- 初始配置下直接编译启动,抛出运行时错误:
TypeError [ERR_IMPORT_ASSERTION_TYPE_MISSING]: Module "file:///path/to/data.json" needs an import assertion of type "json"
- 手动给JSON导入语句添加标准导入断言:
import data from './data.json' assert {type: 'json'} console.log(data)
检查SWC编译产物,发现断言部分被完全擦除,输出代码为:
import data from"./data.json";console.log(data); //# sourceMappingURL=index.js.map
- 运行
tsc --emitDeclarationsOnly做类型校验时,最初报错Import assertions are not allowed on statements that transpile to commonjs 'require' calls.,补充tsconfig的include配置为["src/**/*.ts", "src/**/*.json", "types.d.ts"]后该TS报错消失,确认项目未启用CommonJS规范,但SWC编译后依旧丢失导入断言,运行时故障未解决。
修复步骤
- 第一步:补充SWC解析器配置,开启导入断言支持
SWC默认不会解析、保留导入断言语法,需要在.swcrc的jsc.parser配置项中开启对应开关,修正后的核心配置如下:
{ "jsc": { "parser": { "syntax": "typescript", "importAssertions": true }, "target": "es2022" }, "module": { "type": "nodenext" } }
- 第二步:升级SWC到兼容版本
如果本地使用的@swc/core版本低于1.3.40,先升级到1.3.40以上版本,该版本前存在nodenext模块模式下导入断言被错误擦除的已知bug。 - 第三步:简化启动命令
Node.js 18中JSON ESM导入已经是稳定特性,不需要再加--experimental-json-modules实验参数,启动命令可调整为:
"start": "NODE_ENV=production node --es-module-specifier-resolution=node --no-warnings lib/index.js"
完成以上配置后重新编译,产物中会正确保留assert {type: 'json'}断言语句,运行时即可正常导入JSON文件。
注意:不要随意修改
module和moduleResolution配置为bundler或commonjs,nodenext模式下TS的校验规则和Node.js原生ESM运行时的要求完全对齐,能避免后续出现其他模块导入兼容问题。
内容的提问来源于stack exchange,提问作者user16435030
相关产品推荐
相关产品推荐

