const PLATFORM_MACROS = ['CC_EDITOR', 'CC_PREVIEW', 'CC_BUILD', 'CC_TEST']; const FLAGS = ['jsb', 'runtime', 'wechatgame', 'wechatgameSub','baidugame', 'qqplay', 'debug', 'nativeRenderer', 'qqgame']; // generate macros for uglify's global_defs // available platforms: 'editor' | 'preview' | 'build' | 'test' // available keys of flags: 'jsb' | 'runtime' | 'wechatgame' | 'qqplay' | 'debug' | 'nativeRenderer' exports.getMacros = function (platform, flags) { // platform macros var platformMacro = 'CC_' + platform.toUpperCase(); if (PLATFORM_MACROS.indexOf(platformMacro) === -1) { throw new Error('Unknown platform: ' + platform); } var res = {}; for (let i = 0; i < PLATFORM_MACROS.length; i++) { let macro = PLATFORM_MACROS[i]; res[macro] = (macro === platformMacro); } // flag macros if (flags) { for (let flag in flags) { if (flags.hasOwnProperty(flag) && flags[flag]) { if (FLAGS.indexOf(flag) === -1) { throw new Error('Unknown flag: ' + flag); } } } } for (let i = 0; i < FLAGS.length; i++) { let flag = FLAGS[i]; let macro = 'CC_' + flag.toUpperCase(); res[macro] = !!(flags && flags[flag]); } // debug macros res['CC_DEV'] = res['CC_EDITOR'] || res['CC_PREVIEW'] || res['CC_TEST']; res['CC_DEBUG'] = res['CC_DEBUG'] || res['CC_DEV']; res['CC_SUPPORT_JIT'] = !(res['CC_BAIDUGAME'] || res['CC_WECHATGAME'] || res['CC_QQPLAY'] || res['CC_RUNTIME']); return res; }; // see https://github.com/mishoo/UglifyJS2/tree/harmony#compress-options exports.getUglifyOptions = function (platform, flags) { var global_defs = exports.getMacros(platform, flags); var releaseMode = !global_defs['CC_DEBUG']; var optimizeForJSC = releaseMode && global_defs['CC_JSB']; if (optimizeForJSC) { return { parse: { bare_returns: true }, toplevel: false, compress: { global_defs: global_defs, negate_iife: false, sequences: false, keep_infinity: true, // reduce jsc file size typeofs: false, inline: 1, // workaround mishoo/UglifyJS2#2842 }, output: { beautify: true, // really preserve_lines indent_level: 0, // reduce jsc file size } }; } if (releaseMode) { return { parse: { bare_returns: true }, toplevel: false, compress: { global_defs: global_defs, negate_iife: false, inline: 1, // workaround mishoo/UglifyJS2#2842 }, output: { ascii_only: true, } }; } else { return { parse: { bare_returns: true }, toplevel: false, compress: { global_defs: global_defs, negate_iife: false, sequences: false, // join consecutive statements with the “comma operator” properties: false, // optimize property access: a["foo"] → a.foo // dead_code: true, // discard unreachable code drop_debugger: false, // discard “debugger” statements // ecma: 5, // transform ES5 code into smaller ES6+ equivalent forms // evaluate: true, // evaluate constant expressions unsafe: false, // some unsafe optimizations (see below) // computed_props: true, // conditionals: false, // optimize if-s and conditional expressions comparisons: false, // optimize comparisons booleans: false, // optimize boolean expressions typeofs: false, // Transforms typeof foo == "undefined" into foo === void 0. Note: recommend to set this value to false for IE10 and earlier versions due to known issues. loops: false, // optimize loops unused: false, // drop unused variables/functions hoist_funs: false, // hoist function declarations hoist_props: false, hoist_vars: false, // hoist variable declarations if_return: false, // optimize if-s followed by return/continue inline: false, // embed simple functions join_vars: false, // join var declarations collapse_vars: false, // Collapse single-use non-constant variables - side effects permitting. reduce_funcs: false, reduce_vars: false, // Improve optimization on variables assigned with and used as constant values. //warnings: true, pure_getters: false, pure_funcs: null, drop_console: false, // expression: false, // Pass true to preserve completion values from terminal statements without return, e.g. in bookmarklets. keep_fargs: true, keep_fnames: true, keep_infinity: true, // Pass true to prevent Infinity from being compressed into 1/0, which may cause performance issues on Chrome. side_effects: false, // drop side-effect-free statements }, mangle: false, //preserveComments: 'all', output: { // http://lisperator.net/uglifyjs/codegen beautify: true, indent_level: 2, ascii_only: true, }, }; } }; exports.uglify = function (platform, isJSB, isDebugBuild) { const Composer = require('gulp-uglify/composer'); const Uglify = require('uglify-es'); const minify = Composer(Uglify); return minify(exports.getUglifyOptions(platform, isJSB, isDebugBuild)); };