serialize(context)
功能总结:
将当前 NormalModule
实例的内部状态序列化(写入缓存),以便后续构建中可以跳过重复的编译过程。 关键点:
- 用
context.write()
将关键内部状态字段(如_source
,error
,_codeGeneratorData
等)写入缓存。 - 最后调用
super.serialize(context)
,让父类Module
的状态也被序列化。
js
/**
* 将当前模块对象序列化(写入缓存)
* @param {ObjectSerializerContext} context 序列化上下文对象,包含 write 方法用于写入数据
*/
serialize(context) {
const { write } = context;
// 序列化模块的私有源码对象(_source)
write(this._source);
// 序列化构建时可能产生的错误
write(this.error);
// 序列化上一次成功构建时的元信息
write(this._lastSuccessfulBuildMeta);
// 序列化是否强制重新构建的标志
write(this._forceBuild);
// 序列化代码生成器的数据
write(this._codeGeneratorData);
// 调用父类的 serialize 方法,序列化父类 Module 的字段
super.serialize(context);
}
static deserialize(context)
功能总结:
作为静态方法,用于从序列化数据中还原出一个 NormalModule
实例 。这个过程是缓存命中时的入口。 关键点:
- 创建一个新的
NormalModule
实例,并传入一堆初始默认值(大多为null
或空字符串),因为实际字段将在反序列化中填充。 - 调用实例的
deserialize(context)
方法读取并恢复数据。 - 返回还原后的模块对象。
js
/**
* 反序列化方法(静态):用于从缓存中还原一个 NormalModule 实例
* @param {ObjectDeserializerContext} context 反序列化上下文对象,包含 read 方法用于读取数据
* @returns {NormalModule} 还原出的 NormalModule 实例
*/
static deserialize(context) {
const obj = new NormalModule({
// 以下字段会在父类 Module 的反序列化过程中恢复,所以先设置为默认值
layer: /** @type {any} */ (null),
type: "",
// 这些字段在后续阶段(如 updateCacheModule)中由缓存填充
resource: "",
context: "",
request: /** @type {any} */ (null),
userRequest: /** @type {any} */ (null),
rawRequest: /** @type {any} */ (null),
loaders: /** @type {any} */ (null),
matchResource: /** @type {any} */ (null),
parser: /** @type {any} */ (null),
parserOptions: /** @type {any} */ (null),
generator: /** @type {any} */ (null),
generatorOptions: /** @type {any} */ (null),
resolveOptions: /** @type {any} */ (null)
});
// 调用实例的反序列化方法,填充各字段值
obj.deserialize(context);
return obj;
}
deserialize(context)
功能总结:
将序列化缓存中的数据逐一读取出来,恢复 NormalModule
实例的内部状态。 关键点:
- 依次使用
context.read()
方法读取_source
、error
、_lastSuccessfulBuildMeta
等属性。 - 最后调用
super.deserialize(context)
,恢复父类Module
的状态。
js
/**
* 实例方法:将缓存中的序列化数据读出,填充到当前对象中
* @param {ObjectDeserializerContext} context 反序列化上下文
*/
deserialize(context) {
const { read } = context;
// 读取序列化时写入的各个字段,恢复状态
this._source = read();
this.error = read();
this._lastSuccessfulBuildMeta = read();
this._forceBuild = read();
this._codeGeneratorData = read();
// 调用父类的反序列化逻辑,恢复父类 Module 的状态
super.deserialize(context);
}