Skip to content

Commit

Permalink
Merge pull request #10313 from webpack/perf/caching
Browse files Browse the repository at this point in the history
Performance improvements of cache builds
  • Loading branch information
sokra committed Jan 29, 2020
2 parents fb2446c + 522d80f commit 4e80d26
Show file tree
Hide file tree
Showing 11 changed files with 288 additions and 244 deletions.
45 changes: 32 additions & 13 deletions lib/ChunkGraph.js
Expand Up @@ -24,6 +24,9 @@ const findGraphRoots = require("./util/findGraphRoots");
/** @typedef {import("./ModuleGraph")} ModuleGraph */
/** @typedef {import("./RuntimeModule")} RuntimeModule */

/** @type {ReadonlySet<string>} */
const EMPTY_SET = new Set();

const compareModuleIterables = compareIterables(compareModulesByIdentifier);

/** @typedef {(c: Chunk, chunkGraph: ChunkGraph) => boolean} ChunkFilterPredicate */
Expand Down Expand Up @@ -167,8 +170,8 @@ class ChunkGraphModule {
this.renderedHash = undefined;
/** @type {string | number} */
this.id = null;
/** @type {Set<string>} */
this.runtimeRequirements = new Set();
/** @type {Set<string> | undefined} */
this.runtimeRequirements = undefined;
}
}

