Rails 7部署AWS EC2时assets:precompile报ExecJS语法错误求助
解决Rails升级Chart.js到4.x后EC2部署assets:precompile报错问题
报错核心原因
Chart.js 4.x版本大量使用ES2020+语法(如空值赋值运算符??=、可选链?.),而旧的Rails资产预编译配置(尤其是Sprockets/Uglifier的默认设置)无法正确解析这类语法,导致Linux环境下Jenkins构建时抛出ExecJS::RuntimeError: SyntaxError: Unexpected token: operator (=)。
针对性解决方案
确认Node.js版本达标
Chart.js 4.x要求Node.js >=16.x,在Jenkins构建脚本中添加验证命令:node -v若版本低于16,重新安装对应版本并确保Jenkins环境变量指向正确的Node路径。
升级并配置Uglifier支持ES2020+
修改config/environments/production.rb的JS压缩配置,明确指定ECMA版本:config.assets.js_compressor = Uglifier.new( harmony: true, ecma: 2020, output: { ascii_only: false } )确保Uglifier gem版本至少为4.2.x(已尝试过可跳过版本检查)。
升级Sprockets到4.x
Sprockets 3.x对ES6+语法支持有限,更新Gemfile:gem 'sprockets', '~> 4.2'执行
bundle update sprockets后重新部署。切换到现代前端构建工具(推荐)
若你的Rails版本>=7,改用jsbundling-rails+esbuild替代传统Sprockets:- 添加Gem依赖:
gem 'jsbundling-rails' - 安装并初始化:
bundle install rails javascript:install:esbuild - 在
app/javascript/application.js中引入Chart.js:import Chart from 'chart.js/auto' window.Chart = Chart // 全局暴露给Rails视图使用 - 修改Jenkins构建脚本,预编译前先执行前端构建:
yarn install yarn build rails assets:precompile
- 添加Gem依赖:
确保Node.js作为ExecJS运行时
在Jenkins构建步骤中明确设置环境变量,避免RubyRacer干扰:export EXECJS_RUNTIME=Node同时移除Gemfile中的
therubyracer依赖。
内容的提问来源于stack exchange,提问作者Mansi Shah
相关产品推荐
相关产品推荐

