openclaw.mjs 是 OpenClaw 项目的命令行入口文件,负责在启动主程序前执行一系列关键的初始化操作,确保运行环境正确并加载实际的应用入口。其核心功能如下:
1. Node.js 版本检查
- 若当前版本过低,输出错误信息(含
nvm使用提示)并终止进程,避免因版本不兼容导致运行时异常。
ts
const parseNodeVersion = (rawVersion) => {
const [majorRaw = "0", minorRaw = "0"] = rawVersion.split(".");
return {
major: Number(majorRaw),
minor: Number(minorRaw),
};
};
2. 启用编译缓存
- 调用
module.enableCompileCache()启用 V8 代码缓存(除非设置了环境变量NODE_DISABLE_COMPILE_CACHE),加速后续模块加载,改善 CLI 响应速度。
ts
const ensureSupportedNodeVersion = () => {
if (isSupportedNodeVersion(parseNodeVersion(process.versions.node))) {
return;
}
...
ensureSupportedNodeVersion();
关于
node:module
node:module模块的主要功能可以分为以下四类,我们先通过一个表格快速了解:
功能类别 核心API 主要作用与比喻 1. 模块信息查询 builtinModules,isBuiltin()获取所有内置模块列表,或判断一个模块名是否为内置模块,就像是 Node.js 模块系统的"户口本"和"身份证查验员"。 2. 模块兼容与转换 createRequire()在 ES Module (ESM) 环境中创建一个 require()函数,以便加载 CommonJS 模块。它就像是在"现代小区"(ESM)和"老式楼房"(CommonJS)之间搭建的一座桥梁。3. 模块加载定制 register()允许你注册自定义的钩子函数,从而深度定制 Node.js 的模块解析(resolve) 和加载(load) 行为。这是赋予开发者"上帝视角"来重塑模块加载规则的核心工具。 4. 模块状态同步 syncBuiltinESMExports()手动同步内置模块的 CommonJS 和 ES Module 两种导出方式之间的状态。它像一个"同步开关",确保在修改了内置模块的 CJS 导出后,其 ESM 的实时绑定也能保持一致。
3. 安装进程警告过滤器
- 动态导入
dist/warning-filter.js或.mjs,执行其中的installProcessWarningFilter函数。 - 该函数会包装
process.emitWarning,过滤掉不必要的警告(如实验性特性警告),使控制台输出更干净,与 TypeScript 运行时的警告行为保持一致。
javascript
const installProcessWarningFilter = async () => {
// Keep bootstrap warnings consistent with the TypeScript runtime.
for (const specifier of ["./dist/warning-filter.js", "./dist/warning-filter.mjs"]) {
try {
const mod = await import(specifier);
if (typeof mod.installProcessWarningFilter === "function") {
mod.installProcessWarningFilter();
return;
}
} catch (err) {
...
}
}
};
4. 定位并加载主入口
- 依次尝试导入
dist/entry.js和dist/entry.mjs(构建产物的主入口文件)。 - 若均失败,抛出错误提示"构建输出缺失",引导用户先执行构建。
csharp
if (await tryImport("./dist/entry.js")) {
// OK
} else if (await tryImport("./dist/entry.mjs")) {
// OK
} else {
...
}