mirror of https://github.com/vuejs/vue.git
				
				
				
			
		
			
				
	
	
		
			90 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
'use strict';
 | 
						|
 | 
						|
var isJS = function (file) { return /\.js(\?[^.]+)?$/.test(file); };
 | 
						|
 | 
						|
var _a = require('chalk'), red = _a.red, yellow = _a.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 validate = function (compiler) {
 | 
						|
    if (compiler.options.target !== 'node') {
 | 
						|
        warn('webpack config `target` should be "node".');
 | 
						|
    }
 | 
						|
    if (compiler.options.output &&
 | 
						|
        compiler.options.output.libraryTarget !== 'commonjs2') {
 | 
						|
        warn('webpack config `output.libraryTarget` should be "commonjs2".');
 | 
						|
    }
 | 
						|
    if (!compiler.options.externals) {
 | 
						|
        tip('It is recommended to externalize dependencies in the server build for ' +
 | 
						|
            'better build performance.');
 | 
						|
    }
 | 
						|
};
 | 
						|
var onEmit = function (compiler, name, hook) {
 | 
						|
    if (compiler.hooks) {
 | 
						|
        // Webpack >= 4.0.0
 | 
						|
        compiler.hooks.emit.tapAsync(name, hook);
 | 
						|
    }
 | 
						|
    else {
 | 
						|
        // Webpack < 4.0.0
 | 
						|
        compiler.plugin('emit', hook);
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
var VueSSRServerPlugin = /** @class */ (function () {
 | 
						|
    function VueSSRServerPlugin(options) {
 | 
						|
        if (options === void 0) { options = {}; }
 | 
						|
        //@ts-expect-error
 | 
						|
        this.options = Object.assign({
 | 
						|
            filename: 'vue-ssr-server-bundle.json',
 | 
						|
        }, options);
 | 
						|
    }
 | 
						|
    VueSSRServerPlugin.prototype.apply = function (compiler) {
 | 
						|
        var _this = this;
 | 
						|
        validate(compiler);
 | 
						|
        onEmit(compiler, 'vue-server-plugin', function (compilation, cb) {
 | 
						|
            var stats = compilation.getStats().toJson();
 | 
						|
            var entryName = Object.keys(stats.entrypoints)[0];
 | 
						|
            var entryInfo = stats.entrypoints[entryName];
 | 
						|
            if (!entryInfo) {
 | 
						|
                // #5553
 | 
						|
                return cb();
 | 
						|
            }
 | 
						|
            var entryAssets = entryInfo.assets.filter(isJS);
 | 
						|
            if (entryAssets.length > 1) {
 | 
						|
                throw new Error("Server-side bundle should have one single entry file. " +
 | 
						|
                    "Avoid using CommonsChunkPlugin in the server config.");
 | 
						|
            }
 | 
						|
            var entry = entryAssets[0];
 | 
						|
            if (!entry || typeof entry !== 'string') {
 | 
						|
                throw new Error("Entry \"" + entryName + "\" not found. Did you specify the correct entry option?");
 | 
						|
            }
 | 
						|
            var bundle = {
 | 
						|
                entry: entry,
 | 
						|
                files: {},
 | 
						|
                maps: {},
 | 
						|
            };
 | 
						|
            stats.assets.forEach(function (asset) {
 | 
						|
                if (isJS(asset.name)) {
 | 
						|
                    bundle.files[asset.name] = compilation.assets[asset.name].source();
 | 
						|
                }
 | 
						|
                else if (asset.name.match(/\.js\.map$/)) {
 | 
						|
                    bundle.maps[asset.name.replace(/\.map$/, '')] = JSON.parse(compilation.assets[asset.name].source());
 | 
						|
                }
 | 
						|
                // do not emit anything else for server
 | 
						|
                delete compilation.assets[asset.name];
 | 
						|
            });
 | 
						|
            var json = JSON.stringify(bundle, null, 2);
 | 
						|
            //@ts-expect-error
 | 
						|
            var filename = _this.options.filename;
 | 
						|
            compilation.assets[filename] = {
 | 
						|
                source: function () { return json; },
 | 
						|
                size: function () { return json.length; },
 | 
						|
            };
 | 
						|
            cb();
 | 
						|
        });
 | 
						|
    };
 | 
						|
    return VueSSRServerPlugin;
 | 
						|
}());
 | 
						|
 | 
						|
module.exports = VueSSRServerPlugin;
 |