client-plugin.js 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. 'use strict';
  2. /* */
  3. var isJS = function (file) { return /\.js(\?[^.]+)?$/.test(file); };
  4. var ref = require('chalk');
  5. var red = ref.red;
  6. var yellow = ref.yellow;
  7. var prefix = "[vue-server-renderer-webpack-plugin]";
  8. var warn = exports.warn = function (msg) { return console.error(red((prefix + " " + msg + "\n"))); };
  9. var tip = exports.tip = function (msg) { return console.log(yellow((prefix + " " + msg + "\n"))); };
  10. var hash = require('hash-sum');
  11. var VueSSRClientPlugin = function VueSSRClientPlugin (options) {
  12. if ( options === void 0 ) options = {};
  13. this.options = Object.assign({
  14. filename: 'vue-ssr-client-manifest.json'
  15. }, options);
  16. };
  17. VueSSRClientPlugin.prototype.apply = function apply (compiler) {
  18. var this$1 = this;
  19. compiler.plugin('emit', function (compilation, cb) {
  20. var stats = compilation.getStats().toJson();
  21. var allFiles = stats.assets
  22. .map(function (a) { return a.name; });
  23. var initialFiles = Object.keys(stats.entrypoints)
  24. .map(function (name) { return stats.entrypoints[name].assets; })
  25. .reduce(function (assets, all) { return all.concat(assets); }, [])
  26. .filter(isJS);
  27. var asyncFiles = allFiles
  28. .filter(isJS)
  29. .filter(function (file) { return initialFiles.indexOf(file) < 0; });
  30. var manifest = {
  31. publicPath: stats.publicPath,
  32. all: allFiles,
  33. initial: initialFiles,
  34. async: asyncFiles,
  35. modules: { /* [identifier: string]: Array<index: number> */ }
  36. };
  37. var assetModules = stats.modules.filter(function (m) { return m.assets.length; });
  38. var fileToIndex = function (file) { return manifest.all.indexOf(file); };
  39. stats.modules.forEach(function (m) {
  40. // ignore modules duplicated in multiple chunks
  41. if (m.chunks.length === 1) {
  42. var cid = m.chunks[0];
  43. var chunk = stats.chunks.find(function (c) { return c.id === cid; });
  44. var files = manifest.modules[hash(m.identifier)] = chunk.files.map(fileToIndex);
  45. // find all asset modules associated with the same chunk
  46. assetModules.forEach(function (m) {
  47. if (m.chunks.some(function (id) { return id === cid; })) {
  48. files.push.apply(files, m.assets.map(fileToIndex));
  49. }
  50. });
  51. }
  52. });
  53. // const debug = (file, obj) => {
  54. // require('fs').writeFileSync(__dirname + '/' + file, JSON.stringify(obj, null, 2))
  55. // }
  56. // debug('stats.json', stats)
  57. // debug('client-manifest.json', manifest)
  58. var json = JSON.stringify(manifest, null, 2);
  59. compilation.assets[this$1.options.filename] = {
  60. source: function () { return json; },
  61. size: function () { return json.length; }
  62. };
  63. cb();
  64. });
  65. };
  66. module.exports = VueSSRClientPlugin;