diff --git a/build/build.js b/build/build.js index 82d4c52e631..7c67fc924a8 100644 --- a/build/build.js +++ b/build/build.js @@ -3,6 +3,7 @@ const path = require('path') const zlib = require('zlib') const rollup = require('rollup') const uglify = require('uglify-js') +const babel = require('babel-core') if (!fs.existsSync('dist')) { fs.mkdirSync('dist') @@ -40,6 +41,28 @@ function build (builds) { next() } +function minify (code, minifier) { + if (minifier === 'uglify') { + return uglify.minify(code, { + output: { + ascii_only: true + }, + compress: { + pure_funcs: ['makeMap'] + } + }).code + } else if (minifier === 'babel') { + return babel.transform(code, { + babelrc: false, + presets: [['minify', { + mangle: { topLevel: true } + }]] + }).code + } else { + return code + } +} + function buildEntry (config) { const output = config.output const { file, banner } = output @@ -48,14 +71,7 @@ function buildEntry (config) { .then(bundle => bundle.generate(output)) .then(({ code }) => { if (isProd) { - var minified = (banner ? banner + '\n' : '') + uglify.minify(code, { - output: { - ascii_only: true - }, - compress: { - pure_funcs: ['makeMap'] - } - }).code + var minified = (banner ? banner + '\n' : '') + minify(code, config._minifier || 'uglify') return write(file, minified, true) } else { return write(file, code) diff --git a/build/config.js b/build/config.js index d3069765991..e19ec0825b7 100644 --- a/build/config.js +++ b/build/config.js @@ -66,8 +66,8 @@ const builds = { alias: { he: './entity-decoder' }, banner }, - // Runtime+compiler ES modules build (for direct import in browser) - 'web-full-esm-browser': { + // Runtime+compiler ES modules development build (for direct import in browser) + 'web-full-esm-browser-dev': { entry: resolve('web/entry-runtime-with-compiler.js'), dest: resolve('dist/vue.esm.browser.js'), format: 'es', @@ -76,6 +76,17 @@ const builds = { alias: { he: './entity-decoder' }, banner }, + // Runtime+compiler ES modules production build (for direct import in browser) + 'web-full-esm-browser-prod': { + entry: resolve('web/entry-runtime-with-compiler.js'), + dest: resolve('dist/vue.esm.browser.min.js'), + format: 'es', + transpile: false, + minifier: 'babel', + env: 'production', + alias: { he: './entity-decoder' }, + banner + }, // runtime-only build (Browser) 'web-runtime-dev': { entry: resolve('web/entry-runtime.js'), @@ -215,6 +226,11 @@ function genConfig (name) { value: name }) + Object.defineProperty(config, '_minifier', { + enumerable: false, + value: opts.minifier + }) + return config } diff --git a/package.json b/package.json index 3fa5d5adc7e..7318034a70f 100644 --- a/package.json +++ b/package.json @@ -71,6 +71,7 @@ "babel-preset-flow-vue": "^1.0.0", "buble": "^0.16.0", "chalk": "^1.1.3", + "babel-preset-minify": "^0.4.3", "chromedriver": "^2.30.1", "codecov.io": "^0.1.6", "commitizen": "^2.9.6",