build.js 2.2 KB

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