build.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. const fs = require('fs')
  2. const path = require('path')
  3. const zlib = require('zlib')
  4. const rollup = require('rollup')
  5. const terser = require('terser')
  6. if (!fs.existsSync('dist')) {
  7. fs.mkdirSync('dist')
  8. }
  9. let builds = require('./config').getAllBuilds()
  10. // filter builds via command line arg
  11. if (process.argv[2]) {
  12. const filters = process.argv[2].split(',')
  13. builds = builds.filter(b => {
  14. return filters.some(f => b.output.file.indexOf(f) > -1 || b._name.indexOf(f) > -1)
  15. })
  16. }
  17. build(builds)
  18. function build (builds) {
  19. let built = 0
  20. const total = builds.length
  21. const next = () => {
  22. buildEntry(builds[built]).then(() => {
  23. built++
  24. if (built < total) {
  25. next()
  26. }
  27. }).catch(logError)
  28. }
  29. next()
  30. }
  31. function buildEntry (config) {
  32. const output = config.output
  33. const { file, banner } = output
  34. const isProd = /(min|prod)\.js$/.test(file)
  35. return rollup.rollup(config)
  36. .then(bundle => bundle.generate(output))
  37. .then(async ({ output: [{ code }] }) => {
  38. if (isProd) {
  39. const {code: minifiedCode} = await terser.minify(code, {
  40. toplevel: true,
  41. compress: {
  42. pure_funcs: ['makeMap'],
  43. },
  44. format: {
  45. ascii_only: true,
  46. }
  47. });
  48. const minified = (banner ? banner + '\n' : '') + minifiedCode
  49. return write(file, minified, true)
  50. } else {
  51. return write(file, code)
  52. }
  53. })
  54. }
  55. function write (dest, code, zip) {
  56. return new Promise((resolve, reject) => {
  57. function report (extra) {
  58. console.log(blue(path.relative(process.cwd(), dest)) + ' ' + getSize(code) + (extra || ''))
  59. resolve()
  60. }
  61. if (!fs.existsSync(path.dirname(dest))) {
  62. fs.mkdirSync(path.dirname(dest), { recursive: true })
  63. }
  64. fs.writeFile(dest, code, err => {
  65. if (err) return reject(err)
  66. if (zip) {
  67. zlib.gzip(code, (err, zipped) => {
  68. if (err) return reject(err)
  69. report(' (gzipped: ' + getSize(zipped) + ')')
  70. })
  71. } else {
  72. report()
  73. }
  74. })
  75. })
  76. }
  77. function getSize (code) {
  78. return (code.length / 1024).toFixed(2) + 'kb'
  79. }
  80. function logError (e) {
  81. console.log(e)
  82. }
  83. function blue (str) {
  84. return '\x1b[1m\x1b[34m' + str + '\x1b[39m\x1b[22m'
  85. }