From a6c6c1458b4fff9ef3d6974e9b77561095aafe61 Mon Sep 17 00:00:00 2001 From: jingruoyu Date: Thu, 31 May 2018 21:56:36 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0-e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/uglifyjs | 9 ++++++++- lib/ast.js | 21 +++++++++++++++++++++ lib/minify.js | 14 ++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) mode change 100755 => 100644 bin/uglifyjs diff --git a/bin/uglifyjs b/bin/uglifyjs old mode 100755 new mode 100644 index 7617d781..e787586d --- a/bin/uglifyjs +++ b/bin/uglifyjs @@ -47,12 +47,14 @@ program.option("--rename", "Force symbol expansion."); program.option("--no-rename", "Disable symbol expansion."); program.option("--self", "Build UglifyJS as a library (implies --wrap UglifyJS)"); program.option("--source-map [options]", "Enable source map/specify source map options.", parse_js()); -program.option("--timings", "Display operations run time on STDERR.") +program.option("--timings", "Display operations run time on STDERR."); program.option("--toplevel", "Compress and/or mangle variables in toplevel scope."); program.option("--verbose", "Print diagnostic messages."); program.option("--warn", "Print warning messages."); program.option("--wrap ", "Embed everything as a function with “exports” corresponding to “name” globally."); +program.option("-e, --enclose [options]","Embed everything in a big function, with a configurable parameter/argument list.") program.arguments("[files...]").parseArgv(process.argv); + if (program.configFile) { options = JSON.parse(read_file(program.configFile)); } @@ -142,6 +144,11 @@ if (program.verbose) { } else if (program.warn) { options.warnings = true; } +if (program.enclose) { + // 等待完成 + console.log('enclose', program.enclose); + options.enclose = program.enclose; +} if (program.self) { if (program.args.length) { print_error("WARN: Ignoring input files since --self was passed"); diff --git a/lib/ast.js b/lib/ast.js index 331d340b..b0fe4db6 100644 --- a/lib/ast.js +++ b/lib/ast.js @@ -325,6 +325,27 @@ var AST_Toplevel = DEFNODE("Toplevel", "globals", { $propdoc: { globals: "[Object/S] a map of name -> SymbolDef for all undeclared names", }, + wrap_enclose: function(arg_parameter_pairs) { + var self = this; + var args = []; + var parameters = []; + console.log("wrap_enclose") + arg_parameter_pairs.forEach(function(pair) { + var splitAt = pair.lastIndexOf(":"); + + args.push(pair.substr(0, splitAt)); + parameters.push(pair.substr(splitAt + 1)); + }); + + var wrapped_tl = "(function(" + parameters.join(",") + "){ '$ORIG'; })(" + args.join(",") + ")"; + wrapped_tl = parse(wrapped_tl); + wrapped_tl = wrapped_tl.transform(new TreeTransformer(function before(node){ + if (node instanceof AST_Directive && node.value == "$ORIG") { + return MAP.splice(self.body); + } + })); + return wrapped_tl; + }, wrap_commonjs: function(name) { var body = this.body; var wrapped_tl = "(function(exports){'$ORIG';})(typeof " + name + "=='undefined'?(" + name + "={}):" + name + ");"; diff --git a/lib/minify.js b/lib/minify.js index 399b8615..14e5effc 100644 --- a/lib/minify.js +++ b/lib/minify.js @@ -67,6 +67,7 @@ function minify(files, options) { toplevel: false, warnings: false, wrap: false, + enclose: [], }, true); var timings = options.timings && { start: Date.now() @@ -157,6 +158,19 @@ function minify(files, options) { if (options.wrap) { toplevel = toplevel.wrap_commonjs(options.wrap); } + console.log("minify") + console.log(options.enclose) + if (options.enclose != null) { + var arg_parameter_list = options.enclose; + if (arg_parameter_list === true) { + arg_parameter_list = []; + } + else if (!(arg_parameter_list instanceof Array)) { + arg_parameter_list = [arg_parameter_list]; + } + console.log("minify", arg_parameter_list); + toplevel = toplevel.wrap_enclose(arg_parameter_list); + } if (timings) timings.rename = Date.now(); if (options.rename) { toplevel.figure_out_scope(options.mangle);