【问题标题】:Error when using uglifier to minify the min.js file in rails使用 uglifier 缩小 rails 中的 min.js 文件时出错
【发布时间】:2017-10-16 05:10:40
【问题描述】:

我有一个 rails 项目,其中包括一个 pdfmake 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 和没有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 暂存后的 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) 

根据上面的代码,我们可以发现uglifiermoduleBuffer都赋值给A是错误的。我该如何解决这个问题?

我有一些想法:

  • 在暂存时禁用uglifier。对分期和制作有好处吗?
  • pdfmake.min.js 替换为pdfmake.js
  • 还有其他想法吗?

【问题讨论】:

  • 您使用的是什么版本的 uglifier gem?那里修复了偶尔出现的错误。不管怎样,我都会在丑化之前使用普通的 pdfmake.js。过去我曾在多次缩小时遇到过类似的问题,您可能会在这里遇到。
  • 嗨@Phil,我的丑陋宝石的版本是2.5.0。我也在考虑使用普通的 pdfmake.js。
  • 哦,这对我来说听起来有点老了。在我正在开发的 Rails 4.2 项目中,我的 uglifier 是 3.2.0,我相信它是最新的。它对我来说工作正常,主要是非缩小的 JS(一个简单的被缩小并且看起来很好)。可能值得在你的开发机器上升级一下。
  • @Phil 实际上,我将缩小的 js 替换为普通的,现在可以正常工作了。我找不到 uglifier 错误地缩小缩小的 js 文件的原因,但它可能是一个解决方案。您可以将其作为答案。
  • 我很高兴它对你有用。感谢您接受我的回答。

标签: javascript ruby-on-rails minify uglifyjs pdfmake


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    检查从3.03.1的提交,我发现它更新了UglifyJS2.7。我还通过使用 git ref 配置 gem 进行了测试,并验证此更新解决了问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2015-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      相关资源
      最近更新 更多