templateCache.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. 'use strict';
  2. const gutil = require('gulp-util');
  3. const replace = require('gulp-replace');
  4. const through = require('through2');
  5. const minify = require('html-minifier').minify;
  6. module.exports = function templateCache() {
  7. const contentTpl = 'cache.put(<%= name %>, <%= content %>);\n';
  8. const header = `/* Templates cached with love :) */
  9. define('templates', function (require, exports, module) {
  10. var cache = require('cache');
  11. `;
  12. const footer = `
  13. });
  14. `;
  15. const contents = [];
  16. function bufferContents(file, enc, cb) {
  17. if (file.isNull()) return cb();
  18. if (file.isStream())
  19. return this.emit('error', new gutil.PluginError('VM-cache', 'Stream is not supported.'));
  20. contents.push({
  21. filename: ('/' + file.relative).replace(/\\/g, '/'),
  22. content: minify(String(file.contents), {
  23. removeComments: true,
  24. collapseWhitespace: true,
  25. conservativeCollapse: true,
  26. removeAttributeQuotes: true,
  27. }),
  28. });
  29. cb();
  30. }
  31. function endStream(cb) {
  32. contents.sort((a, b) => {
  33. if (a.filename < b.filename) return -1;
  34. if (a.filename > b.filename) return 1;
  35. return 0;
  36. });
  37. const nameMap = contents.reduce((res, item, i) => {
  38. res[item.filename] = i;
  39. return res;
  40. }, {});
  41. this.replace = () => replace(/cache.get\('(.*?)'\)/g, (cache, filename) => {
  42. const key = nameMap[filename];
  43. if (key == null) console.warn(`Cache key not found: ${filename}`);
  44. return `cache.get(${key})`;
  45. });
  46. const templates = contents.map(item => {
  47. return `cache.put(${nameMap[item.filename]}, ${JSON.stringify(item.content)});`;
  48. }).join('\n');
  49. this.push(new gutil.File({
  50. base: '',
  51. path: 'template.js',
  52. contents: new Buffer(header + templates + footer),
  53. }));
  54. cb();
  55. }
  56. const cacheObj = through.obj(bufferContents, endStream);
  57. return cacheObj;
  58. };