Skip to content
This repository has been archived by the owner on Dec 1, 2020. It is now read-only.

Commit

Permalink
👕 refactor: update build command
Browse files Browse the repository at this point in the history
  • Loading branch information
kazupon committed Jan 9, 2019
1 parent 401ae4f commit 7913ae9
Show file tree
Hide file tree
Showing 4 changed files with 169 additions and 163 deletions.
7 changes: 7 additions & 0 deletions banner.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
module.exports = ({ name, version, year, author, license }) => {
return '/*!\n' +
` * ${name} v${version} \n` +
` * (c) ${year} ${author}\n` +
` * Released under the ${license} License.\n` +
' */'
}
66 changes: 66 additions & 0 deletions bundle.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
const fs = require('fs')
const path = require('path')
const zlib = require('zlib')
const uglify = require('uglify-js')
const chalk = require('chalk')
const rollup = require('rollup')
const { error, info } = require('@vue/cli-shared-utils')

const getSize = code => (code.length / 1024).toFixed(2) + 'kb'

function bundle (entries) {
let built = 0
const total = entries.length
const next = () => {
bundleEntry(entries[built]).then(() => {
built++
if (built < total) {
next()
}
}).catch(error)
}
next()
}

function bundleEntry (config) {
const output = config.output
const { file, banner } = output
const isProd = /min\.js$/.test(file)
return rollup.rollup(config)
.then(bundle => bundle.generate(output))
.then(({ code }) => {
if (isProd) {
const minified = (banner ? banner + '\n' : '') + uglify.minify(code, {
fromString: true,
output: { ascii_only: true },
compress: { pure_funcs: ['makeMap'] }
}).code
return write(file, minified, true)
} else {
return write(file, code)
}
})
}

function write (dest, code, zip) {
return new Promise((resolve, reject) => {
const report = extra => {
info(chalk.blue.bold(path.relative(process.cwd(), dest) + ' ' + getSize(code) + (extra || '')))
resolve()
}

fs.writeFile(dest, code, err => {
if (err) { return reject(err) }
if (zip) {
zlib.gzip(code, (err, zipped) => {
if (err) { return reject(err) }
report(' (gzipped: ' + getSize(zipped) + ')')
})
} else {
report()
}
})
})
}

module.exports = bundle
80 changes: 80 additions & 0 deletions entry.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
const path = require('path')
const babel = require('rollup-plugin-babel')
const cjs = require('rollup-plugin-commonjs')
const node = require('rollup-plugin-node-resolve')
const replace = require('rollup-plugin-replace')

const classifyRE = /(?:^|[-_\/])(\w)/g
const toUppser = (_, c) => c ? c.toUpperCase() : ''
const classify = str => str.replace(classifyRE, toUppser)

function makeEntries (entryPath, destPath, moduleName, packageName, banner) {
const resolve = _path => path.resolve(destPath, _path)
return {
commonjs: {
entry: resolve(entryPath),
dest: resolve(`dist/${packageName}.common.js`),
format: 'cjs',
banner
},
esm: {
entry: resolve(entryPath),
dest: resolve(`dist/${packageName}.esm.js`),
format: 'es',
banner
},
production: {
entry: resolve(entryPath),
dest: resolve(`dist/${packageName}.umd.min.js`),
format: 'umd',
env: 'production',
moduleName,
banner
},
development: {
entry: resolve(entryPath),
dest: resolve(`dist/${packageName}.umd.js`),
format: 'umd',
env: 'development',
moduleName,
banner
}
}
}

function genConfig (options, moduleName, version) {
const config = {
input: options.entry,
output: {
file: options.dest,
name: moduleName,
format: options.format,
banner: options.banner,
sourcemap: true,
},
plugins: [
babel({
extensions: ['.js', '.jsx', '.ts', '.tsx', '.es6', '.es', '.mjs'],
runtimeHelpers: true,
}),
node(),
cjs()
]
}

const replacePluginOptions = { '__VERSION__': version }
if (options.env) {
replacePluginOptions['process.env.NODE_ENV'] = JSON.stringify(options.env)
}
config.plugins.push(replace(replacePluginOptions))

return config
}

function getAllEntries ({ name, version }, { entry, dest }, banner) {
const moduleName = classify(name)
const entries = makeEntries(entry, dest, moduleName, name, banner)
return Object.keys(entries).map(name => genConfig(entries[name], moduleName, version))
}

