Next.js 12启用SWC时仅AWS Amplify环境部署失败排查
问题根因
构建失败的核心原因是AWS Amplify默认使用的Amazon Linux 2构建镜像缺少SWC原生二进制运行依赖的libssl.so.1.1(OpenSSL 1.1.x动态链接库),Next.js无法加载原生SWC包时会自动回退到实验性WASM版本SWC,而Amplify构建沙箱对WASM多线程能力存在限制,触发线程池初始化错误、Terser编译崩溃,最终导致构建失败。该问题和项目代码、本地依赖安装逻辑无关,因此本地构建、Vercel部署均可正常运行。
保留SWC能力的解决方案
以下方案均不需要禁用SWC,可完整保留SWC的编译速度与编译特性,按推荐优先级排序:
方案1:通过构建配置安装缺失系统依赖(零代码改动,最稳定)
通过Amplify的构建配置文件在preBuild阶段安装缺失的系统库,让原生SWC包可以正常加载,不需要修改Next.js任何配置。
操作步骤:
- 在项目根目录创建
amplify.yml构建配置文件,写入以下内容:
version: 1 frontend: phases: preBuild: commands: # 安装SWC依赖的OpenSSL 1.1动态库 - yum install -y openssl11 openssl11-devel # 配置动态库软链接 - ln -sf /usr/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1 - ln -sf /usr/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1 - nvm use --lts - npm ci --include=optional build: commands: - npm run build artifacts: baseDirectory: .next files: - '**/*' cache: paths: - node_modules/**/*
- 将配置文件提交到代码仓库,Amplify会自动读取该配置执行构建,构建过程中会直接加载
@next/swc-linux-x64-gnu原生包,不会触发WASM回退。
方案2:切换Amplify构建镜像为Amazon Linux 2023
Amazon Linux 2023镜像默认预装了符合SWC要求的OpenSSL版本,不需要手动安装依赖。
操作步骤:
- 进入Amplify控制台对应应用的「构建设置」页面
- 找到构建镜像配置项,选择
Amazon Linux 2023,保存后重新触发构建即可
方案3:升级Next.js小版本
Next.js 12.3及后续小版本对SWC二进制做了静态链接适配,不再强依赖系统层的libssl.so.1.1,同时修复了WASM版本在受限沙箱环境的线程池初始化bug。如果允许升级版本,直接将package.json中next的版本号从12.2.2修改为^12.3.4,重新执行npm install更新依赖锁文件后提交部署即可。
之前排查操作无效的原因
- 清理依赖重装、强制npm安装:问题出在操作系统层缺失动态库,和npm包安装完整性无关
- 手动将SWC Linux二进制包加入optionalDependencies:包文件虽然安装成功,但缺少系统动态库依赖,二进制依然无法执行
- 关闭
swcMinify、移除compiler配置:只要未通过.babelrc完全禁用SWC,Next.js依然会尝试加载SWC做语法转译,加载失败还是会回退到有问题的WASM版本
注意:新增.babelrc禁用SWC的方案会让构建速度下降3-5倍,同时丢失SWC提供的styled-components编译优化、压缩效率提升等特性,非必要不使用。
内容的提问来源于stack exchange,提问作者rohjs
相关产品推荐
相关产品推荐

