build.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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.log('> Javascript文件压缩 ...')
  25. console.time('> Javascript文件压缩');
  26. glob.sync('output/apps/**/*.js').map(cf => {
  27. // 添加例外,有些js文件不用压缩
  28. let exclude = /\/ga\.js|\/(codemirror|syntaxhighlighter|uglifyjs3)\/|.*\.min\.js|\/vue\.js/;
  29. if (exclude.test(cf)) {
  30. return false;
  31. }
  32. let start = new Date();
  33. let rawJs = fs.readFileSync(cf, 'utf8').toString();
  34. let compressedJs = jsMinifier(rawJs);
  35. if (compressedJs.code) {
  36. fs.writeFileSync(cf, compressedJs.code);
  37. console.log('\t文件压缩成功,', ('耗时' + (new Date() - start) + 'ms').padEnd(12, ' '), cf);
  38. } else {
  39. console.log('\t文件压缩失败:', cf);
  40. }
  41. });
  42. console.timeEnd('> Javascript文件压缩');
  43. };
  44. // css 文件压缩
  45. let cssCompress = function () {
  46. console.time('> CSS文件压缩');
  47. let reg = /\@import\s+url\(\s*('|")([^\)]+)\1\s*\)\s*;?/gm;
  48. glob.sync('output/apps/**/*.css').map(cf => {
  49. let rawCss = fs.readFileSync(cf, 'utf8');
  50. rawCss = rawCss.toString().replace(reg, ($0, $1, importedFile) => {
  51. let iPath = path.resolve(cf, '../' + importedFile);
  52. return fs.readFileSync(iPath, 'utf8').toString();
  53. });
  54. let compressedCss = cssMinifier.processString(rawCss, {maxLineLen: 500, expandVars: true});
  55. fs.writeFileSync(cf, compressedCss);
  56. });
  57. console.timeEnd('> CSS文件压缩');
  58. };
  59. // html 文件压缩
  60. let htmlCompress = function () {
  61. console.time('> HTML文件压缩');
  62. glob.sync('output/apps/**/*.html').map(cf => {
  63. try {
  64. let rawHtml = fs.readFileSync(cf, 'utf8').toString();
  65. let compressedHtml = htmlMinifier.minify(rawHtml, {
  66. collapseWhitespace: true
  67. });
  68. fs.writeFileSync(cf, compressedHtml);
  69. } catch (e) {
  70. }
  71. });
  72. console.timeEnd('> HTML文件压缩');
  73. };
  74. // zip the fehelper
  75. let zipForChromeWebStore = function () {
  76. console.time('> Manifest文件压缩');
  77. let mf = './output/apps/manifest.json';
  78. let json = require(mf);
  79. fs.writeFileSync(mf, JSON.stringify(json));
  80. console.timeEnd('> Manifest文件压缩');
  81. console.time('> FeHelper打包');
  82. shell.cd(`${rootPath}/output`);
  83. shell.exec('zip -r fehelper.zip apps/ > /dev/null');
  84. console.timeEnd('> FeHelper打包');
  85. console.log('\n\n================================================================================');
  86. console.log(' 当前版本:', json.version);
  87. console.log(' 去Chrome商店发布吧:https://chrome.google.com/webstore/devconsole');
  88. console.log('================================================================================\n\n');
  89. };
  90. /************************build start*****************************/
  91. copyFiles();
  92. cssCompress();
  93. htmlCompress();
  94. jsCompress();
  95. zipForChromeWebStore();