[英]ExecJS::ProgramError: Unexpected character '#' when trying to precompile assets for production
[英]ExecJS::ProgramError: Unexpected token punc «(», expected punc «:» when running rake assets:precompile on production
部署 Rails 应用程序时,出现以下错误:
rake aborted!
ExecJS::ProgramError: Unexpected token punc «(», expected punc «:» (line: 15, col: 14, pos: 265)
Error
at new JS_Parse_Error (/tmp/execjs20150524-4411-1p45n63js:2359:10623)
at js_error (/tmp/execjs20150524-4411-1p45n63js:2359:10842)
at croak (/tmp/execjs20150524-4411-1p45n63js:2359:19086)
at token_error (/tmp/execjs20150524-4411-1p45n63js:2359:19223)
at expect_token (/tmp/execjs20150524-4411-1p45n63js:2359:19446)
at expect (/tmp/execjs20150524-4411-1p45n63js:2359:19584)
at /tmp/execjs20150524-4411-1p45n63js:2359:28513
at /tmp/execjs20150524-4411-1p45n63js:2359:19957
at expr_atom (/tmp/execjs20150524-4411-1p45n63js:2359:27269)
at maybe_unary (/tmp/execjs20150524-4411-1p45n63js:2359:30019)new JS_Parse_Error ((execjs):2359:10623)
js_error ((execjs):2359:10842)
croak ((execjs):2359:19086)
token_error ((execjs):2359:19223)
expect_token ((execjs):2359:19446)
expect ((execjs):2359:19584)
(execjs):2359:28513
(execjs):2359:19957
expr_atom ((execjs):2359:27269)
maybe_unary ((execjs):2359:30019)
有问题的文件是有效的,它适用于本地主机。 我还尝试在本地主机上运行rake assests:precompile
,一切都通过了。 最后,我尝试从文件中删除内容, git push 并重新部署 - 仍然出现相同的错误。 只有完全删除文件并重新部署才有帮助。
将不胜感激任何想法。
运行 rails 控制台并:
JS_PATH = "app/assets/javascripts/**/*.js";
Dir[JS_PATH].each do |file_name|
puts "\n#{file_name}"
puts Uglifier.compile(File.read(file_name), harmony: true)
end
它将向您显示 Uglifier 产生问题的文件和行。
我怀疑,在那个 js 文件中,你有如下内容:
var User = {
getName() {
alert("my name");
}
}
用正确的格式替换它,
var User = {
getName: function() {
alert("my name");
}
}
为我工作。
错误清楚地表明,它期待“:”但它找到了“(”。
刚遇到同样的问题。
我的情况是有人使用了自 ES2015 以来仅支持的语法,例如
function someThing(param = true) {
// do something here
};
虽然这在我们的环境中不受支持。
而错误信息实际上是由 Uglifer 生成的。
我不确定您的构建链,但我是通过将相同的错误消息粘贴到 Google 来实现的。
这在 ES2015 中称为“速记属性”。 我正在将 Babel 6 与 Gulp 一起使用,并且需要执行npm install babel-plugin-transform-es2015-shorthand-properties --save-dev
并将该转换添加到我的 babel 插件中。
.pipe(babel({
plugins: [
'transform-es2015-shorthand-properties'
]
}))
我可以使用https://skalman.github.io/UglifyJS-online/来确定问题所在的正确行号。 值得庆幸的是,至少有问题的正确文件被 grunt uglify 指出
如果 Radovan 的答案由于库中的问题而不是您的代码而对您不起作用,您可以尝试升级 Uglifier 并启用 ES6 编译。
Gemfile.lock
gem 'uglifier', '~> 4.1'
配置/环境/production.rb
config.assets.js_compressor = Uglifier.new(harmony: true)
2019 年 12 月回答:从 4.2.0 版(2019 年 9 月发布)开始,Uglifier 现在显示漂亮的(彩色!)调试输出,向您显示有问题的代码行。
我遇到了Uglifier::Error: Unexpected character '
'` 错误,即使按照此页面中的所有其他解决方案我也找不到它。
因此,转到您的 Gemfile,并将您的 Uglifier 设置为至少 4.2:
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 4.2'
运行bundle update uglifier
来更新它。
然后只需查看输出,它会显示如下内容:
就我而言,函数定义有问题,例如,
function someFunctionName(param1, param2=defaultValue){
//code
}
由于上述函数定义,我收到错误消息,因为 Uglifier 不支持它。 默认参数是 ES6/ES2015 语言规范。
对于上述问题的解决方案,您可以参考为 JavaScript 函数设置默认参数值
由于回溯不提供有关损坏文件的信息,对我来说,识别错误的最佳方法是使用git bisect。
它允许您找到引入错误的提交。
假设你在 master 上,首先你启动 git bisect:
$ git bisect start
$ git bisect bad
然后你回到以前的工作修订版,假设是 20 年前的修订版。
$ git checkout HEAD~20
你运行相同的命令
$ RAILS_ENV=production rake assets:precompile
如果它有效,您将修订标记为良好:
$ git bisect good.
git 将跳转到另一个修订版,您再次运行相同的命令 (assets:precompile) 并根据输出将其标记为好/坏。
在不到 1 分钟的时间内,您应该能够找到导致该问题的提交。
将uglifier gem 更新到最新版本并更新您的 production.rb
config.assets.js_compressor = Uglifier.new(harmony: true)
如果您正在维护一个遗留项目(使用 ruby 非常旧的版本,例如 1.9.3 和 Rails 3.2.x),我建议您不要使用 uglifier&exec-js,只需从config/environments/production.rb
注释掉这行代码:
config.assets.compress = true
还要确保您安装了nodejs
作为 js 运行时。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.