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

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

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. ???

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

共收到 14 条回复
96

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

25844
32nong 回复

whaaaaaat.. 我去试试

1

23333 任何问题转前后端分离

25844
1Rei 回复

哈哈哈是啊

25844
1Rei 回复

超彻底的解决方案

25844

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

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

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

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

0967c2

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

25844
0967c2pinewong 回复

哈哈哈

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

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

RAILS_ENV=production bundle exec rails assets:precompile

会有问题。

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

bundle exec rails assets:precompile

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

121
258441c7 回复

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

25844
121lyfi2003 回复

好思路,谢谢!

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

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);

问题解决!

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