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

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:

    1. 添加Gem依赖:
      gem 'jsbundling-rails'
      
    2. 安装并初始化:
      bundle install
      rails javascript:install:esbuild
      
    3. 在app/javascript/application.js中引入Chart.js:
      import Chart from 'chart.js/auto'
      window.Chart = Chart // 全局暴露给Rails视图使用
      
    4. 修改Jenkins构建脚本,预编译前先执行前端构建:
      yarn install
      yarn build
      rails assets:precompile
      
  • 确保Node.js作为ExecJS运行时
    在Jenkins构建步骤中明确设置环境变量,避免RubyRacer干扰:

    export EXECJS_RUNTIME=Node
    

    同时移除Gemfile中的therubyracer依赖。

内容的提问来源于stack exchange,提问作者Mansi Shah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 11:49:49