Javascript 在rails中使用uglifier缩小min.js文件时出错

Javascript 在rails中使用uglifier缩小min.js文件时出错,javascript,ruby-on-rails,minify,uglifyjs,pdfmake,Javascript,Ruby On Rails,Minify,Uglifyjs,Pdfmake,我有一个rails项目,其中包括一个js插件。我将pdfmake.min.js文件放入assets\javascripts文件夹,并将其添加到application.js: //= require pdfmake.min 在暂存服务器中,我有相关的资产设置: config.serve_static_assets = true config.assets.js_compressor = :uglifier # Do not fallback to assets pipeline

我有一个rails项目,其中包括一个js插件。我将
pdfmake.min.js
文件放入
assets\javascripts
文件夹,并将其添加到
application.js

//= require pdfmake.min
在暂存服务器中,我有相关的资产设置:

  config.serve_static_assets = true

  config.assets.js_compressor = :uglifier

  # Do not fallback to assets pipeline if a precompiled asset is missed.
  config.assets.compile = true

  # Generate digests for assets URLs.
  config.assets.digest = true
但是,我在临时服务器上出错:

ReferenceError: Can't find variable: n
这个错误不在开发环境中,所以我猜它是由js编译引起的。详细说明,使用uglifier时引起的:

相关源代码

function(module, exports, __webpack_require__) {

    /* WEBPACK VAR INJECTION */(function(Buffer) {// Generated by CoffeeScript 1.7.1
    (function() {
      var DecodeStream, iconv;

      try {
        iconv = __webpack_require__(87);
      } catch (_error) {}

      DecodeStream = (function() {
        var key;

        function DecodeStream(buffer) {
          this.buffer = buffer;
          this.pos = 0;
          this.length = this.buffer.length;
        }

        ......

      })();

      module.exports = DecodeStream;

    }).call(this);  
min.js和本地相同,无丑

function(t, e, n) {
        (function(e) {
            (function() {
                var r,
                    i;
                try {
                    i = n(84)
                } catch (t) {}
                r = function() {
                    function t(t) {
                        this.buffer = t, this.pos = 0, this.length = this.buffer.length
                    }
                    var n;
                    ......
                }(), t.exports = r
            }).call(this) 
登台时uglifier之后application.js中的代码

function(A, t, e) {
        (function(A) {
            (function() {
                var t,
                    i;
                try {
                    i = e(84)
                } catch (n) {}
                t = function() {
                    function t(A) {
                        this.buffer = A, this.pos = 0, this.length = this.buffer.length
                    }
                    var e;
                    ......
                }(), n.exports = t
            }).call(this) 
根据上述代码,我们可以发现
uglifier
模块
缓冲区
分配给
A
的方式不正确。我怎样才能解决这个问题

我有一些想法:

  • 在登台时禁用uglifier。它对舞台和制作有好处吗
  • pdfmake.min.js
    替换为
    pdfmake.js
  • 还有其他想法吗

根据以前的经验,我发现以前缩小的Javascript可能会导致一些问题。这可能与uglifier中较老的bug有关,如果在同一代码上运行多次,则会失败

为了获得可靠的结果,请使用未统一的pdfmake.js,以便uglifier不会出现问题


此外,鉴于你的丑化宝石的版本为2014(参见),你应该考虑升级丑化的宝石来避免其他问题。

< P>谢谢Phil的回答。我可以确认这是由丑陋的人引起的,最新的
3.2
将解决这个问题。在这个答案中,我将深入探讨

我创建了一个新的rails项目并导入了
pdfmake.min.js
,我使用的
2.5
版本也会导致这个问题。我测试了从
2.5
3.2
的版本,发现
3.1
解决了这个问题

检查从
3.0
3.1
的提交,我发现它将
UglifyJS
更新为
2.7
。我还通过使用
git ref
配置gem进行了测试,并验证了此更新修复了该问题


总之,请始终更新到最新版本。如果仍然无法解决问题,请将缩小的js替换为普通js。

您使用的是什么版本的uglifier gem?偶尔的bug已经在那里修复了。无论哪种方式,我都会在丑化之前使用普通的pdfmake.js。我过去也遇到过类似的问题,你可能会在这里经历多次缩小。嗨@Phil,我的uglifier gem版本是2.5.0。我也在考虑普通的pdfmake.js.ooh,这听起来有点老了。在Rails 4.2项目中,我正在开发我的丑八怪is 3.2.0,我相信它是最新的。对于我来说,它可以很好地使用大多数非小型JS(一个简单的JS是小型的,看起来很好)。可能值得在您的开发机器上进行一次升级。@Phil实际上,我将缩小的js替换为普通js,现在可以正常工作了。我找不到
uglifier
错误地缩小缩小缩小的js文件的原因,但这可能是一个解决方案。你可以这样回答。我很高兴它对你有用。谢谢你接受我的回答。