JS中导入JSON模块需用assert { type: "json" }语法,Node.js 17.1+原生支持,文件须为.json后缀;构建工具如Vite默认支持,Webpack 5+需配置;浏览器暂不支持,须用fetch;TypeScript需用支持断言的转译器。

JS 中用导入断言加载 JSON 模块,核心是配合 assert { type: "json" } 语法,并确保运行环境支持(如现代 Node.js 17.1+ 或启用实验性标志的浏览器打包器)。
Node.js 环境中正确导入 JSON
从 Node.js 17.1 开始原生支持 JSON 模块导入断言,但需满足两个条件:文件以 .json 结尾,且使用 assert 显式声明类型。
- 写法示例:
import data from "./config.json" assert { type: "json" }; - 不能省略
assert—— 单纯写import data from "./config.json"在 ESM 下会报错(除非配置了"type": "module"且启用了--experimental-json-modules的旧版本) - 导入结果是解析后的 JavaScript 对象(不是字符串),可直接访问属性,如
data.apiKey
打包工具(如 Vite、Webpack 5+)中的使用
多数现代构建工具已内置支持,无需额外插件,但需确认版本和配置:
- Vite 默认支持,直接写
import pkg from "../package.json" assert { type: "json" };即可 - Webpack 5+ 需开启
experiments.topLevelAwait: true(部分场景需要),且确保resolve.extensions包含".json" - 注意:TypeScript 编译时(
tsc)不处理导入断言,需用esbuild或swc等支持断言的转译器,或在tsconfig.json中设置"moduleResolution": "bundler"
常见错误与绕过方式
如果遇到 Assertion failed: type must be "json" 或 Unsupported import assertion,说明环境不兼容。
- Node.js 低于 17.1?升级或改用
fs.readFileSync(..., "utf8") + JSON.parse() - 想在纯 ESM 浏览器中用?目前主流浏览器(Chrome/Firefox/Safari)暂不支持 JSON 导入断言,必须走
fetch("./data.json").then(r => r.json()) - ESLint 报错?在配置中添加
"parserOptions": { "ecmaVersion": 2022 }并启用importAssertions语言特性
为什么必须用断言而不是自动识别?
ECMAScript 规范要求模块类型必须显式声明,防止 MIME 类型混淆和安全风险。JSON 不是 JS 模块,没有导出语句,因此必须靠 assert { type: "json" } 告诉加载器:“请按 JSON 解析并作为默认导出对象返回”。











