应设"moduleResolution": "nodeNext",因其支持Node.js原生ESM、package.json#exports字段及现代构建工具(如Vite/Webpack)的解析逻辑,避免使用已废弃的"node"选项。

在 TypeScript 项目中正确配置 moduleResolution 以支持 ES Module(ESM)解析,关键在于匹配你的运行时环境(如 Node.js)和构建工具(如 Vite、Webpack 或 ts-node),并确保 TypeScript 编译器能准确查找 `.ts`/`.js` 文件、处理扩展名、遵循 `package.json#exports` 和 `package.json#types` 等标准行为。
明确目标运行时环境
TypeScript 的 moduleResolution 行为高度依赖 module 和 target 设置,而最终解析逻辑还要看实际执行环境:
- 若你用 Node.js(v12.20+ / v14.13+)原生 ESM(即
type: "module"+.mjs或.jswith"type": "module"),应设"moduleResolution": "node16"或"nodeNext" - 若用打包工具(Vite、esbuild、Rollup),它们通常自带 ESM 解析逻辑,TypeScript 主要用于类型检查,此时
moduleResolution推荐"nodeNext"(更贴近现代 Node 和工具链) - 避免使用已废弃的
"node"(旧版解析规则,不支持exports、imports字段和 ESM/ESM 混合场景)
tsconfig.json 核心配置示例
以下是最常用且兼容性良好的配置(适用于 Node.js ESM 或现代前端构建工具):
{
"compilerOptions": {
"module": "ES2022", // 或 "nodenext"(启用 .mts/.cts 支持)
"target": "ES2020",
"moduleResolution": "nodeNext",
"allowSyntheticDefaultImports": true,
"resolveJsonModule": true,
"esModuleInterop": true, // 兼容 CommonJS 默认导出(如 import React from 'react')
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
}
}注意:"module": "nodenext" 会启用对 .mts/.cts 后缀的支持,并让 import 语句按 ESM 规则解析;但需确保运行时(如 Node)也支持该模式。
Node.js 可靠编程技能。避免事件循环阻塞、异步陷阱、ESM 兼容问题和内存泄漏。触发词:Node.js 开发、async/await、流处理、性能优化、安全编码。
立即学习“Java免费学习笔记(深入)”;
处理常见解析问题
即使配置了 nodeNext,仍可能遇到路径解析失败,可按以下方式排查和修复:
-
导入无后缀文件(如
import foo from './utils'):TypeScript 默认不自动补.ts或.js。确保你有"resolveJsonModule": true(对 JSON),并依赖工具链(如 Vite)或 Node 的完整解析逻辑;TS 本身只做类型检查,不参与运行时加载 -
第三方包类型不识别(如
import * as d3 from 'd3'报错):检查包是否含types字段或index.d.ts;若没有,可安装@types/d3,或在compilerOptions.types中显式声明 -
本地 ESM 包未被正确识别(如
"exports"中定义了"import"字段):nodeNext支持该字段,但要求"module": "nodenext"或"ES2022"以上,且包内package.json必须合法
配合运行时与工具链验证
配置只是第一步,还需端到端验证:
- 用
tsc --noEmit --watch检查类型解析是否报错(如“Cannot find module”) - 在 Node 中运行
node --experimental-specifier-resolution=node --loader ts-node/esm xxx.mts(需 ts-node v10.9+)测试真实加载 - Vite 项目默认启用
esbuild解析,建议保持tsconfig.json中"moduleResolution": "nodeNext",并确保vite.config.ts中esbuild.target与 TStarget对齐

















