2017-10-16 73 views
1

我有一个rails项目,其中包含一个pdfmake js插件。我把pdfmake.min.js文件中的assets\javascripts文件夹并将其添加到application.js使用uglifier来缩小rails中的min.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编译引起的。

相关源代码

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和在本地同一而不应用uglifier

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引起。 js在uglifier之后升级

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错误地指定moduleBufferA。我怎样才能解决这个问题?

我有一些想法:

  • 上分期禁用uglifier。对舞台和制作有好处吗?
  • pdfmake.min.js替换为pdfmake.js
  • 还有其他想法吗?
+0

你使用的是什么版本的uglifier gem?偶尔的错误已经修复了。无论哪种方式,但我会在uglification之前使用plain pdfmake.js。过去我曾经遇到过类似的问题,你可能会在这里经历多次缩小比赛。 – Phil

+0

Hi @Phil,我的uglifier gem的版本是2.5.0。我也在考虑纯pdfmake.js。 – Stephen

+0

哦,这听起来有点老。在Rails 4.2项目中,我正在研究我的uglifier是3.2.0,我相信这是最新的。它对我来说工作正常,主要是未缩小的JS(一个简单的缩小,看起来很好)。可能值得在开发机器上进行镜头升级以查看。 – Phil

回答

1

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

为了获得可靠的结果,请使用unminified pdfmake.js,这样uglifier应该没有问题。

此外,考虑到您的uglifier gem版本是从2014年开始的(请参阅https://github.com/lautis/uglifier/releases?after=v2.5.2),您应该考虑升级uglifier gem以避免其他问题。

1

感谢菲尔的回答。我可以确认它是由uglifier和最新的3.2引起的将解决这个问题。在这个答案中,我会深入挖掘它。

我创建了一个新的Rails项目和进口pdfmake.min.jsuglifier版本我用2.5这也将导致问题。我测试了从2.53.2的版本,发现3.1修复了这个问题。我发现它将UglifyJS更新为2.7。我还通过配置gem与git ref进行了测试,并验证了此更新解决了此问题。

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