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

Ruby on Rails 7.0加载资产时出现SyntaxError: Invalid字符错误

Rails 7.0 资产标签触发 SyntaxError: Invalid character 问题解决

问题描述

在Rails 7.0项目中使用image_tag、stylesheet_link_tag或javascript_include_tag导入资产时,会触发SyntaxError: Invalid character错误,错误指向execjs库中的这段非自定义代码:

begin
  extract_result(@runtime.exec_runtime(filepath), filepath)
ensure
  File.unlink(tmpfile)
end

无论新老资产文件都会出现该问题,示例调用代码:

<%= image_tag('logo', { id: 'standardized-image', draggable: false }) %>

从错误栈能看出,问题根源是react-rails的JSX处理器错误地将图片、CSS这类非JS资产当作JS代码,用babel进行转译,解析二进制内容时触发了字符无效的错误。

解决方案

1. 限定JSX处理器仅处理指定类型文件

修改config/initializers/assets.rb,让react-rails的JSX处理器只针对.jsx文件生效,避免误处理其他类型资产:

Rails.application.config.assets.configure do |env|
  # 注销全局注册的JSX处理器
  env.unregister_processor 'application/javascript', React::JSX::Processor
  # 仅为.jsx文件注册JSX转译处理器
  env.register_mime_type 'text/jsx', extensions: ['.jsx']
  env.register_processor 'text/jsx', React::JSX::Processor
end

2. 升级兼容的gem版本

react-rails 2.6.2版本较旧,和Rails 7.0的sprockets 4.x存在兼容性问题,执行命令升级相关依赖:

bundle update react-rails babel-transpiler

建议将react-rails升级到3.x版本,该版本对Rails 7和sprockets 4的适配更完善。

3. 检查资产管道基础配置

确认config/application.rb中的资产配置正确,确保sprockets能正确识别各类资产的存放路径:

config.assets.enabled = true
config.assets.paths << Rails.root.join('app', 'assets', 'images')
config.assets.paths << Rails.root.join('app', 'assets', 'stylesheets')
config.assets.paths << Rails.root.join('app', 'assets', 'javascripts')

同时保证资产文件放在对应目录下(比如图片存入app/assets/images)。

4. 临时禁用全局JSX转译

如果上述方案暂时无法生效,可以先关闭全局JSX转译,仅在需要转译的.jsx文件顶部手动添加转译指令:

//= require babel-transpiler

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 08:23:14