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

NestJS应用Docker容器化时使用SWC编译构建出现Unexpected token 'export'错误求助

NestJS应用Docker容器化时使用SWC编译构建出现Unexpected token 'export'错误求助

看起来你遇到的问题是Docker容器里Node.js尝试加载rxjs的ES模块文件时,用了CommonJS的加载机制,导致抛出Unexpected token 'export'错误。我帮你分析几个核心原因和对应的解决办法:

  • 首要问题:直接复制本地node_modules到容器
    你Dockerfile里直接COPY了本地的node_modules,这是踩了容器化的典型坑!本地环境(比如Windows/macOS)安装的依赖,尤其是像SWC这种带平台特定二进制文件的工具,和Alpine Linux容器的环境完全不兼容。而且本地的依赖可能混着开发环境的包,和容器的构建环境不匹配。
    解决办法很简单:删掉COPY node_modules ./这一行,取消注释RUN npm ci,让容器自己安装适配Alpine环境的依赖:

    FROM node:18.19.1-alpine
    
    ENV NODE_ENV build
    
    USER node
    WORKDIR /home/node
    
    COPY package*.json ./
    RUN npm ci  # 取消注释这行,移除COPY node_modules的代码
    
    COPY --chown=node:node . .
    CMD npx prisma generate \
        && npm run build \
        && node dist/main
    
  • 检查SWC配置是否正确处理模块类型
    确保你的.swcrc配置和Node.js 18的版本兼容,比如把编译后的模块类型设为commonjs(如果项目是CommonJS风格),同时target匹配Node.js 18支持的版本:

    {
      "jsc": {
        "parser": {
          "syntax": "typescript",
          "decorators": true
        },
        "transform": {
          "legacyDecorator": true,
          "decoratorMetadata": true
        },
        "target": "es2022"
      },
      "module": {
        "type": "commonjs"
      }
    }
    

    如果你的项目用的是ESM(package.json里有"type": "module"),那把module.type改成es6,保证编译后的文件是ESM格式,让Node.js能正确加载。

  • 验证package.json的模块类型设置
    如果你的package.json里加了"type": "module",Node.js会默认把所有.js文件当成ESM加载,但如果SWC编译出来的是CommonJS格式,就会出现加载冲突。这时候要么调整SWC的module配置为ESM格式,要么移除"type": "module"(如果项目本身是CommonJS的话)。

备注:内容来源于stack exchange,提问作者Mohammad ARZ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 11:58:02