webpack 核心编译器 第一节

这一节主要了描述了核心编译器的工具类方法,期中最容易理解的是 unsafeCacheData 存储依赖到模块的映射

js 复制代码
/**
 * @typedef {object} KnownCreateStatsOptionsContext
 * @property {boolean=} forToString
 */

/** @typedef {Record<string, any> & KnownCreateStatsOptionsContext} CreateStatsOptionsContext */
/**
 * CreateStatsOptionsContext 是一个类型定义,表示一个对象,
 * 该对象既包含字符串键的任意值,也包括 KnownCreateStatsOptionsContext 的所有属性。
 */

/** @typedef {{module: Module, hash: string, runtime: RuntimeSpec, runtimes: RuntimeSpec[]}[]} CodeGenerationJobs */
/**
 * CodeGenerationJobs 是一个类型定义,表示一个数组,每个元素是一个对象,
 * 该对象包含:
 * - module: Module 类型,表示 Webpack 处理的模块
 * - hash: string 类型,该模块的哈希值
 * - runtime: RuntimeSpec 类型,代表当前模块的运行时环境
 * - runtimes: RuntimeSpec[] 类型,该模块支持的多个运行时环境
 */

/** @typedef {{javascript: ModuleTemplate}} ModuleTemplates */
/**
 * ModuleTemplates 是一个类型定义,表示一个对象,该对象包含:
 * - javascript: ModuleTemplate 类型,代表 JavaScript 模块的模板
 */

/** @typedef {Set<Module>} NotCodeGeneratedModules */
/**
 * NotCodeGeneratedModules 是一个类型定义,表示一个 Set 集合,
 * 其中包含所有未进行代码生成的模块(Module)。
 */

/** @type {AssetInfo} */
const EMPTY_ASSET_INFO = Object.freeze({});
/**
 * EMPTY_ASSET_INFO 是一个常量,表示空的资源信息对象。
 * 通过 Object.freeze 使其不可修改,以确保 Webpack 在运行时不会意外更改该对象。
 */

const esmDependencyCategory = "esm";
/**
 * esmDependencyCategory 是一个字符串常量,表示 ES 模块(ESM)类型的依赖类别。
 */

// TODO webpack 6: remove
/**
 * @deprecated
 * 这是一个用于获取 Webpack `Compilation` 的 `normalModuleLoader` 钩子的函数。
 * Webpack 6 计划移除该钩子,官方建议改用 `NormalModule.getCompilationHooks(compilation).loader`。
 *
 * @param {Compilation} compilation Webpack 编译对象
 * @returns {NormalModuleCompilationHooks["loader"]} hooks 相关钩子
 */
const deprecatedNormalModuleLoaderHook = util.deprecate(
	compilation =>
		require("./NormalModule").getCompilationHooks(compilation).loader,
	"Compilation.hooks.normalModuleLoader was moved to NormalModule.getCompilationHooks(compilation).loader",
	"DEP_WEBPACK_COMPILATION_NORMAL_MODULE_LOADER_HOOK"
);

// TODO webpack 6: remove
/**
 * 该函数用于定义已被移除的 `moduleTemplates` 属性(`asset` 和 `webassembly`)。
 * 调用这些属性会抛出错误,以告知用户这些功能已被删除。
 *
 * @param {ModuleTemplates | undefined} moduleTemplates 需要修改的模块模板对象
 */
const defineRemovedModuleTemplates = moduleTemplates => {
	Object.defineProperties(moduleTemplates, {
		asset: {
			enumerable: false, // 不会出现在 Object.keys() 或 for...in 遍历中
			configurable: false, // 不能删除或重新定义
			get: () => {
				throw new WebpackError(
					"Compilation.moduleTemplates.asset has been removed"
				);
			}
		},
		webassembly: {
			enumerable: false,
			configurable: false,
			get: () => {
				throw new WebpackError(
					"Compilation.moduleTemplates.webassembly has been removed"
				);
			}
		}
	});
	moduleTemplates = undefined; // 清空 moduleTemplates 变量
};

/**
 * 定义 ID 比较器,按 `id` 排序。
 */
const byId = compareSelect(c => c.id, compareIds);

/**
 * 定义 Name 或 Hash 比较器,按 `name` 先排序,如果 `name` 相同,则按 `fullHash` 排序。
 */
const byNameOrHash = concatComparators(
	compareSelect(c => c.name, compareIds),
	compareSelect(c => c.fullHash, compareIds)
);

/**
 * 定义错误信息比较器,按 `message` 排序。
 */
const byMessage = compareSelect(err => `${err.message}`, compareStringsNumeric);

/**
 * 定义模块比较器,按模块的 `identifier()` 进行排序。
 */
const byModule = compareSelect(
	err => (err.module && err.module.identifier()) || "",
	compareStringsNumeric
);

/**
 * 定义错误位置比较器,按 `loc` 进行排序(loc 代表错误发生的位置)。
 */
const byLocation = compareSelect(err => err.loc, compareLocations);

/**
 * 组合多个错误比较器:
 * 1. 先按 `module` 排序
 * 2. 再按 `location` 排序
 * 3. 最后按 `message` 排序
 */
const compareErrors = concatComparators(byModule, byLocation, byMessage);

/** @type {WeakMap<Dependency, Module & { restoreFromUnsafeCache: Function } | null>} */
const unsafeCacheDependencies = new WeakMap();
/**
 * unsafeCacheDependencies 是一个 WeakMap,存储依赖(Dependency)到模块(Module)的映射。
 * 其中,模块包含 `restoreFromUnsafeCache` 方法。
 * 这个映射用于缓存模块,但 Webpack 可能会在未来移除该机制。
 */

/** @type {WeakMap<Module & { restoreFromUnsafeCache: Function }, object>} */
const unsafeCacheData = new WeakMap();
/**
 * unsafeCacheData 是一个 WeakMap,存储模块(Module)到缓存数据的映射。
 * 这些数据可能用于恢复模块的某些状态。
 */
相关推荐
计算机魔术师1 小时前
纽约时报版权诉讼披露:微软高管内部称训练 AI 是人类历史上最大规模劳动窃取
前端
去伪存真1 小时前
大模型的参数量为什么那么大?
前端·人工智能
IT_陈寒1 小时前
Java空指针这次真把我坑惨了
前端·人工智能·后端
八荒启·交互动画3 小时前
# Web特效020—让 Web 特效真正动起来:时间循环应该怎么接
前端·webgl·网页特效·八荒启-交互动画·八荒启
动恰客流统计3 小时前
线下零售数字化浪潮下,客流统计的3个核心发展趋势
大数据·前端·人工智能
用户938515635073 小时前
从小米前端面试题,彻底搞懂闭包、作用域链与 useState 惰性初始化
前端·面试
粥里有勺糖4 小时前
视野修炼第133期 | Native 回春了?
前端·github·agent
aichitang20244 小时前
前端小skill
前端·人工智能·算法·ai·前端框架
前端·柱子5 小时前
q-floodfill白边锯齿?一招搞定抗锯齿边缘问题
前端·html·canva可画
葡萄城技术团队5 小时前
SpreadJS V19.2新特性揭秘:功能区键盘提示
前端