Hexo 源代码分析【2】:了解扩展
使用 Hexo,痛骂 Hexo,理解 Hexo,成为 Hexo。
这篇文章是用来记录我阅读 Hexo 源代码的过程和分析。
在 上一篇文章 中,我们了解了 Hexo 源代码中的入口文件,并且在没有讲太多细节的情况下过了一遍 Hexo 运行的流程。
js
1 | class Hexo extends events_1.EventEmitter { |
简单来说是:
- 初始化了各种目录路径、设置环境变量、初始化各种扩展,设置配置、日志、渲染器、路由等。
_bindLocals方法将数据库中的数据绑定到locals对象上。init方法初始化Hexo,加载插件和配置。call方法调用控制台命令。model方法创建或获取数据库模型。resolvePlugin和loadPlugin方法用于解析和加载插件。load和watch方法加载数据并处理源文件,watch方法还会设置文件监听。_generate方法生成静态文件。exit方法退出程序,执行清理工作。
这次,我们来了解一下扩展(extend)。请配合 官方文档 食用。
扩展
extend\index.js:
js
1 | ; |
这段代码需要在技术层面来讲解。它一个 TypeScript 编译后的 JavaScript 模块,主要用于导出多个类或函数。
用于处理 ES 模块的默认导出的辅助函数:
js
1 | var __importDefault = (this && this.__importDefault) || function (mod) { |
这行代码将当前模块标记为 ES 模块:
js
1 | Object.defineProperty(exports, "__esModule", { value: true }); |
预先声明了所有将要导出的属性:
js
1 | exports.Tag = exports.Renderer = exports.Processor = exports.Migrator = exports.Injector = exports.Highlight = exports.Helper = exports.Generator = exports.Filter = exports.Deployer = exports.Console = void 0; |
接下来的代码块都遵循类似的模式,例如:
js
1 | var console_1 = require("./console"); |
这些代码从其他文件导入模块,然后将它们重新导出。使用 Object.defineProperty 来定义 getter 函数,这样可以实现延迟加载。
简单而言,这段代码的主要目的是将多个相关的模块集中到一个文件中导出,方便其他部分的代码统一导入这些模块。这种模式在大型项目中很常见,可以简化导入语句并提高代码的组织性。
控制台 | Console
控制台是 Hexo 与开发者之间沟通的桥梁。它注册并描述了可用的控制台命令。
js
1 | ; |
Console 类是 Hexo 的控制台命令管理器。
导入的依赖中,bluebird 已经在 上一篇文章 中提过了;abbrev 是用于生成命令别名的包。
在构造函数中,store 和 alias 对象被初始化,分别存储命令和别名。
get方法通过名称获取控制台插件函数。它会将输入的名称转换为小写,并通过别名查找实际的命令。list方法返回所有存储的命令。register方法用于注册新的控制台命令。- 参数包含:
name:命令的名称,必须。desc:命令的描述,可选。options:命令的选项,可选。fn:命令的函数,必须(也必须是一个函数)。
- 使用
bluebird将命令函数fn转换为 Promise,接着将命令存储在store对象中,并更新别名。
- 参数包含:
Console 类的主要作用是管理 Hexo 的控制台命令。它允许注册新命令,检索已存在的命令,并处理命令别名。
根据官网文档的演示,可以这么用:
js
1 | hexo.extend.console.register(name, desc, options, function(args){ |
关于 args 参数,它是通过 Minimist 库解析命令行参数后得到的对象。