Move normalModuleLoader hook

This commit is contained in:
Florent Cailhol 2018-11-12 14:13:55 +01:00
parent 23bd3d7bd4
commit 3766869c48
6 changed files with 46 additions and 17 deletions

View File

@ -354,12 +354,7 @@ class Compilation {
"childCompiler", "childCompiler",
"compilerName", "compilerName",
"compilerIndex" "compilerIndex"
]), ])
// TODO the following hooks are weirdly located here
// TODO move them for webpack 5
/** @type {SyncHook<object, Module>} */
normalModuleLoader: new SyncHook(["loaderContext", "module"])
}); });
/** @type {string=} */ /** @type {string=} */
this.name = undefined; this.name = undefined;

View File

@ -16,6 +16,7 @@ const {
toConstantDependencyWithWebpackRequire toConstantDependencyWithWebpackRequire
} = require("./JavascriptParserHelpers"); } = require("./JavascriptParserHelpers");
const MainTemplate = require("./MainTemplate"); const MainTemplate = require("./MainTemplate");
const NormalModule = require("./NormalModule");
const NullFactory = require("./NullFactory"); const NullFactory = require("./NullFactory");
const RuntimeGlobals = require("./RuntimeGlobals"); const RuntimeGlobals = require("./RuntimeGlobals");
const Template = require("./Template"); const Template = require("./Template");
@ -461,7 +462,7 @@ class HotModuleReplacementPlugin {
.for("javascript/dynamic") .for("javascript/dynamic")
.tap("HotModuleReplacementPlugin", addParserPlugins); .tap("HotModuleReplacementPlugin", addParserPlugins);
compilation.hooks.normalModuleLoader.tap( NormalModule.getCompilationHooks(compilation).loader.tap(
"HotModuleReplacementPlugin", "HotModuleReplacementPlugin",
context => { context => {
context.hot = true; context.hot = true;

View File

@ -37,13 +37,9 @@ class LoaderOptionsPlugin {
apply(compiler) { apply(compiler) {
const options = this.options; const options = this.options;
compiler.hooks.compilation.tap("LoaderOptionsPlugin", compilation => { compiler.hooks.compilation.tap("LoaderOptionsPlugin", compilation => {
compilation.hooks.normalModuleLoader.tap( NormalModule.getCompilationHooks(compilation).loader.tap(
"LoaderOptionsPlugin", "LoaderOptionsPlugin",
(context, m) => { (context, module) => {
if (!(m instanceof NormalModule)) {
return;
}
const module = /** @type {NormalModule} */ m;
const resource = module.resource; const resource = module.resource;
if (!resource) return; if (!resource) return;
const i = resource.indexOf("?"); const i = resource.indexOf("?");

View File

@ -5,6 +5,8 @@
"use strict"; "use strict";
const NormalModule = require("./NormalModule");
/** @typedef {import("./Compiler")} Compiler */ /** @typedef {import("./Compiler")} Compiler */
class LoaderTargetPlugin { class LoaderTargetPlugin {
@ -21,7 +23,7 @@ class LoaderTargetPlugin {
*/ */
apply(compiler) { apply(compiler) {
compiler.hooks.compilation.tap("LoaderTargetPlugin", compilation => { compiler.hooks.compilation.tap("LoaderTargetPlugin", compilation => {
compilation.hooks.normalModuleLoader.tap( NormalModule.getCompilationHooks(compilation).loader.tap(
"LoaderTargetPlugin", "LoaderTargetPlugin",
loaderContext => { loaderContext => {
loaderContext.target = this.target; loaderContext.target = this.target;

View File

@ -7,12 +7,14 @@
const { getContext, runLoaders } = require("loader-runner"); const { getContext, runLoaders } = require("loader-runner");
const asyncLib = require("neo-async"); const asyncLib = require("neo-async");
const { SyncHook } = require("tapable");
const { const {
CachedSource, CachedSource,
OriginalSource, OriginalSource,
RawSource, RawSource,
SourceMapSource SourceMapSource
} = require("webpack-sources"); } = require("webpack-sources");
const Compilation = require("./Compilation");
const Module = require("./Module"); const Module = require("./Module");
const ModuleBuildError = require("./ModuleBuildError"); const ModuleBuildError = require("./ModuleBuildError");
const ModuleError = require("./ModuleError"); const ModuleError = require("./ModuleError");
@ -79,7 +81,35 @@ makeSerializable(
* @property {string} hash the hash value * @property {string} hash the hash value
*/ */
/**
* @typedef {Object} NormalModuleCompilationHooks
* @property {SyncHook<object, NormalModule>} loader
*/
/** @type {WeakMap<Compilation, NormalModuleCompilationHooks>} */
const compilationHooksMap = new WeakMap();
class NormalModule extends Module { class NormalModule extends Module {
/**
* @param {Compilation} compilation the compilation
* @returns {NormalModuleCompilationHooks} the attached hooks
*/
static getCompilationHooks(compilation) {
if (!(compilation instanceof Compilation)) {
throw new TypeError(
"The 'compilation' argument must be an instance of Compilation"
);
}
let hooks = compilationHooksMap.get(compilation);
if (hooks === undefined) {
hooks = {
loader: new SyncHook(["loaderContext", "module"])
};
compilationHooksMap.set(compilation, hooks);
}
return hooks;
}
constructor({ constructor({
type, type,
request, request,
@ -235,7 +265,11 @@ class NormalModule extends Module {
fs: fs fs: fs
}; };
compilation.hooks.normalModuleLoader.call(loaderContext, this); NormalModule.getCompilationHooks(compilation).loader.call(
loaderContext,
this
);
if (options.loader) { if (options.loader) {
Object.assign(loaderContext, options.loader); Object.assign(loaderContext, options.loader);
} }

View File

@ -5,6 +5,7 @@
"use strict"; "use strict";
const NormalModule = require("../NormalModule");
const LoaderDependency = require("./LoaderDependency"); const LoaderDependency = require("./LoaderDependency");
/** @typedef {import("../Module")} Module */ /** @typedef {import("../Module")} Module */
@ -31,9 +32,9 @@ class LoaderPlugin {
compiler.hooks.compilation.tap("LoaderPlugin", compilation => { compiler.hooks.compilation.tap("LoaderPlugin", compilation => {
const moduleGraph = compilation.moduleGraph; const moduleGraph = compilation.moduleGraph;
compilation.hooks.normalModuleLoader.tap( NormalModule.getCompilationHooks(compilation).loader.tap(
"LoaderPlugin", "LoaderPlugin",
(loaderContext, module) => { loaderContext => {
/** /**
* @param {string} request the request string to load the module from * @param {string} request the request string to load the module from
* @param {LoadModuleCallback} callback callback returning the loaded module or error * @param {LoadModuleCallback} callback callback returning the loaded module or error