build.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /**
  2. * Build, update component.json, uglify, and report size.
  3. */
  4. module.exports = function (grunt) {
  5. grunt.registerTask('build', function () {
  6. var done = this.async()
  7. var fs = require('fs')
  8. var zlib = require('zlib')
  9. var webpack = require('webpack')
  10. var uglifyjs = require('uglify-js')
  11. var banner =
  12. '/**\n' +
  13. ' * Vue.js v' + grunt.config.get('version') + '\n' +
  14. ' * (c) ' + new Date().getFullYear() + ' Evan You\n' +
  15. ' * Released under the MIT License.\n' +
  16. ' */\n'
  17. // update component.json first
  18. var jsRE = /\.js$/
  19. var component = grunt.file.readJSON('component.json')
  20. component.scripts = []
  21. grunt.file.recurse('src', function (file) {
  22. if (jsRE.test(file)) {
  23. component.scripts.push(file)
  24. }
  25. })
  26. grunt.file.write('component.json', JSON.stringify(component, null, 2))
  27. // build
  28. webpack({
  29. entry: './src/vue',
  30. output: {
  31. path: './dist',
  32. filename: 'vue.js',
  33. library: 'Vue',
  34. libraryTarget: 'umd'
  35. },
  36. plugins: [
  37. new webpack.BannerPlugin(banner, { raw: true })
  38. ]
  39. }, function (err, stats) {
  40. if (err) return done(err)
  41. minify()
  42. })
  43. function minify () {
  44. var js = fs.readFileSync('dist/vue.js', 'utf-8')
  45. report('dist/vue.js', js)
  46. // uglify
  47. var result = uglifyjs.minify(js, {
  48. fromString: true,
  49. output: {
  50. comments: /License/
  51. },
  52. compress: {
  53. pure_funcs: [
  54. 'require',
  55. '_.log',
  56. '_.warn',
  57. '_.assertAsset',
  58. 'enableDebug'
  59. ]
  60. }
  61. })
  62. // var min = grunt.config.get('banner') + result.code
  63. write('dist/vue.min.js', result.code)
  64. // report gzip size
  65. zlib.gzip(result.code, function (err, buf) {
  66. write('dist/vue.min.js.gz', buf)
  67. done(err)
  68. })
  69. }
  70. function write (path, file) {
  71. fs.writeFileSync(path, file)
  72. report(path, file)
  73. }
  74. function report (path, file) {
  75. console.log(
  76. blue(path + ': ') +
  77. (file.length / 1024).toFixed(2) + 'kb'
  78. )
  79. }
  80. function blue (str) {
  81. return '\x1b[1m\x1b[34m' + str + '\x1b[39m\x1b[22m'
  82. }
  83. })
  84. }