我正在使用UglifyJS 2来连接和缩小一堆JavaScript文件(不要太多,大约5到10).此过程使用UglifyJS 2的默认设置从Node.js中运行.
这些文件基本上是Require.js,jQuery,Backbone.js,Backbone.js Marionette,Moment.js以及一些其他(较小的)辅助文件,所有这些都在未压缩(即开发)版本中.
问题是这个过程几乎需要10秒钟.
如果我通过移交完全禁用缩小
{ compress: false }
Run Code Online (Sandbox Code Playgroud)
作为一种选择,它的速度要快得多,但它仍然需要大约2秒钟.
问题1:即使是少量文件,UglifyJS 2通常需要那么长时间吗?或者我最有可能做错了什么?
问题2:如何在不禁用UglifyJS 2的所有有用选项的情况下加快此过程?
当我尝试在下面的线条中使用Grunt uglify js进行uglify和concat时,
余烬数据:'余烬'
丑化失败.如何让uglifyjs跳过检查<< - >>?
grunt配置:
module.exports = function(grunt){
grunt.initConfig({
pkg : grunt.file.readJSON('package.json'),
concat : {
options : {
seperator : ';'
},
dist : {
src : ['js/*.js'],
dest : 'output.min.js'
}
},
uglify : {
options : {
banner : '/*! <%=grunt.template.today("dd-mm-yyyy")%> */\n'
},
dist : {
files : {
'dist/output.min.js' : ['<%= concat.dist.dest%>']
}
}
},
});
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.registerTask('default', ['concat', 'uglify']);
Run Code Online (Sandbox Code Playgroud)
}
我的config.js是
require.config({
baseUrl: 'js',
shim: {
ember: {
deps: ['handlebars', 'jquery'],
exports: …Run Code Online (Sandbox Code Playgroud) 我花了很多时间谷歌搜索,但Grunt生态系统似乎是如此分散,我不熟悉:(.
PS:我已决定使用Grunt,因为在WebStorm 8中有直接集成,但也许其他工具更适合这项任务?
我需要用Node运行几个UglifyJS2脚本.我已经将我想要运行的命令添加到bat文件中,它运行正常.
当我添加第二个命令,如"cd .."时,命令不会执行!很混乱.
cd go somewhere
uglifyjs ..\somescript -o ..\somefile.min.js --source-map ..\somemap.js.map --screw-ie8
cd ..
Run Code Online (Sandbox Code Playgroud)
我希望能够从同一个bat文件中运行几个不同的脚本.
uglifyjs ..\somescript1 -o ..\somefile1.min.js
uglifyjs ..\somescript2 -o ..\somefile2.min.js
uglifyjs ..\somescript3 -o ..\somefile3.min.js
Run Code Online (Sandbox Code Playgroud)
我不确定这是Node,Uglify或预期行为中的问题.
根据文档,UglifyJS可以破坏所有属性名称,除了提供的保留列表上的属性名称.是否可以通过其他方式执行此操作,因此只提供列表中的属性?
如果是这样,我需要传递给哪些选项uglify.minify(files, { ... })?
我想知道是否有人可以提供帮助,我正在尝试完成我的构建过程,目前使用babel转换es6> es5,在完成之后我想使用uglifyJS以仅使用NPM脚本递归缩小所有.js文件(否)请咕噜咕噜地喝.
我想要的;
我目前的设置;
我试过了:https://www.npmjs.com/package/recursive-uglifyjs和https://www.npmjs.com/package/uglifyjs-folder但是这些似乎都无法执行我需要的构建步骤
这是我的package.json脚本部分
"babel": "babel js_uncompiled --out-dir js_uncompiled/es5 --source-maps && npm run npm:uglify",
"build": "npm run babel",
"uglify": "recursive-uglifyjs js_uncompiled/es5"
Run Code Online (Sandbox Code Playgroud)
你可以在这里找到我的完整package.json的链接:http://pastebin.com/4UHZ1SGM
谢谢
我已经尝试将UglifyJSPlugin添加到webpack 4项目中,根据webpack文档,我仍然看到我的包中的死代码甚至注释导致我认为我的uglify插件配置没有被使用.
该文件指出,"为了充分利用树摇,你必须...
-使用ES2015模块语法(即进口和出口).做
-添加一个'副作用’进入到项目的文件的package.json.完成.
-包括支持死代码删除的缩小器(例如UglifyJSPlugin)." DONE
仍然,未使用/未导入的左键盘功能和注释包含在我的包中.
所有的配置都可以在这里看到.根据我看到的结果,我怀疑这与我的webpack配置中的uglify 设置有关.
要重现,请拉回购并运行yarn build
我对ES6 +相对较新(称为现代JavaScript),但似乎如果要在浏览器中使用它,则需要babel- minify或terser。(首先我以为Babili是另一位玩家,但这只是Babel-Minify 的旧名字)
关于用于浏览器的polyfill,可以使用生产就绪的解决方案,例如@ babel / polyfill或Polyfill.io,通过它们,可以将较小的+更快的代码发送给现代浏览器,因为它们不需要/很少需要polyfill(快速测试浏览器,加载动态所需的polyfill,然后启动我们应用的主脚本)。因此,使用这些现代技术似乎绝对合理。
这是我选择babel-minify或的困境terser。
该团队的WebPack 决定开关,以terser在即将举行的WebPack 5
的巴贝尔队取得了比较表显示terser在速度上要好得多。
文档说这terser是uglify-es以前被广泛使用的一个分支。
这些使我认为我必须选择terser。
但是另一方面,转换仍然需要Babel(并且Babel可以用于许多有用的东西)。他们在业务很久以前(虽然Babili/babel-minify是首次发布于2016年8月26日,所以uglify是老年人)。他们在GitHub上有一个很棒的开发人员社区,可能早已发现并修复了错误。基于这些,我对生产安全输出感到更加信任。但是我还没有找到任何有关babel-minifyover 的专业文章terser。
问题:
我会选择,terser因为它看起来很有希望,并且上面已经说明了原因,但是:
babel-minify用完terser?我使用uglifyjs来缩小连接的文件集,这种方法很好但不够好.构建的lib使用名称空间,因此类,函数和常量存储在根名称空间变量中:
(function() {
var root = { api:{}, core:{}, names:{} };
/* util.js file */
root.names.SOME_LONG_NAMED_CONST='Angel';
/* Person.js file */
root.core.Person = function(name) { this.name = name };
/* API.js with the functions we want to expose */
root.api.perform = function(param_for_api) { /* do something */ }
window.lib_name.perform = root.api.perform;
})();
Run Code Online (Sandbox Code Playgroud)
这被缩小为不那么小的版本
(function(){var a={api:{},core:{},names:{}};a.names.SOME_LONG_NAMED_CONST="Angel",a.core.Person=function(a){this.name=a},a.api.perform=function(){},window.lib_name.perform=a.api.perform})();
Run Code Online (Sandbox Code Playgroud)
我理解uglify可能认为root var是一个必须按原样保存并且不能更改的数据结构.有没有办法让uglify破坏根命名空间中的嵌套名称?
在这个项目中,我使用gulp-uglify版本 3.0.1,我想在输出中保留包含许可证文本的注释。
在项目页面上指出
Most of the minify options from the UglifyJS API are supported.
Run Code Online (Sandbox Code Playgroud)
在UglifyJS 自述文件中指出,为了保留许可证文本
You can pass --comments to retain certain comments in the output. By default it will keep JSDoc-style comments that contain "@preserve", "@license" or "@cc_on" (conditional compilation for IE)
Run Code Online (Sandbox Code Playgroud)
所以我尝试了:
.pipe(uglify({
mangle: true,
output: {
beautify: true,
comments: "all"
}
}))
Run Code Online (Sandbox Code Playgroud)
但由于即使指定也"all"不会产生任何许可证归属注释,我假设 minify 选项的comments行为与命令行参数不同--comments。
我也尝试了这里的preserveComments发现,但只会生成:
[13:37:42] …Run Code Online (Sandbox Code Playgroud) uglifyjs ×10
javascript ×5
node.js ×4
uglifyjs2 ×4
webpack ×3
gruntjs ×2
minify ×2
babeljs ×1
batch-file ×1
gulp ×1
gulp-uglify ×1
npm ×1
tree-shaking ×1
web ×1
windows ×1