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

如何解决Node.js/TS项目中chalk导入及ERR_UNSUPPORTED_DIR_IMPORT错误?

解决方案:全量迁移ES模块,解决chalk兼容与目录导入/别名问题

1. 调整TypeScript编译配置

把tsconfig.json改成完全适配ESM的配置,确保编译输出符合Node.js的ESM规则:

{
  "compilerOptions": {
    "module": "ESNext", // 采用最新ESM标准,比ES6更贴合Node.js特性
    "moduleResolution": "NodeNext", // 让TS按照Node.js的ESM逻辑解析模块
    "target": "ES2020", // 对应你使用的Node.js版本,比如Node14+选这个就没问题
    "outDir": "./host",
    "baseUrl": ".",
    "paths": {
      "~/*": ["./*"] // 保留原有的别名配置
    },
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true, // 兼容chalk这类默认导入的ESM包
    "strict": true
  },
  "include": ["**/*.ts"] // 根据你的源码目录调整,比如src/**/*.ts
}

2. 解决目录导入不支持的问题

Node.js的ESM不允许直接导入目录(比如import api from '~/api'),两种解决办法任选其一:

  • 直接指定入口文件:把导入语句改成import api from '~/api/index.js'(TS里写.ts也可以,编译后会自动转成.js)
  • 给目录添加package.json:在每个需要直接导入的目录(比如api)下新建package.json,内容如下:
{
  "main": "./index.js",
  "type": "module"
}

这样就能继续用import api from '~/api'的写法。

3. 适配别名的ESM编译

原来的tsc-alias在ESM模式下要确保是最新版本,编译命令保持tsc && tsc-alias,它会自动把编译后JS里的~/*替换成正确的相对路径。如果不想依赖第三方工具,更推荐用Node.js原生的子路径导入:

  • 在项目根目录的package.json中添加:
"imports": {
  "#api/*": "./api/*",
  "#utils/*": "./utils/*" // 按你的别名需求添加对应配置
}
  • 把TS里的~前缀替换成#api这类标识,比如import api from '#api',同时更新tsconfig.json的paths:
"paths": {
  "#api/*": ["./api/*"]
}

这种方式不需要tsc-alias,Node.js直接就能解析,更符合ESM原生规范。

4. 确认package.json的ESM配置

确保根目录package.json包含"type": "module",如果项目里还有遗留的CommonJS文件,把它们重命名为.cjs后缀即可:

{
  "type": "module",
  // 其他依赖、脚本配置...
}

5. 测试验证

执行tsc && tsc-alias(如果用子路径导入就只需要tsc),然后运行node host/build.js,检查chalk是否正常工作,有没有导入错误。如果还有问题,优先检查:

  • 所有相对导入是否加了.js扩展名(ESM强制要求,比如import './utils.js',TS里写.ts编译后会自动转换)
  • 编译后的JS文件里的别名是否被正确替换成了相对路径

内容的提问来源于stack exchange,提问作者Lance Pollard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 17:00:11