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

