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

package.json设type:module后,TypeScript+Webpack+NestJS编译失败

解决NestJS构建时的模块解析与顶层await问题

问题1:无法解析带.js后缀的模块

原因

TypeScript编译阶段处理的是.ts源文件,手动添加.js后缀后,TypeScript会去寻找编译前还未生成的.js文件,导致解析失败。虽然ES模块要求导入必须带后缀,但TypeScript在特定模块解析模式下会自动处理后缀映射。

解决步骤

  1. 修改tsconfig.json的模块解析模式:
    {
      "compilerOptions": {
        "moduleResolution": "node16", // 或 "nodenext"
        "module": "ESNext",
        "target": "ES2022"
      }
    }
    
  2. 移除.ts文件中导入语句的.js后缀,还原为:
    import { AppModule } from './app.module';
    
    node16/nodenext模式下,TypeScript编译时会自动为生成的.js文件添加正确的.js后缀。

问题2:顶层await实验未启用

原因

要么是Webpack配置未被NestJS正确加载,要么是TypeScript的目标版本过低(ES2017不支持原生顶层await,需依赖实验性语法)。

解决步骤

  1. 升级TypeScript目标版本到ES2022(原生支持顶层await,无需实验性标记),在tsconfig.json中设置:
    {
      "compilerOptions": {
        "target": "ES2022"
      }
    }
    
  2. 确保Webpack配置正确合并NestJS默认配置并启用topLevelAwait:
    const defaultWebpackConfig = require('@nestjs/cli/lib/compiler/defaults/webpack.config');
    
    module.exports = (options) => {
      const config = defaultWebpackConfig(options);
      config.experiments = {
        ...config.experiments,
        topLevelAwait: true,
      };
      return config;
    };
    
  3. 验证nest-cli.json已指定使用自定义Webpack配置:
    {
      "$schema": "https://json.schemastore.org/nest-cli",
      "compilerOptions": {
        "webpack": true,
        "webpackConfigPath": "./webpack.config.js"
      }
    }
    

额外验证步骤

  • 执行nest build前,删除dist目录,避免缓存影响。
  • 确认package.json中的"type": "module"保留,确保最终输出为ES模块。

内容的提问来源于stack exchange,提问作者Tal Rofe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 07:05:24