【发布时间】:2017-10-14 04:09:57
【问题描述】:
我正在尝试让 Webpack 在通过 Yarn 运行时缩小我的 Javascript 代码。我相信我已经正确设置了所有内容,但是 Javascript 并没有被缩小。
我已经构建了一个 docker box 来重现这个问题:https://github.com/Danack/ReactTest(这可能在 Windows 上不起作用)
我已经通过手动调用 Uglify.minify() 测试了 Uglify 代码正在缩小测试文件,并且确实如此。
这是我的 Webpack 配置文件:
var webpack = require("webpack");
var path = require("path");
// This is just to test whether uglify is working.
var UglifyJS = require('uglify-js');
var fs = require('fs');
var result = UglifyJS.minify('./src/compress_test.js', {
mangle: true,
compress: {
sequences: true,
dead_code: true,
conditionals: true,
booleans: true,
unused: true,
if_return: true,
join_vars: true,
drop_console: true
}
});
fs.writeFileSync('./uglify_test/manual.min.js', result.code);
module.exports = {
entry: "./src/compress_test.js",
devtool: "source-map",
output: {
path: path.resolve('./uglify_test'),
filename: "[name].js"
},
plugins: [
new webpack.optimize.UglifyJsPlugin({
mangle: true,
compress: {
sequences: true,
dead_code: true,
conditionals: true,
booleans: true,
unused: true,
if_return: true,
join_vars: true,
drop_console: true
}
})
]
};
构建项目webpack -d --colors --watch --config ./webpack.config.js 或npm run dev:build
我设置了一个带有长变量名的简单 Javascript 文件,以便于查看 JS 是否被缩小。
// compress_test.js
function really_long_test_function_name(some_really_long_param_name_1, some_really_long_param_name_2) {
var foo_really_long_var_name_1 = some_really_long_param_name_1 + "asdjpajdpoadpsapodjpasojdpoajpdoaspdpasjd";
var foo_really_long_var_name_2 = some_really_long_param_name_2 + "asdjpajdpoadpsapodjpasojdpoajpdoaspdpasjd";
var foo_really_long_var_name_3 = foo_really_long_var_name_1 + foo_really_long_var_name_2;
var foo_really_long_var_name_4 = foo_really_long_var_name_1 + foo_really_long_var_name_3;
var foo_really_long_var_name_5 = foo_really_long_var_name_1 + foo_really_long_var_name_4;
var foo_really_long_var_name_6 = foo_really_long_var_name_1 + foo_really_long_var_name_5;
var foo_really_long_var_name_7 = foo_really_long_var_name_1 + foo_really_long_var_name_6;
var foo_really_long_var_name_8 = foo_really_long_var_name_1 + foo_really_long_var_name_7;
var foo_really_long_var_name_9 = foo_really_long_var_name_1 + foo_really_long_var_name_8;
return foo_really_long_var_name_9.length;
}
通过手动调用 Uglify 生成的 javascript 被很好地缩小了。
// manual.min.js
function really_long_test_function_name(a,p){var d=a+"asdjpajdpoadpsapodjpasojdpoajpdoaspdpasjd";return(d+(d+(d+(d+(d+(d+(d+(p+"asdjpajdpoadpsapodjpasojdpoajpdoaspdpasjd")))))))).length}
Webpack 内置的 javascript 输出不是:
!function(l){function _(n){if(a[n])return a[n].exports;var o=a[n]={i:n,l:!1,exports:{}};return l[n].call(o.exports,o,o.exports,_),o.l=!0,o.exports}var a={};_.m=l,_.c=a,_.i=function(l){return l},_.d=function(l,a,n){_.o(l,a)||Object.defineProperty(l,a,{configurable:!1,enumerable:!0,get:n})},_.n=function(l){var a=l&&l.__esModule?function(){return l.default}:function(){return l};return _.d(a,"a",a),a},_.o=function(l,_){return Object.prototype.hasOwnProperty.call(l,_)},_.p="",_(_.s=0)}([/*!******************************!*\
!*** ./src/compress_test.js ***!
\******************************/
function(module,exports){eval('\n\nfunction really_long_test_function_name(some_really_long_param_name_1, some_really_long_param_name_2) {\n\n\n var foo_really_long_var_name_1 = some_really_long_param_name_1 + "asdjpajdpoadpsapodjpasojdpoajpdoaspdpasjd";\n var foo_really_long_var_name_2 = some_really_long_param_name_2 + "asdjpajdpoadpsapodjpasojdpoajpdoaspdpasjd";\n\n var foo_really_long_var_name_3 = foo_really_long_var_name_1 + foo_really_long_var_name_2;\n var foo_really_long_var_name_4 = foo_really_long_var_name_1 + foo_really_long_var_name_3;\n var foo_really_long_var_name_5 = foo_really_long_var_name_1 + foo_really_long_var_name_4;\n var foo_really_long_var_name_6 = foo_really_long_var_name_1 + foo_really_long_var_name_5;\n var foo_really_long_var_name_7 = foo_really_long_var_name_1 + foo_really_long_var_name_6;\n var foo_really_long_var_name_8 = foo_really_long_var_name_1 + foo_really_long_var_name_7;\n var foo_really_long_var_name_9 = foo_really_long_var_name_1 + foo_really_long_var_name_8;\n\n\n return foo_really_long_var_name_9.length;\n}\n\n\n\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjoz **** SOURCE_MAPPING_NOT_SHOWN_HERE***')}]);
长变量名仍然存在。
我需要做什么才能让 webpack 真正缩小它输出的 Javascript?
如果重要的话,我使用的是 Yarn 0.23.4 和 Node 7.10.0
【问题讨论】: