React应用部署AWS遇PM2启动错误:Unexpected token import
解决PM2启动React应用时SyntaxError: Unexpected token import报错
这问题我之前帮朋友排查过,核心原因是Node.js默认无法识别你distServer.js里的ES6 import语法,导致运行时报错。咱们一步步来解决:
1. 先确认Node.js版本
较旧的Node.js版本对ES模块(import/export)支持有限,建议升级到v14及以上的LTS版本。你可以在EC2实例上运行以下命令查看当前版本:
node -v
如果版本过低,用nvm(Node版本管理器)升级会更方便:
# 安装nvm(如果没装的话) curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash # 重新加载终端后,安装最新LTS版本 nvm install --lts # 设置为默认版本 nvm alias default node
2. 给Node.js配置ES模块支持
有两种方式让Node.js识别import语法:
方式一:修改文件后缀为.mjs
把你的distServer.js重命名为distServer.mjs,然后修改ecosystem.config.js里的脚本路径:
module.exports = { apps : [{ name: 'your-react-app', script: './distServer.mjs', // 这里改成.mjs后缀的文件 // 其他配置... }] }
方式二:在package.json中声明模块类型
在项目根目录的package.json里添加"type": "module"字段,这样Node.js会把所有.js文件当作ES模块处理:
{ "name": "your-react-app", "version": "1.0.0", "type": "module", // 新增这一行 // 其他配置... }
⚠️ 注意:如果你的项目里同时存在CommonJS语法(比如require),需要一并改成ES模块的写法,否则会报错。
3. 改用CommonJS语法(无需修改模块配置)
如果不想调整模块系统,可以直接把distServer.js里的ES6语法改成Node.js原生支持的CommonJS写法:
// 把 import browserSync from 'browser-sync'; 改成: const browserSync = require('browser-sync'); // 如果有export语法,比如 export default xxx; 改成: module.exports = xxx;
额外提醒:生产环境部署的最佳实践
你是部署生产环境,其实更推荐用Nginx来托管React打包后的静态文件,而不是用browserSync(它主要是开发环境用来热重载的工具)。如果你的项目已经执行了npm run build生成了build目录,可以用Nginx反向代理,或者用serve包来启动静态服务:
# 全局安装serve npm install -g serve # 用pm2启动serve服务托管build目录 pm2 start serve --name "react-prod" -- -s build
内容的提问来源于stack exchange,提问作者serj
相关产品推荐
相关产品推荐

