2017-10-16 76 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。