mirror of https://github.com/webpack/webpack.git
fix: use `xxhash64` for `cache.hashAlgorithm` when `experiments.futureDefaults` (#19323)
This commit is contained in:
parent
5c51d83932
commit
cb93228ce5
|
@ -8,6 +8,7 @@
|
|||
const util = require("util");
|
||||
const Entrypoint = require("./Entrypoint");
|
||||
const ModuleGraphConnection = require("./ModuleGraphConnection");
|
||||
const { DEFAULTS } = require("./config/defaults");
|
||||
const { first } = require("./util/SetHelpers");
|
||||
const SortableSet = require("./util/SortableSet");
|
||||
const {
|
||||
|
@ -245,7 +246,7 @@ class ChunkGraph {
|
|||
* @param {ModuleGraph} moduleGraph the module graph
|
||||
* @param {string | Hash} hashFunction the hash function to use
|
||||
*/
|
||||
constructor(moduleGraph, hashFunction = "md4") {
|
||||
constructor(moduleGraph, hashFunction = DEFAULTS.HASH_FUNCTION) {
|
||||
/**
|
||||
* @private
|
||||
* @type {WeakMap<Module, ChunkGraphModule>}
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
|
||||
"use strict";
|
||||
|
||||
const { DEFAULTS } = require("./config/defaults");
|
||||
const { getOrInsert } = require("./util/MapHelpers");
|
||||
const { first } = require("./util/SetHelpers");
|
||||
const createHash = require("./util/createHash");
|
||||
|
@ -21,7 +22,7 @@ class CodeGenerationResults {
|
|||
/**
|
||||
* @param {string | Hash} hashFunction the hash function to use
|
||||
*/
|
||||
constructor(hashFunction = "md4") {
|
||||
constructor(hashFunction = DEFAULTS.HASH_FUNCTION) {
|
||||
/** @type {Map<Module, RuntimeSpecMap<CodeGenerationResult>>} */
|
||||
this.map = new Map();
|
||||
this._hashFunction = hashFunction;
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
|
||||
"use strict";
|
||||
|
||||
const { DEFAULTS } = require("./config/defaults");
|
||||
const createHash = require("./util/createHash");
|
||||
|
||||
/** @typedef {import("./Dependency")} Dependency */
|
||||
|
@ -17,7 +18,7 @@ class DependencyTemplates {
|
|||
/**
|
||||
* @param {string | Hash} hashFunction the hash function to use
|
||||
*/
|
||||
constructor(hashFunction = "md4") {
|
||||
constructor(hashFunction = DEFAULTS.HASH_FUNCTION) {
|
||||
/** @type {Map<DependencyConstructor, DependencyTemplate>} */
|
||||
this._map = new Map();
|
||||
/** @type {string} */
|
||||
|
|
|
@ -19,6 +19,7 @@ const {
|
|||
const { JAVASCRIPT_MODULE_TYPE_DYNAMIC } = require("./ModuleTypeConstants");
|
||||
const RuntimeGlobals = require("./RuntimeGlobals");
|
||||
const Template = require("./Template");
|
||||
const { DEFAULTS } = require("./config/defaults");
|
||||
const StaticExportsDependency = require("./dependencies/StaticExportsDependency");
|
||||
const createHash = require("./util/createHash");
|
||||
const extractUrlAndGlobal = require("./util/extractUrlAndGlobal");
|
||||
|
@ -236,7 +237,12 @@ class ModuleExternalInitFragment extends InitFragment {
|
|||
* @param {ImportDependencyMeta=} dependencyMeta the dependency meta
|
||||
* @param {string | HashConstructor=} hashFunction the hash function to use
|
||||
*/
|
||||
constructor(request, ident, dependencyMeta, hashFunction = "md4") {
|
||||
constructor(
|
||||
request,
|
||||
ident,
|
||||
dependencyMeta,
|
||||
hashFunction = DEFAULTS.HASH_FUNCTION
|
||||
) {
|
||||
if (ident === undefined) {
|
||||
ident = Template.toIdentifier(request);
|
||||
if (ident !== request) {
|
||||
|
|
|
@ -9,6 +9,7 @@ const { create: createResolver } = require("enhanced-resolve");
|
|||
const nodeModule = require("module");
|
||||
const asyncLib = require("neo-async");
|
||||
const { isAbsolute } = require("path");
|
||||
const { DEFAULTS } = require("./config/defaults");
|
||||
const AsyncQueue = require("./util/AsyncQueue");
|
||||
const StackedCacheMap = require("./util/StackedCacheMap");
|
||||
const createHash = require("./util/createHash");
|
||||
|
@ -1067,7 +1068,7 @@ class FileSystemInfo {
|
|||
managedPaths = [],
|
||||
immutablePaths = [],
|
||||
logger,
|
||||
hashFunction = "md4"
|
||||
hashFunction = DEFAULTS.HASH_FUNCTION
|
||||
} = {}
|
||||
) {
|
||||
this.fs = fs;
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
"use strict";
|
||||
|
||||
const NormalModule = require("./NormalModule");
|
||||
const { DEFAULTS } = require("./config/defaults");
|
||||
const createHash = require("./util/createHash");
|
||||
const memoize = require("./util/memoize");
|
||||
|
||||
|
@ -79,7 +80,7 @@ const getBefore = (strFn, token) => () => {
|
|||
* @returns {ReturnStringCallback} a function that returns the hash of the string
|
||||
*/
|
||||
const getHash =
|
||||
(strFn, hashFunction = "md4") =>
|
||||
(strFn, hashFunction = DEFAULTS.HASH_FUNCTION) =>
|
||||
() => {
|
||||
const hash = createHash(hashFunction);
|
||||
hash.update(strFn());
|
||||
|
@ -126,7 +127,7 @@ ModuleFilenameHelpers.createFilename = (
|
|||
// eslint-disable-next-line default-param-last
|
||||
module = "",
|
||||
options,
|
||||
{ requestShortener, chunkGraph, hashFunction = "md4" }
|
||||
{ requestShortener, chunkGraph, hashFunction = DEFAULTS.HASH_FUNCTION }
|
||||
) => {
|
||||
const opts = {
|
||||
namespace: "",
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
|
||||
"use strict";
|
||||
|
||||
const { DEFAULTS } = require("../config/defaults");
|
||||
const createHash = require("../util/createHash");
|
||||
|
||||
/** @typedef {import("../util/Hash")} Hash */
|
||||
|
@ -20,7 +21,7 @@ class LazyHashedEtag {
|
|||
* @param {HashableObject} obj object with updateHash method
|
||||
* @param {string | HashConstructor} hashFunction the hash function to use
|
||||
*/
|
||||
constructor(obj, hashFunction = "md4") {
|
||||
constructor(obj, hashFunction = DEFAULTS.HASH_FUNCTION) {
|
||||
this._obj = obj;
|
||||
this._hash = undefined;
|
||||
this._hashFunction = hashFunction;
|
||||
|
@ -50,7 +51,7 @@ const mapObjects = new WeakMap();
|
|||
* @param {(string | HashConstructor)=} hashFunction the hash function to use
|
||||
* @returns {LazyHashedEtag} etag
|
||||
*/
|
||||
const getter = (obj, hashFunction = "md4") => {
|
||||
const getter = (obj, hashFunction = DEFAULTS.HASH_FUNCTION) => {
|
||||
let innerMap;
|
||||
if (typeof hashFunction === "string") {
|
||||
innerMap = mapStrings.get(hashFunction);
|
||||
|
|
|
@ -79,6 +79,10 @@ const {
|
|||
|
||||
const NODE_MODULES_REGEXP = /[\\/]node_modules[\\/]/i;
|
||||
const DEFAULT_CACHE_NAME = "default";
|
||||
const DEFAULTS = {
|
||||
// TODO webpack 6 - use xxhash64
|
||||
HASH_FUNCTION: "md4"
|
||||
};
|
||||
|
||||
/**
|
||||
* Sets a constant default value when undefined
|
||||
|
@ -221,6 +225,7 @@ const applyWebpackOptionsDefaults = (options, compilerIndex) => {
|
|||
mode: mode || "production",
|
||||
development,
|
||||
cacheUnaffected: options.experiments.cacheUnaffected,
|
||||
futureDefaults,
|
||||
compilerIndex
|
||||
});
|
||||
const cache = Boolean(options.cache);
|
||||
|
@ -398,6 +403,7 @@ const applyExperimentsDefaults = (
|
|||
* @param {object} options options
|
||||
* @param {string} options.name name
|
||||
* @param {Mode} options.mode mode
|
||||
* @param {boolean} options.futureDefaults is future defaults enabled
|
||||
* @param {boolean} options.development is development mode
|
||||
* @param {number} [options.compilerIndex] index of compiler
|
||||
* @param {Experiments["cacheUnaffected"]} options.cacheUnaffected the cacheUnaffected experiment is enabled
|
||||
|
@ -405,7 +411,7 @@ const applyExperimentsDefaults = (
|
|||
*/
|
||||
const applyCacheDefaults = (
|
||||
cache,
|
||||
{ name, mode, development, cacheUnaffected, compilerIndex }
|
||||
{ name, mode, development, cacheUnaffected, compilerIndex, futureDefaults }
|
||||
) => {
|
||||
if (cache === false) return;
|
||||
switch (cache.type) {
|
||||
|
@ -448,7 +454,7 @@ const applyCacheDefaults = (
|
|||
/** @type {NonNullable<FileCacheOptions["name"]>} */ (cache.name)
|
||||
)
|
||||
);
|
||||
D(cache, "hashAlgorithm", "md4");
|
||||
D(cache, "hashAlgorithm", futureDefaults ? "xxhash64" : "md4");
|
||||
D(cache, "store", "pack");
|
||||
D(cache, "compression", false);
|
||||
D(cache, "profile", false);
|
||||
|
@ -1277,7 +1283,14 @@ const applyOutputDefaults = (
|
|||
);
|
||||
D(output, "workerPublicPath", "");
|
||||
D(output, "chunkLoadTimeout", 120000);
|
||||
D(output, "hashFunction", futureDefaults ? "xxhash64" : "md4");
|
||||
F(output, "hashFunction", () => {
|
||||
if (futureDefaults) {
|
||||
DEFAULTS.HASH_FUNCTION = "xxhash64";
|
||||
return "xxhash64";
|
||||
}
|
||||
|
||||
return "md4";
|
||||
});
|
||||
D(output, "hashDigest", "hex");
|
||||
D(output, "hashDigestLength", futureDefaults ? 16 : 20);
|
||||
D(output, "strictModuleErrorHandling", false);
|
||||
|
@ -1724,3 +1737,4 @@ const applyInfrastructureLoggingDefaults = infrastructureLogging => {
|
|||
module.exports.applyWebpackOptionsBaseDefaults =
|
||||
applyWebpackOptionsBaseDefaults;
|
||||
module.exports.applyWebpackOptionsDefaults = applyWebpackOptionsDefaults;
|
||||
module.exports.DEFAULTS = DEFAULTS;
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
|
||||
"use strict";
|
||||
|
||||
const { DEFAULTS } = require("../config/defaults");
|
||||
const {
|
||||
compareModulesByPreOrderIndexOrIdentifier
|
||||
} = require("../util/comparators");
|
||||
|
@ -37,7 +38,7 @@ class HashedModuleIdsPlugin {
|
|||
/** @type {HashedModuleIdsPluginOptions} */
|
||||
this.options = {
|
||||
context: undefined,
|
||||
hashFunction: "md4",
|
||||
hashFunction: DEFAULTS.HASH_FUNCTION,
|
||||
hashDigest: "base64",
|
||||
hashDigestLength: 4,
|
||||
...options
|
||||
|
|
|
@ -20,6 +20,7 @@ const { JS_TYPES } = require("../ModuleSourceTypesConstants");
|
|||
const { JAVASCRIPT_MODULE_TYPE_ESM } = require("../ModuleTypeConstants");
|
||||
const RuntimeGlobals = require("../RuntimeGlobals");
|
||||
const Template = require("../Template");
|
||||
const { DEFAULTS } = require("../config/defaults");
|
||||
const HarmonyImportDependency = require("../dependencies/HarmonyImportDependency");
|
||||
const JavascriptParser = require("../javascript/JavascriptParser");
|
||||
const { equals } = require("../util/ArrayHelpers");
|
||||
|
@ -623,7 +624,7 @@ class ConcatenatedModule extends Module {
|
|||
runtime,
|
||||
compilation,
|
||||
associatedObjectForCache,
|
||||
hashFunction = "md4"
|
||||
hashFunction = DEFAULTS.HASH_FUNCTION
|
||||
) {
|
||||
const identifier = ConcatenatedModule._createIdentifier(
|
||||
rootModule,
|
||||
|
@ -1049,7 +1050,7 @@ class ConcatenatedModule extends Module {
|
|||
rootModule,
|
||||
modules,
|
||||
associatedObjectForCache,
|
||||
hashFunction = "md4"
|
||||
hashFunction = DEFAULTS.HASH_FUNCTION
|
||||
) {
|
||||
const cachedMakePathsRelative = makePathsRelative.bindContextCache(
|
||||
/** @type {string} */ (rootModule.context),
|
||||
|
|
|
@ -13,6 +13,7 @@ const {
|
|||
createGunzip,
|
||||
constants: zConstants
|
||||
} = require("zlib");
|
||||
const { DEFAULTS } = require("../config/defaults");
|
||||
const createHash = require("../util/createHash");
|
||||
const { dirname, join, mkdirp } = require("../util/fs");
|
||||
const memoize = require("../util/memoize");
|
||||
|
@ -107,7 +108,7 @@ const serialize = async (
|
|||
data,
|
||||
name,
|
||||
writeFile,
|
||||
hashFunction = "md4"
|
||||
hashFunction = DEFAULTS.HASH_FUNCTION
|
||||
) => {
|
||||
/** @type {(Buffer[] | Buffer | Promise<SerializeResult>)[]} */
|
||||
const processedData = [];
|
||||
|
@ -434,7 +435,7 @@ class FileMiddleware extends SerializerMiddleware {
|
|||
* @param {IntermediateFileSystem} fs filesystem
|
||||
* @param {string | Hash} hashFunction hash function to use
|
||||
*/
|
||||
constructor(fs, hashFunction = "md4") {
|
||||
constructor(fs, hashFunction = DEFAULTS.HASH_FUNCTION) {
|
||||
super();
|
||||
this.fs = fs;
|
||||
this._hashFunction = hashFunction;
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
"use strict";
|
||||
|
||||
const { DEFAULTS } = require("../config/defaults");
|
||||
const createHash = require("../util/createHash");
|
||||
const ArraySerializer = require("./ArraySerializer");
|
||||
const DateObjectSerializer = require("./DateObjectSerializer");
|
||||
|
@ -204,7 +205,7 @@ class ObjectMiddleware extends SerializerMiddleware {
|
|||
* @param {(context: ObjectSerializerContext | ObjectDeserializerContext) => void} extendContext context extensions
|
||||
* @param {string | Hash} hashFunction hash function to use
|
||||
*/
|
||||
constructor(extendContext, hashFunction = "md4") {
|
||||
constructor(extendContext, hashFunction = DEFAULTS.HASH_FUNCTION) {
|
||||
super();
|
||||
this.extendContext = extendContext;
|
||||
this._hashFunction = hashFunction;
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
"use strict";
|
||||
|
||||
const { DEFAULTS } = require("../config/defaults");
|
||||
const memoize = require("./memoize");
|
||||
|
||||
/** @typedef {import("../serialization/BinaryMiddleware").MEASURE_END_OPERATION_TYPE} MEASURE_END_OPERATION */
|
||||
|
@ -97,7 +98,7 @@ module.exports = {
|
|||
);
|
||||
};
|
||||
}
|
||||
}, "md4"),
|
||||
}, DEFAULTS.HASH_FUNCTION),
|
||||
binaryMiddleware
|
||||
]));
|
||||
},
|
||||
|
|
|
@ -1945,6 +1945,179 @@ describe("snapshots", () => {
|
|||
+ "cache": true,
|
||||
`)
|
||||
);
|
||||
test(
|
||||
"cache filesystem and futureDefaults",
|
||||
{ cache: { type: "filesystem" }, experiments: { futureDefaults: true } },
|
||||
e =>
|
||||
e.toMatchInlineSnapshot(`
|
||||
- Expected
|
||||
+ Received
|
||||
|
||||
@@ ... @@
|
||||
- "cache": false,
|
||||
+ "cache": Object {
|
||||
+ "allowCollectingMemory": false,
|
||||
+ "buildDependencies": Object {
|
||||
+ "defaultWebpack": Array [
|
||||
+ "<cwd>/lib/",
|
||||
+ ],
|
||||
+ },
|
||||
+ "cacheDirectory": "<cwd>/node_modules/.cache/webpack",
|
||||
+ "cacheLocation": "<cwd>/node_modules/.cache/webpack/default-none",
|
||||
+ "compression": false,
|
||||
+ "hashAlgorithm": "xxhash64",
|
||||
+ "idleTimeout": 60000,
|
||||
+ "idleTimeoutAfterLargeChanges": 1000,
|
||||
+ "idleTimeoutForInitialStore": 5000,
|
||||
+ "maxAge": 5184000000,
|
||||
+ "maxMemoryGenerations": Infinity,
|
||||
+ "memoryCacheUnaffected": false,
|
||||
+ "name": "default-none",
|
||||
+ "profile": false,
|
||||
+ "readonly": false,
|
||||
+ "store": "pack",
|
||||
+ "type": "filesystem",
|
||||
+ "version": "",
|
||||
+ },
|
||||
@@ ... @@
|
||||
- "asyncWebAssembly": false,
|
||||
- "backCompat": true,
|
||||
+ "asyncWebAssembly": true,
|
||||
+ "backCompat": false,
|
||||
@@ ... @@
|
||||
- "cacheUnaffected": false,
|
||||
- "css": undefined,
|
||||
- "futureDefaults": false,
|
||||
+ "cacheUnaffected": true,
|
||||
+ "css": true,
|
||||
+ "futureDefaults": true,
|
||||
@@ ... @@
|
||||
+ },
|
||||
+ Object {
|
||||
+ "rules": Array [
|
||||
+ Object {
|
||||
+ "descriptionData": Object {
|
||||
+ "type": "module",
|
||||
+ },
|
||||
+ "resolve": Object {
|
||||
+ "fullySpecified": true,
|
||||
+ },
|
||||
+ },
|
||||
+ ],
|
||||
+ "test": /\\.wasm$/i,
|
||||
+ "type": "webassembly/async",
|
||||
+ },
|
||||
+ Object {
|
||||
+ "mimetype": "application/wasm",
|
||||
+ "rules": Array [
|
||||
+ Object {
|
||||
+ "descriptionData": Object {
|
||||
+ "type": "module",
|
||||
+ },
|
||||
+ "resolve": Object {
|
||||
+ "fullySpecified": true,
|
||||
+ },
|
||||
+ },
|
||||
+ ],
|
||||
+ "type": "webassembly/async",
|
||||
+ },
|
||||
+ Object {
|
||||
+ "resolve": Object {
|
||||
+ "fullySpecified": true,
|
||||
+ "preferRelative": true,
|
||||
+ },
|
||||
+ "test": /\\.css$/i,
|
||||
+ "type": "css/auto",
|
||||
+ },
|
||||
+ Object {
|
||||
+ "mimetype": "text/css+module",
|
||||
+ "resolve": Object {
|
||||
+ "fullySpecified": true,
|
||||
+ "preferRelative": true,
|
||||
+ },
|
||||
+ "type": "css/module",
|
||||
+ },
|
||||
+ Object {
|
||||
+ "mimetype": "text/css",
|
||||
+ "resolve": Object {
|
||||
+ "fullySpecified": true,
|
||||
+ "preferRelative": true,
|
||||
+ },
|
||||
+ "type": "css",
|
||||
@@ ... @@
|
||||
+ "css": Object {
|
||||
+ "esModule": true,
|
||||
+ "exportsOnly": false,
|
||||
+ },
|
||||
+ "css/auto": Object {
|
||||
+ "exportsConvention": "as-is",
|
||||
+ "localIdentName": "[uniqueName]-[id]-[local]",
|
||||
+ },
|
||||
+ "css/global": Object {
|
||||
+ "exportsConvention": "as-is",
|
||||
+ "localIdentName": "[uniqueName]-[id]-[local]",
|
||||
+ },
|
||||
+ "css/module": Object {
|
||||
+ "exportsConvention": "as-is",
|
||||
+ "localIdentName": "[uniqueName]-[id]-[local]",
|
||||
+ },
|
||||
@@ ... @@
|
||||
+ },
|
||||
@@ ... @@
|
||||
+ "css": Object {
|
||||
+ "import": true,
|
||||
+ "namedExports": true,
|
||||
+ "url": true,
|
||||
@@ ... @@
|
||||
+ "exportsPresence": "error",
|
||||
@@ ... @@
|
||||
- "unsafeCache": false,
|
||||
+ "unsafeCache": [Function anonymous],
|
||||
@@ ... @@
|
||||
- "__dirname": "mock",
|
||||
- "__filename": "mock",
|
||||
- "global": true,
|
||||
+ "__dirname": "warn-mock",
|
||||
+ "__filename": "warn-mock",
|
||||
+ "global": "warn",
|
||||
@@ ... @@
|
||||
+ "css",
|
||||
@@ ... @@
|
||||
- "charset": true,
|
||||
+ "charset": false,
|
||||
@@ ... @@
|
||||
- "hashDigestLength": 20,
|
||||
- "hashFunction": "md4",
|
||||
+ "hashDigestLength": 16,
|
||||
+ "hashFunction": "xxhash64",
|
||||
@@ ... @@
|
||||
+ "css-import": Object {
|
||||
+ "conditionNames": Array [
|
||||
+ "webpack",
|
||||
+ "production",
|
||||
+ "style",
|
||||
+ ],
|
||||
+ "extensions": Array [
|
||||
+ ".css",
|
||||
+ ],
|
||||
+ "mainFields": Array [
|
||||
+ "style",
|
||||
+ "...",
|
||||
+ ],
|
||||
+ "mainFiles": Array [],
|
||||
+ "preferRelative": true,
|
||||
+ },
|
||||
@@ ... @@
|
||||
- "cache": false,
|
||||
+ "cache": true,
|
||||
@@ ... @@
|
||||
- "cache": false,
|
||||
+ "cache": true,
|
||||
@@ ... @@
|
||||
- "<cwd>/node_modules/",
|
||||
+ /^(.+?[\\\\/]node_modules[\\\\/])/,
|
||||
`)
|
||||
);
|
||||
|
||||
test(
|
||||
"disable",
|
||||
|
|
Loading…
Reference in New Issue