diff options
| author | ruki <waruqi@gmail.com> | 2018-11-08 00:38:48 +0800 |
|---|---|---|
| committer | ruki <waruqi@gmail.com> | 2018-11-07 21:53:09 +0800 |
| commit | 26105034da4fcce7ac883c899d781f016559310d (patch) | |
| tree | c459a5dc4e3aa0972d9919033ece511ce76dd129 /node_modules/vue-server-renderer/client-plugin.js | |
| parent | 2c77f00f1a7ecb6c8192f9c16d3b2001b254a107 (diff) | |
| download | xmake-docs-26105034da4fcce7ac883c899d781f016559310d.tar.gz xmake-docs-26105034da4fcce7ac883c899d781f016559310d.zip | |
switch to vuepress
Diffstat (limited to 'node_modules/vue-server-renderer/client-plugin.js')
| -rw-r--r-- | node_modules/vue-server-renderer/client-plugin.js | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/node_modules/vue-server-renderer/client-plugin.js b/node_modules/vue-server-renderer/client-plugin.js new file mode 100644 index 00000000..9916bcfb --- /dev/null +++ b/node_modules/vue-server-renderer/client-plugin.js @@ -0,0 +1,86 @@ +'use strict'; + +/* */ + +var isJS = function (file) { return /\.js(\?[^.]+)?$/.test(file); }; + +var ref = require('chalk'); +var red = ref.red; +var yellow = ref.yellow; + +var prefix = "[vue-server-renderer-webpack-plugin]"; +var warn = exports.warn = function (msg) { return console.error(red((prefix + " " + msg + "\n"))); }; +var tip = exports.tip = function (msg) { return console.log(yellow((prefix + " " + msg + "\n"))); }; + +var hash = require('hash-sum'); +var uniq = require('lodash.uniq'); +var VueSSRClientPlugin = function VueSSRClientPlugin (options) { + if ( options === void 0 ) options = {}; + + this.options = Object.assign({ + filename: 'vue-ssr-client-manifest.json' + }, options); +}; + +VueSSRClientPlugin.prototype.apply = function apply (compiler) { + var this$1 = this; + + compiler.plugin('emit', function (compilation, cb) { + var stats = compilation.getStats().toJson(); + + var allFiles = uniq(stats.assets + .map(function (a) { return a.name; })); + + var initialFiles = uniq(Object.keys(stats.entrypoints) + .map(function (name) { return stats.entrypoints[name].assets; }) + .reduce(function (assets, all) { return all.concat(assets); }, []) + .filter(isJS)); + + var asyncFiles = allFiles + .filter(isJS) + .filter(function (file) { return initialFiles.indexOf(file) < 0; }); + + var manifest = { + publicPath: stats.publicPath, + all: allFiles, + initial: initialFiles, + async: asyncFiles, + modules: { /* [identifier: string]: Array<index: number> */ } + }; + + var assetModules = stats.modules.filter(function (m) { return m.assets.length; }); + var fileToIndex = function (file) { return manifest.all.indexOf(file); }; + stats.modules.forEach(function (m) { + // ignore modules duplicated in multiple chunks + if (m.chunks.length === 1) { + var cid = m.chunks[0]; + var chunk = stats.chunks.find(function (c) { return c.id === cid; }); + if (!chunk || !chunk.files) { + return + } + var files = manifest.modules[hash(m.identifier)] = chunk.files.map(fileToIndex); + // find all asset modules associated with the same chunk + assetModules.forEach(function (m) { + if (m.chunks.some(function (id) { return id === cid; })) { + files.push.apply(files, m.assets.map(fileToIndex)); + } + }); + } + }); + + // const debug = (file, obj) => { + // require('fs').writeFileSync(__dirname + '/' + file, JSON.stringify(obj, null, 2)) + // } + // debug('stats.json', stats) + // debug('client-manifest.json', manifest) + + var json = JSON.stringify(manifest, null, 2); + compilation.assets[this$1.options.filename] = { + source: function () { return json; }, + size: function () { return json.length; } + }; + cb(); + }); +}; + +module.exports = VueSSRClientPlugin; |
