build.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /**
  2. * FeHelper Build Script
  3. * @author zhaoxianlie
  4. */
  5. let path = require('path');
  6. let shell = require('shelljs');
  7. let glob = require('glob');
  8. let jsMinifier = require('babel-minify');
  9. let cssMinifier = require('uglifycss');
  10. let htmlMinifier = require('html-minifier');
  11. let fs = require('fs');
  12. let rootPath = path.resolve('.');
  13. // copy files
  14. let copyFiles = function () {
  15. console.time('> 文件拷贝');
  16. shell.cd(rootPath);
  17. shell.mkdir('-p', 'output');
  18. shell.rm('-rf', 'output/*');
  19. shell.cp('-r', 'apps', 'output');
  20. console.timeEnd('> 文件拷贝');
  21. };
  22. // js 文件压缩
  23. let jsCompress = function () {
  24. console.time('> Javascript文件压缩');
  25. glob.sync('output/apps/**/*.js').map(cf => {
  26. let rawJs = fs.readFileSync(cf, 'utf8').toString();
  27. let compressedJs = jsMinifier(rawJs);
  28. if (compressedJs.code) {
  29. fs.writeFileSync(cf, compressedJs.code);
  30. } else {
  31. console.log('---------------------', cf, '----------------------');
  32. console.log(compressedJs.error.message, '\n')
  33. }
  34. });
  35. console.timeEnd('> Javascript文件压缩');
  36. };
  37. // css 文件压缩
  38. let cssCompress = function () {
  39. console.time('> CSS文件压缩');
  40. let reg = /\@import\s+url\(\s*('|")([^\)]+)\1\s*\)\s*;?/gm;
  41. glob.sync('output/apps/**/*.css').map(cf => {
  42. let rawCss = fs.readFileSync(cf, 'utf8');
  43. rawCss = rawCss.toString().replace(reg, ($0, $1, importedFile) => {
  44. let iPath = path.resolve(cf, '../' + importedFile);
  45. return fs.readFileSync(iPath, 'utf8').toString();
  46. });
  47. let compressedCss = cssMinifier.processString(rawCss, {maxLineLen: 500, expandVars: true});
  48. fs.writeFileSync(cf, compressedCss);
  49. });
  50. console.timeEnd('> CSS文件压缩');
  51. };
  52. // html 文件压缩
  53. let htmlCompress = function () {
  54. console.time('> HTML文件压缩');
  55. glob.sync('output/apps/**/*.html').map(cf => {
  56. try {
  57. let rawHtml = fs.readFileSync(cf, 'utf8').toString();
  58. let compressedHtml = htmlMinifier.minify(rawHtml, {
  59. collapseWhitespace: true
  60. });
  61. fs.writeFileSync(cf, compressedHtml);
  62. } catch (e) {
  63. }
  64. });
  65. console.timeEnd('> HTML文件压缩');
  66. };
  67. // manifest文件压缩
  68. let manifestCompress = function () {
  69. console.time('> Manifest文件压缩');
  70. let mf = './output/apps/manifest.json';
  71. let json = require(mf);
  72. fs.writeFileSync(mf, JSON.stringify(json));
  73. console.timeEnd('> Manifest文件压缩');
  74. };
  75. // zip the fehelper
  76. let zipForChromeWebStore = function () {
  77. console.time('> FeHelper打包');
  78. shell.cd(`${rootPath}/output`);
  79. shell.exec('zip -r fehelper.zip apps/ > /dev/null');
  80. console.timeEnd('> FeHelper打包');
  81. console.log('\n\n================================================================================');
  82. console.log(' 去Chrome商店发布吧:https://chrome.google.com/webstore/developer/dashboard');
  83. console.log('================================================================================\n\n');
  84. };
  85. /************************build start*****************************/
  86. copyFiles();
  87. manifestCompress();
  88. cssCompress();
  89. htmlCompress();
  90. jsCompress();
  91. zipForChromeWebStore();