Expand All @@ -180,8 +183,8 @@ class ChunkGraphChunk {
this.entryModules = new Map();
/** @type {SortableSet<RuntimeModule>} */
this.runtimeModules = new SortableSet();
/** @type {Set<string>} */
this.runtimeRequirements = new Set();
/** @type {Set<string> | undefined} */
this.runtimeRequirements = undefined;
/** @type {Set<string>} */
this.runtimeRequirementsInTree = new Set();
}
Expand Down Expand Up @@ -1135,24 +1138,38 @@ class ChunkGraph {

/**
* @param {Module} module the module
* @param {Iterable<string>} items runtime requirements to be added
* @param {Set<string>} items runtime requirements to be added (ownership of this Set is given to ChunkGraph)
* @returns {void}
*/
addModuleRuntimeRequirements(module, items) {
const cgm = this._getChunkGraphModule(module);
const runtimeRequirements = cgm.runtimeRequirements;
for (const item of items) runtimeRequirements.add(item);
if (runtimeRequirements === undefined) {
cgm.runtimeRequirements = items;
} else if (runtimeRequirements.size >= items.size) {
for (const item of items) runtimeRequirements.add(item);
} else {
for (const item of runtimeRequirements) items.add(item);
cgm.runtimeRequirements = items;
}
}

/**
* @param {Chunk} chunk the chunk
* @param {Iterable<string>} items runtime requirements to be added
* @param {Set<string>} items runtime requirements to be added (ownership of this Set is given to ChunkGraph)
* @returns {void}
*/
addChunkRuntimeRequirements(chunk, items) {
const cgc = this._getChunkGraphChunk(chunk);
const runtimeRequirements = cgc.runtimeRequirements;
for (const item of items) runtimeRequirements.add(item);
if (runtimeRequirements === undefined) {
cgc.runtimeRequirements = items;
} else if (runtimeRequirements.size >= items.size) {
for (const item of items) runtimeRequirements.add(item);
} else {
for (const item of runtimeRequirements) items.add(item);
cgc.runtimeRequirements = items;
}
}

/**
Expand All @@ -1168,25 +1185,27 @@ class ChunkGraph {

/**
* @param {Module} module the module
* @returns {Set<string>} runtime requirements
* @returns {ReadonlySet<string>} runtime requirements
*/
getModuleRuntimeRequirements(module) {
const cgm = this._getChunkGraphModule(module);
return cgm.runtimeRequirements;
const runtimeRequirements = cgm.runtimeRequirements;
return runtimeRequirements === undefined ? EMPTY_SET : runtimeRequirements;
}

/**
* @param {Chunk} chunk the chunk
* @returns {Set<string>} runtime requirements
* @returns {ReadonlySet<string>} runtime requirements
*/
getChunkRuntimeRequirements(chunk) {
const cgc = this._getChunkGraphChunk(chunk);
return cgc.runtimeRequirements;
const runtimeRequirements = cgc.runtimeRequirements;
return runtimeRequirements === undefined ? EMPTY_SET : runtimeRequirements;
}

/**
* @param {Chunk} chunk the chunk
* @returns {Set<string>} runtime requirements
* @returns {ReadonlySet<string>} runtime requirements
*/
getTreeRuntimeRequirements(chunk) {
const cgc = this._getChunkGraphChunk(chunk);
Expand Down
15 changes: 8 additions & 7 deletions lib/Compilation.js
Expand Up @@ -1292,13 +1292,13 @@ class Compilation {
contextDependencies,
missingDependencies
} = result;
if (fileDependencies) {
if (fileDependencies && fileDependencies.size > 0) {
this.fileDependencies.addAll(fileDependencies);
}
if (contextDependencies) {
if (contextDependencies && contextDependencies.size > 0) {
this.contextDependencies.addAll(contextDependencies);
}
if (missingDependencies) {
if (missingDependencies && missingDependencies.size > 0) {
this.missingDependencies.addAll(missingDependencies);
}
}
Expand Down Expand Up @@ -1800,7 +1800,7 @@ class Compilation {
let set;
const runtimeRequirements = this.codeGenerationResults.get(module)
.runtimeRequirements;
if (runtimeRequirements) {
if (runtimeRequirements && runtimeRequirements.size > 0) {
set = new Set(runtimeRequirements);
} else if (additionalModuleRuntimeRequirements.isUsed()) {
set = new Set();
Expand Down Expand Up @@ -1892,9 +1892,10 @@ class Compilation {
const exportsInfo = this.moduleGraph.getExportsInfo(module);
exportsInfo.setHasProvideInfo();
exportsInfo.setUsedForSideEffectsOnly();
this.chunkGraph.addModuleRuntimeRequirements(module, [
RuntimeGlobals.requireScope
]);
this.chunkGraph.addModuleRuntimeRequirements(
module,
new Set([RuntimeGlobals.requireScope])
);

// runtime modules don't need ids
this.chunkGraph.setModuleId(module, "");
Expand Down
18 changes: 9 additions & 9 deletions lib/ContextModule.js
Expand Up @@ -969,25 +969,25 @@ module.exports = webpackEmptyAsyncContext;`;
"javascript",
this.getSource(this.getSourceString(this.options.mode, context))
);
const set = [];
const set = new Set();
const allDeps = /** @type {ContextElementDependency[]} */ (this.dependencies.concat(
this.blocks.map(b => b.dependencies[0])
));
set.push(RuntimeGlobals.module);
set.push(RuntimeGlobals.hasOwnProperty);
set.add(RuntimeGlobals.module);
set.add(RuntimeGlobals.hasOwnProperty);
if (allDeps.length > 0) {
const asyncMode = this.options.mode;
set.push(RuntimeGlobals.require);
set.add(RuntimeGlobals.require);
if (asyncMode === "weak") {
set.push(RuntimeGlobals.moduleFactories);
set.add(RuntimeGlobals.moduleFactories);
} else if (asyncMode === "async-weak") {
set.push(RuntimeGlobals.moduleFactories);
set.push(RuntimeGlobals.ensureChunk);
set.add(RuntimeGlobals.moduleFactories);
set.add(RuntimeGlobals.ensureChunk);
} else if (asyncMode === "lazy" || asyncMode === "lazy-once") {
set.push(RuntimeGlobals.ensureChunk);
set.add(RuntimeGlobals.ensureChunk);
}
if (this.getFakeMap(allDeps, chunkGraph) !== 9) {
set.push(RuntimeGlobals.createFakeNamespaceObject);
set.add(RuntimeGlobals.createFakeNamespaceObject);
}
}
return {
Expand Down
6 changes: 5 additions & 1 deletion lib/DelegatedModule.js
Expand Up @@ -31,6 +31,10 @@ const StaticExportsDependency = require("./dependencies/StaticExportsDependency"
/** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */

const TYPES = new Set(["javascript"]);
const RUNTIME_REQUIREMENTS = new Set([
RuntimeGlobals.module,
RuntimeGlobals.require
]);

class DelegatedModule extends Module {
constructor(sourceRequest, data, type, userRequest, originalRequest) {
Expand Down Expand Up @@ -156,7 +160,7 @@ class DelegatedModule extends Module {

return {
sources,
runtimeRequirements: [RuntimeGlobals.module, RuntimeGlobals.require]
runtimeRequirements: RUNTIME_REQUIREMENTS
};
}

Expand Down
6 changes: 5 additions & 1 deletion lib/DllModule.js
Expand Up @@ -26,6 +26,10 @@ const RuntimeGlobals = require("./RuntimeGlobals");
/** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */

const TYPES = new Set(["javascript"]);
const RUNTIME_REQUIREMENTS = new Set([
RuntimeGlobals.require,
RuntimeGlobals.module
]);

class DllModule extends Module {
constructor(context, dependencies, name) {
Expand Down Expand Up @@ -84,7 +88,7 @@ class DllModule extends Module {
);
return {
sources,
runtimeRequirements: [RuntimeGlobals.require, RuntimeGlobals.module]
runtimeRequirements: RUNTIME_REQUIREMENTS
};
}

Expand Down
3 changes: 2 additions & 1 deletion lib/ExternalModule.js
Expand Up @@ -124,6 +124,7 @@ const getSourceForDefaultCase = (optional, request, runtimeTemplate) => {
};

const TYPES = new Set(["javascript"]);
const RUNTIME_REQUIREMENTS = new Set([RuntimeGlobals.module]);

class ExternalModule extends Module {
constructor(request, type, userRequest) {
Expand Down Expand Up @@ -261,7 +262,7 @@ class ExternalModule extends Module {
sources.set("javascript", new RawSource(sourceString));
}

return { sources, runtimeRequirements: [RuntimeGlobals.module] };
return { sources, runtimeRequirements: RUNTIME_REQUIREMENTS };
}

/**
Expand Down

0 comments on commit 4e80d26

Please sign in to comment.