错误处理与模块缺失相关方法
-
throwMissingModuleErrorBlock({ request })
- 生成同步语句的抛错代码块。
- 返回
var e = new Error(...); throw e; 形式。
-
throwMissingModuleErrorFunction({ request })
- 返回一个函数定义,内部执行
throwMissingModuleErrorBlock()。
- 用于异步场景。
-
missingModule({ request })
- 返回一个执行
throwMissingModuleErrorFunction() 的 IIFE 表达式。
- 用于作为表达式引发错误。
-
missingModuleStatement({ request })
- 返回完整语句版本的错误抛出,包括
;\n。
- 用于代码块中。
-
missingModulePromise({ request })
- 返回基于
Promise.resolve().then(...) 的异步错误抛出。
- 用于动态 import 异步模块失败的场景。
-
weakError({ module, chunkGraph, request, idExpr, type })
- 用于生成“弱依赖”缺失时的错误提示代码。
- 支持三种输出形式:
statements(语句)、promise(异步)、expression(表达式)。
🔹 模块 ID 与模块导入相关方法
-
moduleId({ module, chunkGraph, request, weak })
- 返回模块 ID 字符串(如
"123"),并带上注释。
- 如果模块为弱依赖且无 ID,返回
null /* weak dependency */。
- 若不是弱依赖但无 ID,则抛出异常。
-
moduleRaw({ module, chunkGraph, request, weak, runtimeRequirements })
- 返回
require(moduleId) 表达式。
- 同时添加
RuntimeGlobals.require 到依赖集合中。
- 处理模块缺失和弱依赖报错。
-
moduleExports(...)
- 等价于调用
moduleRaw()。
- 用于获取模块导出的表达式。
🔹 注释生成工具
-
comment({ request, chunkName, chunkReason, message, exportName })
- 生成模块注释字符串。
- 根据
outputOptions.pathinfo 决定注释内容丰富程度。
- 返回多行或单行注释样式。
comment({ request, chunkName, chunkReason, message, exportName }) {
let content;
if (this.outputOptions.pathinfo) {
content = [message, request, chunkName, chunkReason]
.filter(Boolean)
.map(item => this.requestShortener.shorten(item))
.join(" | ");
} else {
content = [message, chunkName, chunkReason]
.filter(Boolean)
.map(item => this.requestShortener.shorten(item))
.join(" | ");
}
if (!content) return "";
if (this.outputOptions.pathinfo) {
return `${Template.toComment(content)} `;
}
return `${Template.toNormalComment(content)} `;
}
throwMissingModuleErrorBlock({ request }) {
const err = `Cannot find module '${request}'`;
return `var e = new Error(${JSON.stringify(err)}); e.code = 'MODULE_NOT_FOUND'; throw e;`;
}
throwMissingModuleErrorFunction({ request }) {
return `function webpackMissingModule() { ${this.throwMissingModuleErrorBlock({ request })} }`;
}
missingModule({ request }) {
return `Object(${this.throwMissingModuleErrorFunction({ request })}())`;
}
missingModuleStatement({ request }) {
return `${this.missingModule({ request })};\n`;
}
missingModulePromise({ request }) {
return `Promise.resolve().then(${this.throwMissingModuleErrorFunction({ request })})`;
}
weakError({ module, chunkGraph, request, idExpr, type }) {
const moduleId = chunkGraph.getModuleId(module);
const errorMessage =
moduleId === null
? JSON.stringify("Module is not available (weak dependency)")
: idExpr
? `"Module '" + ${idExpr} + "' is not available (weak dependency)"`
: JSON.stringify(`Module '${moduleId}' is not available (weak dependency)`);
const comment = request ? `${Template.toNormalComment(request)} ` : "";
const errorStatements = `var e = new Error(${errorMessage}); ${comment}e.code = 'MODULE_NOT_FOUND'; throw e;`;
switch (type) {
case "statements":
return errorStatements;
case "promise":
return `Promise.resolve().then(${this.basicFunction("", errorStatements)})`;
case "expression":
return this.iife("", errorStatements);
}
}
moduleId({ module, chunkGraph, request, weak }) {
if (!module) {
return this.missingModule({ request });
}
const moduleId = chunkGraph.getModuleId(module);
if (moduleId === null) {
if (weak) {
return "null /* weak dependency, without id */";
}
throw new Error(`RuntimeTemplate.moduleId(): ${noModuleIdErrorMessage(module, chunkGraph)}`);
}
return `${this.comment({ request })}${JSON.stringify(moduleId)}`;
}
moduleRaw({ module, chunkGraph, request, weak, runtimeRequirements }) {
if (!module) {
return this.missingModule({ request });
}
const moduleId = chunkGraph.getModuleId(module);
if (moduleId === null) {
if (weak) {
return this.weakError({ module, chunkGraph, request, type: "expression" });
}
throw new Error(`RuntimeTemplate.moduleId(): ${noModuleIdErrorMessage(module, chunkGraph)}`);
}
runtimeRequirements.add(RuntimeGlobals.require);
return `${RuntimeGlobals.require}(${this.moduleId({ module, chunkGraph, request, weak })})`;
}
moduleExports({ module, chunkGraph, request, weak, runtimeRequirements }) {
return this.moduleRaw({ module, chunkGraph, request, weak, runtimeRequirements });
}