Blame view

node_modules/webpack/lib/DllReferencePlugin.js 2.18 KB
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
  /*
  	MIT License http://www.opensource.org/licenses/mit-license.php
  	Author Tobias Koppers @sokra
  */
  "use strict";
  
  const DelegatedSourceDependency = require("./dependencies/DelegatedSourceDependency");
  const DelegatedModuleFactoryPlugin = require("./DelegatedModuleFactoryPlugin");
  const ExternalModuleFactoryPlugin = require("./ExternalModuleFactoryPlugin");
  const DelegatedExportsDependency = require("./dependencies/DelegatedExportsDependency");
  const NullFactory = require("./NullFactory");
  
  class DllReferencePlugin {
  	constructor(options) {
  		this.options = options;
  	}
  
  	apply(compiler) {
  		compiler.plugin("compilation", (compilation, params) => {
  			const normalModuleFactory = params.normalModuleFactory;
  			compilation.dependencyFactories.set(DelegatedSourceDependency, normalModuleFactory);
  			compilation.dependencyFactories.set(DelegatedExportsDependency, new NullFactory());
  		});
  
  		compiler.plugin("before-compile", (params, callback) => {
  			const manifest = this.options.manifest;
  			if(typeof manifest === "string") {
  				params.compilationDependencies.push(manifest);
  				compiler.inputFileSystem.readFile(manifest, function(err, result) {
  					if(err) return callback(err);
  					params["dll reference " + manifest] = JSON.parse(result.toString("utf-8"));
  					return callback();
  				});
  			} else {
  				return callback();
  			}
  		});
  
  		compiler.plugin("compile", (params) => {
  			let manifest = this.options.manifest;
  			if(typeof manifest === "string") {
  				manifest = params["dll reference " + manifest];
  			}
  			const name = this.options.name || manifest.name;
  			const sourceType = this.options.sourceType || (manifest && manifest.type) || "var";
  			const externals = {};
  			const source = "dll-reference " + name;
  			externals[source] = name;
  			params.normalModuleFactory.apply(new ExternalModuleFactoryPlugin(sourceType, externals));
  			params.normalModuleFactory.apply(new DelegatedModuleFactoryPlugin({
  				source: source,
  				type: this.options.type,
  				scope: this.options.scope,
  				context: this.options.context || compiler.options.context,
  				content: this.options.content || manifest.content,
  				extensions: this.options.extensions
  			}));
  		});
  	}
  }
  
  module.exports = DllReferencePlugin;