fix: use memorize util instead of lazyRequire

This commit is contained in:
Ivan Kopeykin 2019-12-03 20:31:39 +03:00
parent 4598ea539b
commit faea05d195
5 changed files with 77 additions and 94 deletions

View File

@ -5,6 +5,7 @@
"use strict"; "use strict";
const memorize = require("../util/memorize");
const validateOptions = require("schema-utils"); const validateOptions = require("schema-utils");
const { compareModulesByIdentifier } = require("../util/comparators"); const { compareModulesByIdentifier } = require("../util/comparators");
@ -13,21 +14,17 @@ const { compareModulesByIdentifier } = require("../util/comparators");
/** @typedef {import("../Compiler")} Compiler */ /** @typedef {import("../Compiler")} Compiler */
/** @typedef {import("../Module")} Module */ /** @typedef {import("../Module")} Module */
const lazyRequire = require("../util/lazyRequire")(require); const getGeneratorSchema = memorize(() =>
const generatorSchema = lazyRequire( require("../../schemas/plugins/AssetModulesPluginGenerator.json")
"../../schemas/plugins/AssetModulesPluginGenerator.json",
false
); );
const parserSchema = lazyRequire( const getParserSchema = memorize(() =>
"../../schemas/plugins/AssetModulesPluginParser.json", require("../../schemas/plugins/AssetModulesPluginParser.json")
false );
const getAssetGenerator = memorize(() => require("./AssetGenerator"));
const getAssetParser = memorize(() => require("./AssetParser"));
const getAssetSourceGenerator = memorize(() =>
require("./AssetSourceGenerator")
); );
/** @type {typeof import('./AssetGenerator')} */
const AssetGenerator = lazyRequire("./AssetGenerator");
/** @type {typeof import('./AssetParser')} */
const AssetParser = lazyRequire("./AssetParser");
/** @type {typeof import('./AssetSourceGenerator')} */
const AssetSourceGenerator = lazyRequire("./AssetSourceGenerator");
const type = "asset"; const type = "asset";
const plugin = "AssetModulesPlugin"; const plugin = "AssetModulesPlugin";
@ -44,7 +41,7 @@ class AssetModulesPlugin {
normalModuleFactory.hooks.createParser normalModuleFactory.hooks.createParser
.for("asset") .for("asset")
.tap(plugin, parserOptions => { .tap(plugin, parserOptions => {
validateOptions(parserSchema, parserOptions, { validateOptions(getParserSchema(), parserOptions, {
name: "Asset Modules Plugin", name: "Asset Modules Plugin",
baseDataPath: "parser" baseDataPath: "parser"
}); });
@ -57,24 +54,38 @@ class AssetModulesPlugin {
}; };
} }
const AssetParser = getAssetParser();
return new AssetParser(dataUrlCondition); return new AssetParser(dataUrlCondition);
}); });
normalModuleFactory.hooks.createParser normalModuleFactory.hooks.createParser
.for("asset/inline") .for("asset/inline")
.tap(plugin, parserOptions => new AssetParser(true)); .tap(plugin, parserOptions => {
const AssetParser = getAssetParser();
return new AssetParser(true);
});
normalModuleFactory.hooks.createParser normalModuleFactory.hooks.createParser
.for("asset/resource") .for("asset/resource")
.tap(plugin, parserOptions => new AssetParser(false)); .tap(plugin, parserOptions => {
const AssetParser = getAssetParser();
return new AssetParser(false);
});
normalModuleFactory.hooks.createParser normalModuleFactory.hooks.createParser
.for("asset/source") .for("asset/source")
.tap(plugin, parserOptions => new AssetParser(false)); .tap(plugin, parserOptions => {
const AssetParser = getAssetParser();
return new AssetParser(false);
});
for (const type of ["asset", "asset/inline"]) { for (const type of ["asset", "asset/inline"]) {
normalModuleFactory.hooks.createGenerator normalModuleFactory.hooks.createGenerator
.for(type) .for(type)
// eslint-disable-next-line no-loop-func // eslint-disable-next-line no-loop-func
.tap(plugin, generatorOptions => { .tap(plugin, generatorOptions => {
validateOptions(generatorSchema, generatorOptions, { validateOptions(getGeneratorSchema(), generatorOptions, {
name: "Asset Modules Plugin", name: "Asset Modules Plugin",
baseDataPath: "generator" baseDataPath: "generator"
}); });
@ -88,15 +99,25 @@ class AssetModulesPlugin {
}; };
} }
const AssetGenerator = getAssetGenerator();
return new AssetGenerator(compilation, dataUrl); return new AssetGenerator(compilation, dataUrl);
}); });
} }
normalModuleFactory.hooks.createGenerator normalModuleFactory.hooks.createGenerator
.for("asset/resource") .for("asset/resource")
.tap(plugin, () => new AssetGenerator(compilation)); .tap(plugin, () => {
const AssetGenerator = getAssetGenerator();
return new AssetGenerator(compilation);
});
normalModuleFactory.hooks.createGenerator normalModuleFactory.hooks.createGenerator
.for("asset/source") .for("asset/source")
.tap(plugin, () => new AssetSourceGenerator()); .tap(plugin, () => {
const AssetSourceGenerator = getAssetSourceGenerator();
return new AssetSourceGenerator();
});
compilation.hooks.renderManifest.tap(plugin, (result, options) => { compilation.hooks.renderManifest.tap(plugin, (result, options) => {
const { chunkGraph } = compilation; const { chunkGraph } = compilation;

View File

@ -5,16 +5,15 @@
"use strict"; "use strict";
const memorize = require("../util/memorize");
const validateOptions = require("schema-utils"); const validateOptions = require("schema-utils");
const JsonGenerator = require("./JsonGenerator"); const JsonGenerator = require("./JsonGenerator");
const JsonParser = require("./JsonParser"); const JsonParser = require("./JsonParser");
/** @typedef {import("../Compiler")} Compiler */ /** @typedef {import("../Compiler")} Compiler */
const lazyRequire = require("../util/lazyRequire")(require); const getParserSchema = memorize(() =>
const parserSchema = lazyRequire( require("../../schemas/plugins/JsonModulesPluginParser.json")
"../../schemas/plugins/JsonModulesPluginParser.json",
false
); );
class JsonModulesPlugin { class JsonModulesPlugin {
@ -30,7 +29,7 @@ class JsonModulesPlugin {
normalModuleFactory.hooks.createParser normalModuleFactory.hooks.createParser
.for("json") .for("json")
.tap("JsonModulesPlugin", parserOptions => { .tap("JsonModulesPlugin", parserOptions => {
validateOptions(parserSchema, parserOptions, { validateOptions(getParserSchema(), parserOptions, {
name: "Json Modules Plugin", name: "Json Modules Plugin",
baseDataPath: "parser" baseDataPath: "parser"
}); });

View File

@ -1,47 +0,0 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Ivan Kopeykin @vankop
*/
"use strict";
/* Fork from https://github.com/sindresorhus/import-lazy */
const lazy = (importedModule, requireFn, moduleId) =>
importedModule === undefined ? requireFn(moduleId) : importedModule;
/**
* @template T
* @callback LazyRequire
* @param {string} moduleId path to module
* @param {boolean} [isFunction] flag for Proxy type,
* if true returns function, object otherwise.
* True by default since webpack modules are mostly functions or classes
* @returns {T} module export
*/
/**
* @template T
* @param {Function} requireFn require function relative to parent module
* @returns {LazyRequire<T>} require function
*/
module.exports = requireFn => (moduleId, isFunction = true) => {
let importedModule;
const handler = {
get: (target, property) => {
importedModule = lazy(importedModule, requireFn, moduleId);
return Reflect.get(importedModule, property);
},
apply: (target, thisArgument, argumentsList) => {
importedModule = lazy(importedModule, requireFn, moduleId);
return Reflect.apply(importedModule, thisArgument, argumentsList);
},
construct: (target, argumentsList) => {
importedModule = lazy(importedModule, requireFn, moduleId);
return Reflect.construct(importedModule, argumentsList);
}
};
return new Proxy(isFunction ? function() {} : {}, handler);
};

View File

@ -6,6 +6,7 @@
"use strict"; "use strict";
const { SyncWaterfallHook } = require("tapable"); const { SyncWaterfallHook } = require("tapable");
const memorize = require("../util/memorize");
const Compilation = require("../Compilation"); const Compilation = require("../Compilation");
const Generator = require("../Generator"); const Generator = require("../Generator");
const { tryRunOrWebpackError } = require("../HookWebpackError"); const { tryRunOrWebpackError } = require("../HookWebpackError");
@ -20,15 +21,15 @@ const { compareModulesByIdentifier } = require("../util/comparators");
/** @typedef {import("../Template").RenderManifestEntry} RenderManifestEntry */ /** @typedef {import("../Template").RenderManifestEntry} RenderManifestEntry */
/** @typedef {import("../Template").RenderManifestOptions} RenderManifestOptions */ /** @typedef {import("../Template").RenderManifestOptions} RenderManifestOptions */
const lazyRequire = require("../util/lazyRequire")(require); const getAsyncWebAssemblyGenerator = memorize(() =>
/** @type {typeof import('./AsyncWebAssemblyGenerator')} */ require("./AsyncWebAssemblyGenerator")
const AsyncWebAssemblyGenerator = lazyRequire("./AsyncWebAssemblyGenerator"); );
/** @type {typeof import('./AsyncWebAssemblyJavascriptGenerator')} */ const getAsyncWebAssemblyJavascriptGenerator = memorize(() =>
const AsyncWebAssemblyJavascriptGenerator = lazyRequire( require("./AsyncWebAssemblyJavascriptGenerator")
"./AsyncWebAssemblyJavascriptGenerator" );
const getAsyncWebAssemblyParser = memorize(() =>
require("./AsyncWebAssemblyParser")
); );
/** @type {typeof import('./AsyncWebAssemblyParser')} */
const AsyncWebAssemblyParser = lazyRequire("./AsyncWebAssemblyParser");
/** /**
* @typedef {Object} RenderContext * @typedef {Object} RenderContext
@ -95,13 +96,17 @@ class AsyncWebAssemblyModulesPlugin {
normalModuleFactory.hooks.createParser normalModuleFactory.hooks.createParser
.for("webassembly/async") .for("webassembly/async")
.tap( .tap("AsyncWebAssemblyModulesPlugin", () => {
"AsyncWebAssemblyModulesPlugin", const AsyncWebAssemblyParser = getAsyncWebAssemblyParser();
() => new AsyncWebAssemblyParser()
); return new AsyncWebAssemblyParser();
});
normalModuleFactory.hooks.createGenerator normalModuleFactory.hooks.createGenerator
.for("webassembly/async") .for("webassembly/async")
.tap("AsyncWebAssemblyModulesPlugin", () => { .tap("AsyncWebAssemblyModulesPlugin", () => {
const AsyncWebAssemblyJavascriptGenerator = getAsyncWebAssemblyJavascriptGenerator();
const AsyncWebAssemblyGenerator = getAsyncWebAssemblyGenerator();
return Generator.byType({ return Generator.byType({
javascript: new AsyncWebAssemblyJavascriptGenerator( javascript: new AsyncWebAssemblyJavascriptGenerator(
compilation.outputOptions.webassemblyModuleFilename compilation.outputOptions.webassemblyModuleFilename

View File

@ -6,6 +6,7 @@
"use strict"; "use strict";
const Generator = require("../Generator"); const Generator = require("../Generator");
const memorize = require("../util/memorize");
const WebAssemblyExportImportedDependency = require("../dependencies/WebAssemblyExportImportedDependency"); const WebAssemblyExportImportedDependency = require("../dependencies/WebAssemblyExportImportedDependency");
const WebAssemblyImportDependency = require("../dependencies/WebAssemblyImportDependency"); const WebAssemblyImportDependency = require("../dependencies/WebAssemblyImportDependency");
const { compareModulesByIdentifier } = require("../util/comparators"); const { compareModulesByIdentifier } = require("../util/comparators");
@ -17,16 +18,13 @@ const WebAssemblyInInitialChunkError = require("./WebAssemblyInInitialChunkError
/** @typedef {import("../ModuleTemplate")} ModuleTemplate */ /** @typedef {import("../ModuleTemplate")} ModuleTemplate */
/** @typedef {import("../ModuleTemplate").RenderContext} RenderContext */ /** @typedef {import("../ModuleTemplate").RenderContext} RenderContext */
const lazyRequire = require("../util/lazyRequire")(require); const getWebAssemblyGenerator = memorize(() =>
require("./WebAssemblyGenerator")
/** @type {typeof import('./WebAssemblyGenerator')} */
const WebAssemblyGenerator = lazyRequire("./WebAssemblyGenerator");
/** @type {typeof import('./WebAssemblyJavascriptGenerator')} */
const WebAssemblyJavascriptGenerator = lazyRequire(
"./WebAssemblyJavascriptGenerator"
); );
/** @type {typeof import('./WebAssemblyParser')} */ const getWebAssemblyJavascriptGenerator = memorize(() =>
const WebAssemblyParser = lazyRequire("./WebAssemblyParser"); require("./WebAssemblyJavascriptGenerator")
);
const getWebAssemblyParser = memorize(() => require("./WebAssemblyParser"));
class WebAssemblyModulesPlugin { class WebAssemblyModulesPlugin {
constructor(options) { constructor(options) {
@ -53,11 +51,18 @@ class WebAssemblyModulesPlugin {
normalModuleFactory.hooks.createParser normalModuleFactory.hooks.createParser
.for("webassembly/sync") .for("webassembly/sync")
.tap("WebAssemblyModulesPlugin", () => new WebAssemblyParser()); .tap("WebAssemblyModulesPlugin", () => {
const WebAssemblyParser = getWebAssemblyParser();
return new WebAssemblyParser();
});
normalModuleFactory.hooks.createGenerator normalModuleFactory.hooks.createGenerator
.for("webassembly/sync") .for("webassembly/sync")
.tap("WebAssemblyModulesPlugin", () => { .tap("WebAssemblyModulesPlugin", () => {
const WebAssemblyJavascriptGenerator = getWebAssemblyJavascriptGenerator();
const WebAssemblyGenerator = getWebAssemblyGenerator();
return Generator.byType({ return Generator.byType({
javascript: new WebAssemblyJavascriptGenerator(), javascript: new WebAssemblyJavascriptGenerator(),
webassembly: new WebAssemblyGenerator(this.options) webassembly: new WebAssemblyGenerator(this.options)