使用 uglifier 缩小 rails 中的 min.js 文件时出错
Error when using uglifier to minify the min.js file in rails
我有一个 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 和本地一样没有丑化
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)
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
将module
和Buffer
都赋给了A
是错误的。我该如何解决这个问题?
我有一些想法:
- 在暂存时禁用
uglifier
。对演出和制作有好处吗?
- 将
pdfmake.min.js
替换为 pdfmake.js
。
- 还有其他想法吗?
根据以往的经验,我发现之前缩小 Javascript 会导致丑化问题。这可能与 uglifier 中的旧错误有关,如果它 运行 多次传递相同的代码,它将失败。
为了获得可靠的结果,请使用未缩小的 pdfmake.js,这样丑化器应该没有问题。
此外,鉴于您的丑化器 gem 版本是 2014 年的(参见 https://github.com/lautis/uglifier/releases?after=v2.5.2 ),您绝对应该考虑升级丑化器 gem 以避免其他问题。
感谢菲尔的回答。我可以确认它是由丑化者引起的,最新的 3.2
将解决这个问题。在这个答案中,我将更深入地研究它。
我创建了一个新的 rails 项目并导入 pdfmake.min.js
,我使用 2.5
的 uglifier
版本也会导致这个问题。我测试了从 2.5
到 3.2
的版本,发现 3.1
解决了问题。
检查从 3.0
到 3.1
的提交,我发现它将 UglifyJS
更新为 2.7
。我还通过将 gem 配置为 git ref
进行了测试,并验证了此更新解决了该问题。
总之,始终更新到最新版本。如果还是没有解决问题,将缩小后的js换成普通的js。
我有一个 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 和本地一样没有丑化
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)
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
将module
和Buffer
都赋给了A
是错误的。我该如何解决这个问题?
我有一些想法:
- 在暂存时禁用
uglifier
。对演出和制作有好处吗? - 将
pdfmake.min.js
替换为pdfmake.js
。 - 还有其他想法吗?
根据以往的经验,我发现之前缩小 Javascript 会导致丑化问题。这可能与 uglifier 中的旧错误有关,如果它 运行 多次传递相同的代码,它将失败。
为了获得可靠的结果,请使用未缩小的 pdfmake.js,这样丑化器应该没有问题。
此外,鉴于您的丑化器 gem 版本是 2014 年的(参见 https://github.com/lautis/uglifier/releases?after=v2.5.2 ),您绝对应该考虑升级丑化器 gem 以避免其他问题。
感谢菲尔的回答。我可以确认它是由丑化者引起的,最新的 3.2
将解决这个问题。在这个答案中,我将更深入地研究它。
我创建了一个新的 rails 项目并导入 pdfmake.min.js
,我使用 2.5
的 uglifier
版本也会导致这个问题。我测试了从 2.5
到 3.2
的版本,发现 3.1
解决了问题。
检查从 3.0
到 3.1
的提交,我发现它将 UglifyJS
更新为 2.7
。我还通过将 gem 配置为 git ref
进行了测试,并验证了此更新解决了该问题。
总之,始终更新到最新版本。如果还是没有解决问题,将缩小后的js换成普通的js。