client-plugin.js 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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 uniq = require('lodash.uniq');
  12. var VueSSRClientPlugin = function VueSSRClientPlugin (options) {
  13. if ( options === void 0 ) options = {};
  14. this.options = Object.assign({
  15. filename: 'vue-ssr-client-manifest.json'
  16. }, options);
  17. };
  18. VueSSRClientPlugin.prototype.apply = function apply (compiler) {
  19. var this$1 = this;
  20. compiler.plugin('emit', function (compilation, cb) {
  21. var stats = compilation.getStats().toJson();
  22. var allFiles = uniq(stats.assets
  23. .map(function (a) { return a.name; }));
  24. var initialFiles = uniq(Object.keys(stats.entrypoints)
  25. .map(function (name) { return stats.entrypoints[name].assets; })
  26. .reduce(function (assets, all) { return all.concat(assets); }, [])
  27. .filter(isJS));
  28. var asyncFiles = allFiles
  29. .filter(isJS)
  30. .filter(function (file) { return initialFiles.indexOf(file) < 0; });
  31. var manifest = {
  32. publicPath: stats.publicPath,
  33. all: allFiles,
  34. initial: initialFiles,
  35. async: asyncFiles,
  36. modules: { /* [identifier: string]: Array<index: number> */ }
  37. };
  38. var assetModules = stats.modules.filter(function (m) { return m.assets.length; });
  39. var fileToIndex = function (file) { return manifest.all.indexOf(file); };
  40. stats.modules.forEach(function (m) {
  41. // ignore modules duplicated in multiple chunks
  42. if (m.chunks.length === 1) {
  43. var cid = m.chunks[0];
  44. var chunk = stats.chunks.find(function (c) { return c.id === cid; });
  45. if (!chunk || !chunk.files) {
  46. return
  47. }
  48. var files = manifest.modules[hash(m.identifier)] = chunk.files.map(fileToIndex);
  49. // find all asset modules associated with the same chunk
  50. assetModules.forEach(function (m) {
  51. if (m.chunks.some(function (id) { return id === cid; })) {
  52. files.push.apply(files, m.assets.map(fileToIndex));
  53. }
  54. });
  55. }
  56. });
  57. // const debug = (file, obj) => {
  58. // require('fs').writeFileSync(__dirname + '/' + file, JSON.stringify(obj, null, 2))
  59. // }
  60. // debug('stats.json', stats)
  61. // debug('client-manifest.json', manifest)
  62. var json = JSON.stringify(manifest, null, 2);
  63. compilation.assets[this$1.options.filename] = {
  64. source: function () { return json; },
  65. size: function () { return json.length; }
  66. };
  67. cb();
  68. });
  69. };
  70. module.exports = VueSSRClientPlugin;