module.exports = getAllEntries
179 changes: 16 additions & 163 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,175 +9,28 @@ module.exports = (api, options) => {
options: {
}
}, async args => {
const path = require('path')
const { existsSync, mkdirSync } = require('fs')
const getAllEntries = require('./entry')
const bundle = require('./bundle')
const banner = require('./banner')
const { version, name, author, license } = require(path.join(process.cwd(), './package.json'))

if (!existsSync('dist')) {
mkdirSync('dist')
}

const entries = getAllEntries()
const entries = getAllEntries(
{ name, version },
{ entry: 'src/lib.js', dest: process.cwd() },
banner({
name,
version,
author: (author && author.name) || '',
year: new Date().getFullYear(),
license: license || 'ISC'
})
)
bundle(entries)
})
}

function toUpper (_, c) {
return c ? c.toUpperCase() : ''
}

const classifyRE = /(?:^|[-_\/])(\w)/g
function classify (str) {
return str.replace(classifyRE, toUpper)
}

function makeEntries (entryPath, moduleName, packageName, banner) {
const path = require('path')
const resolve = _path => path.resolve(process.cwd(), _path)

return {
commonjs: {
entry: resolve(entryPath),
dest: resolve(`dist/${packageName}.common.js`),
format: 'cjs',
banner
},
esm: {
entry: resolve(entryPath),
dest: resolve(`dist/${packageName}.esm.js`),
format: 'es',
banner
},
production: {
entry: resolve(entryPath),
dest: resolve(`dist/${packageName}.umd.min.js`),
format: 'umd',
env: 'production',
moduleName,
banner
},
development: {
entry: resolve(entryPath),
dest: resolve(`dist/${packageName}.umd.js`),
format: 'umd',
env: 'development',
moduleName,
banner
}
}
}

function genConfig (opts, moduleName, version) {
const babel = require('rollup-plugin-babel')
const cjs = require('rollup-plugin-commonjs')
const node = require('rollup-plugin-node-resolve')
const replace = require('rollup-plugin-replace')

const config = {
input: opts.entry,
output: {
file: opts.dest,
name: moduleName,
format: opts.format,
banner: opts.banner,
sourcemap: true,
},
plugins: [
babel({
extensions: ['.js', '.jsx', '.ts', '.tsx', '.es6', '.es', '.mjs'],
runtimeHelpers: true,
}),
node(),
cjs()
]
}

const replacePluginOptions = { '__VERSION__': version }
if (opts.env) {
replacePluginOptions['process.env.NODE_ENV'] = JSON.stringify(opts.env)
}
config.plugins.push(replace(replacePluginOptions))

return config
}

function getAllEntries () {
const path = require('path')
const { version, name } = require(path.join(process.cwd(), './package.json'))
const moduleName = classify(name)
const entries = makeEntries('src/lib.js', moduleName, name, '')
return Object.keys(entries).map(name => genConfig(entries[name], moduleName, version))
}


function getSize (code) {
return (code.length / 1024).toFixed(2) + 'kb'
}

function logError (e) {
console.log(e)
}

function blue (str) {
return '\x1b[1m\x1b[34m' + str + '\x1b[39m\x1b[22m'
}

function bundle (entries) {
let built = 0
const total = entries.length
const next = () => {
bundleEntry(entries[built]).then(() => {
built++
if (built < total) {
next()
}
}).catch(logError)
}
next()
}

function bundleEntry (config) {
const rollup = require('rollup')
const uglify = require('uglify-js')

const output = config.output
const { file, banner } = output
const isProd = /min\.js$/.test(file)
return rollup.rollup(config)
.then(bundle => bundle.generate(output))
.then(({ code }) => {
if (isProd) {
const minified = (banner ? banner + '\n' : '') + uglify.minify(code, {
fromString: true,
output: { ascii_only: true },
compress: { pure_funcs: ['makeMap'] }
}).code
return write(file, minified, true)
} else {
return write(file, code)
}
})
}

function write (dest, code, zip) {
const fs = require('fs')
const path = require('path')
const zlib = require('zlib')

return new Promise((resolve, reject) => {
function report (extra) {
console.log(blue(path.relative(process.cwd(), dest)) + ' ' + getSize(code) + (extra || ''))
resolve()
}

fs.writeFile(dest, code, err => {
if (err) { return reject(err) }
if (zip) {
zlib.gzip(code, (err, zipped) => {
if (err) { return reject(err) }
report(' (gzipped: ' + getSize(zipped) + ')')
})
} else {
report()
}
})
})
}

0 comments on commit 7913ae9

Please sign in to comment.