webpack.js 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. const Compiler = require("./Compiler");
  7. const MultiCompiler = require("./MultiCompiler");
  8. const NodeEnvironmentPlugin = require("./node/NodeEnvironmentPlugin");
  9. const WebpackOptionsApply = require("./WebpackOptionsApply");
  10. const WebpackOptionsDefaulter = require("./WebpackOptionsDefaulter");
  11. const validateSchema = require("./validateSchema");
  12. const WebpackOptionsValidationError = require("./WebpackOptionsValidationError");
  13. const webpackOptionsSchema = require("../schemas/WebpackOptions.json");
  14. const RemovedPluginError = require("./RemovedPluginError");
  15. const version = require("../package.json").version;
  16. const webpack = (options, callback) => {
  17. const webpackOptionsValidationErrors = validateSchema(
  18. webpackOptionsSchema,
  19. options
  20. );
  21. if (webpackOptionsValidationErrors.length) {
  22. throw new WebpackOptionsValidationError(webpackOptionsValidationErrors);
  23. }
  24. let compiler;
  25. if (Array.isArray(options)) {
  26. compiler = new MultiCompiler(options.map(options => webpack(options)));
  27. } else if (typeof options === "object") {
  28. options = new WebpackOptionsDefaulter().process(options);
  29. compiler = new Compiler(options.context);
  30. compiler.options = options;
  31. new NodeEnvironmentPlugin().apply(compiler);
  32. if (options.plugins && Array.isArray(options.plugins)) {
  33. for (const plugin of options.plugins) {
  34. plugin.apply(compiler);
  35. }
  36. }
  37. compiler.hooks.environment.call();
  38. compiler.hooks.afterEnvironment.call();
  39. compiler.options = new WebpackOptionsApply().process(options, compiler);
  40. } else {
  41. throw new Error("Invalid argument: options");
  42. }
  43. if (callback) {
  44. if (typeof callback !== "function") {
  45. throw new Error("Invalid argument: callback");
  46. }
  47. if (
  48. options.watch === true ||
  49. (Array.isArray(options) && options.some(o => o.watch))
  50. ) {
  51. const watchOptions = Array.isArray(options)
  52. ? options.map(o => o.watchOptions || {})
  53. : options.watchOptions || {};
  54. return compiler.watch(watchOptions, callback);
  55. }
  56. compiler.run(callback);
  57. }
  58. return compiler;
  59. };
  60. exports = module.exports = webpack;
  61. exports.version = version;
  62. webpack.WebpackOptionsDefaulter = WebpackOptionsDefaulter;
  63. webpack.WebpackOptionsApply = WebpackOptionsApply;
  64. webpack.Compiler = Compiler;
  65. webpack.MultiCompiler = MultiCompiler;
  66. webpack.NodeEnvironmentPlugin = NodeEnvironmentPlugin;
  67. // @ts-ignore Global @this directive is not supported
  68. webpack.validate = validateSchema.bind(this, webpackOptionsSchema);
  69. webpack.validateSchema = validateSchema;
  70. webpack.WebpackOptionsValidationError = WebpackOptionsValidationError;
  71. const exportPlugins = (obj, mappings) => {
  72. for (const name of Object.keys(mappings)) {
  73. Object.defineProperty(obj, name, {
  74. configurable: false,
  75. enumerable: true,
  76. get: mappings[name]
  77. });
  78. }
  79. };
  80. exportPlugins(exports, {
  81. AutomaticPrefetchPlugin: () => require("./AutomaticPrefetchPlugin"),
  82. BannerPlugin: () => require("./BannerPlugin"),
  83. CachePlugin: () => require("./CachePlugin"),
  84. ContextExclusionPlugin: () => require("./ContextExclusionPlugin"),
  85. ContextReplacementPlugin: () => require("./ContextReplacementPlugin"),
  86. DefinePlugin: () => require("./DefinePlugin"),
  87. Dependency: () => require("./Dependency"),
  88. DllPlugin: () => require("./DllPlugin"),
  89. DllReferencePlugin: () => require("./DllReferencePlugin"),
  90. EnvironmentPlugin: () => require("./EnvironmentPlugin"),
  91. EvalDevToolModulePlugin: () => require("./EvalDevToolModulePlugin"),
  92. EvalSourceMapDevToolPlugin: () => require("./EvalSourceMapDevToolPlugin"),
  93. ExtendedAPIPlugin: () => require("./ExtendedAPIPlugin"),
  94. ExternalsPlugin: () => require("./ExternalsPlugin"),
  95. HashedModuleIdsPlugin: () => require("./HashedModuleIdsPlugin"),
  96. HotModuleReplacementPlugin: () => require("./HotModuleReplacementPlugin"),
  97. IgnorePlugin: () => require("./IgnorePlugin"),
  98. LibraryTemplatePlugin: () => require("./LibraryTemplatePlugin"),
  99. LoaderOptionsPlugin: () => require("./LoaderOptionsPlugin"),
  100. LoaderTargetPlugin: () => require("./LoaderTargetPlugin"),
  101. MemoryOutputFileSystem: () => require("./MemoryOutputFileSystem"),
  102. Module: () => require("./Module"),
  103. ModuleFilenameHelpers: () => require("./ModuleFilenameHelpers"),
  104. NamedChunksPlugin: () => require("./NamedChunksPlugin"),
  105. NamedModulesPlugin: () => require("./NamedModulesPlugin"),
  106. NoEmitOnErrorsPlugin: () => require("./NoEmitOnErrorsPlugin"),
  107. NormalModuleReplacementPlugin: () =>
  108. require("./NormalModuleReplacementPlugin"),
  109. PrefetchPlugin: () => require("./PrefetchPlugin"),
  110. ProgressPlugin: () => require("./ProgressPlugin"),
  111. ProvidePlugin: () => require("./ProvidePlugin"),
  112. SetVarMainTemplatePlugin: () => require("./SetVarMainTemplatePlugin"),
  113. SingleEntryPlugin: () => require("./SingleEntryPlugin"),
  114. SourceMapDevToolPlugin: () => require("./SourceMapDevToolPlugin"),
  115. Stats: () => require("./Stats"),
  116. Template: () => require("./Template"),
  117. UmdMainTemplatePlugin: () => require("./UmdMainTemplatePlugin"),
  118. WatchIgnorePlugin: () => require("./WatchIgnorePlugin")
  119. });
  120. exportPlugins((exports.dependencies = {}), {
  121. DependencyReference: () => require("./dependencies/DependencyReference")
  122. });
  123. exportPlugins((exports.optimize = {}), {
  124. AggressiveMergingPlugin: () => require("./optimize/AggressiveMergingPlugin"),
  125. AggressiveSplittingPlugin: () =>
  126. require("./optimize/AggressiveSplittingPlugin"),
  127. ChunkModuleIdRangePlugin: () =>
  128. require("./optimize/ChunkModuleIdRangePlugin"),
  129. LimitChunkCountPlugin: () => require("./optimize/LimitChunkCountPlugin"),
  130. MinChunkSizePlugin: () => require("./optimize/MinChunkSizePlugin"),
  131. ModuleConcatenationPlugin: () =>
  132. require("./optimize/ModuleConcatenationPlugin"),
  133. OccurrenceOrderPlugin: () => require("./optimize/OccurrenceOrderPlugin"),
  134. OccurrenceModuleOrderPlugin: () =>
  135. require("./optimize/OccurrenceModuleOrderPlugin"),
  136. OccurrenceChunkOrderPlugin: () =>
  137. require("./optimize/OccurrenceChunkOrderPlugin"),
  138. RuntimeChunkPlugin: () => require("./optimize/RuntimeChunkPlugin"),
  139. SideEffectsFlagPlugin: () => require("./optimize/SideEffectsFlagPlugin"),
  140. SplitChunksPlugin: () => require("./optimize/SplitChunksPlugin")
  141. });
  142. exportPlugins((exports.web = {}), {
  143. FetchCompileWasmTemplatePlugin: () =>
  144. require("./web/FetchCompileWasmTemplatePlugin"),
  145. JsonpTemplatePlugin: () => require("./web/JsonpTemplatePlugin")
  146. });
  147. exportPlugins((exports.webworker = {}), {
  148. WebWorkerTemplatePlugin: () => require("./webworker/WebWorkerTemplatePlugin")
  149. });
  150. exportPlugins((exports.node = {}), {
  151. NodeTemplatePlugin: () => require("./node/NodeTemplatePlugin"),
  152. ReadFileCompileWasmTemplatePlugin: () =>
  153. require("./node/ReadFileCompileWasmTemplatePlugin")
  154. });
  155. exportPlugins((exports.debug = {}), {
  156. ProfilingPlugin: () => require("./debug/ProfilingPlugin")
  157. });
  158. exportPlugins((exports.util = {}), {
  159. createHash: () => require("./util/createHash")
  160. });
  161. const defineMissingPluginError = (namespace, pluginName, errorMessage) => {
  162. Object.defineProperty(namespace, pluginName, {
  163. configurable: false,
  164. enumerable: true,
  165. get() {
  166. throw new RemovedPluginError(errorMessage);
  167. }
  168. });
  169. };
  170. // TODO remove in webpack 5
  171. defineMissingPluginError(
  172. exports.optimize,
  173. "UglifyJsPlugin",
  174. "webpack.optimize.UglifyJsPlugin has been removed, please use config.optimization.minimize instead."
  175. );
  176. // TODO remove in webpack 5
  177. defineMissingPluginError(
  178. exports.optimize,
  179. "CommonsChunkPlugin",
  180. "webpack.optimize.CommonsChunkPlugin has been removed, please use config.optimization.splitChunks instead."
  181. );