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)到缓存数据的映射。
 * 这些数据可能用于恢复模块的某些状态。
 */
相关推荐
Li_Ning2118 分钟前
【indexedDB】以web端多语言存储为例
前端
北极糊的狐24 分钟前
Vue 的响应式机制未生效——v-model 绑定的冰淇淋输入框值不更新
前端·javascript·vue.js
计算机毕设定制辅导-无忧学长44 分钟前
从入门到精通:HTML 项目实战中的学习进度(一)
前端·学习·html
Microsoft Word44 分钟前
HTML简单介绍
前端·html
爱嘿嘿的小黑1 小时前
docker 常用命令
前端
dangfulin1 小时前
CSS——变换、过度与动画
前端·css
南屿欣风1 小时前
解决 Gin Web 应用中 Air 热部署无效的问题
前端·gin
猿大师办公助手1 小时前
Web网页内嵌福昕OFD版式办公套件实现在线预览编辑PDF、OFD文档
前端·pdf·word
幼儿园技术家2 小时前
什么是RESTful 或 GraphQL?
前端
echola_mendes3 小时前
LangChain 结构化输出:用 Pydantic + PydanticOutputParser 驯服 LLM 的“自由发挥”
服务器·前端·数据库·ai·langchain