Rails Asset Pipeline 里,JS 代码注释不能有中文 (会编译报错) 大家都是用啥方案解决的?

1c7 · 2017年09月28日 · 最后由 1c7 回复于 2017年11月15日 · 1884 次阅读

RAILS_ENV=production bundle exec rails assets:precompile

会出错。

花了我大概 20 分钟才定位到原来不是代码错了,只是因为

<%= javascript_include_tag 'application_v2', 'data-turbolinks-track': 'reload' %>

里面有写中文注释。。。

几种方案:

  1. 完全前后端分离,就不用 asset pipeline 了,比如 vue
  2. 就不写中文注释了。都换成英文
  3. 放到 public 目录里,不过带来的问题是缓存问题。不像 pipeline 自动有一个不一样的文件名。
  4. ???

就是想问问大家一般都选什么方案解决?

随手试了一下,中文注释没问题,.js 和.coffee 都可以

nong 回复

whaaaaaat.. 我去试试

23333 任何问题转前后端分离

Rei 回复

哈哈哈是啊

Rei 回复

超彻底的解决方案

我要结束这个帖子了,因为刚刚测试发现 asset pipeline 里有中文又不会报错了。

很奇怪,我记得上次调试的时候明明就是因为中文注释导致的,然后刚刚再去折腾一次又没问题了,反正蛮懵逼的。

1c7 关闭了讨论。 09月28日 11:51
1c7 重新开启了讨论。 09月28日 11:51

算了还是留着,不关了,说不定半年之后谁可能也碰到这样的问题然后在下面接着讨论

遇到过 dotenv 配置中文报错的,有些服务器报,有些不报

pinewong 回复

哈哈哈

huacnlee 关闭了讨论。 09月28日 14:44
1c7 重新开启了讨论。 09月28日 19:03

我又打开讨论了,发现问题是

RAILS_ENV=production bundle exec rails assets:precompile

会有问题。

而楼上刚刚讨论的,平时普通开发的时候,或者跑

bundle exec rails assets:precompile

都不会有问题,只是生产环境编译的时候就会有问题。

1c7 回复

你的生产环境语言变量配置可能有的问题,用 echo $LC_ALL 看一下设置是否是 utf8

lyfi2003 回复

好思路,谢谢!

  1. 用英文写注释
  2. 不写注释

1. 我今天又碰到这个问题了。

RAILS_ENV=production bundle exec rails assets:precompile 会出错。

尝试过这个方法: (在 rails console 里一个个编译,然后看是哪个文件的问题)
https://stackoverflow.com/questions/30422437/execjsprogramerror-unexpected-token-punc-expected-punc-when-running

JS_PATH = "app/assets/javascripts/**/*.js"; 
Dir[JS_PATH].each do |file_name|
  puts "\n#{file_name}"
  puts Uglifier.compile(File.read(file_name))
end

定位到了是哪个文件,但没说问题是哪一行,所以还是无法解决。

2. 这个方法能解决问题:

https://github.com/browserify-rails/browserify-rails/issues/137#issuecomment-179461412
这个是注释掉 config/environments/production.rb 里的 config.assets.js_compressor = :uglifier
当然这个会导致代码没有压缩,保持原样

3. 最后的解决方法

最后没有用 2 的方式解决,
没有去注释掉 config/environments/production.rb 里的 config.assets.js_compressor = :uglifier
看了下是 uglifier 不支持 ES6(当前时间 2017 年 11 月 15 日)
uglifier ES6 相关讨论只看到这一条:https://github.com/lautis/uglifier/issues/116

最后发现问题是

setTimeout(() => {
  jQuery('#app').addClass('event_open');
}, 1000);

我没注意这里 ES6 的语法

改成了:

setTimeout(function(){
  jQuery('#app').addClass('event_open');
}, 1000);

问题解决!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号