Hexo 内部探訪 (3) コンテキストとしての"hexo"変数

調査の開始にあたって

プラグイン(さしあたりTagプラグインを想定)の実装中にて参照できる変数やオブジェクトを、調べてまとめよう。

ドキュメント | Node.jsProcess 等もためになる。

ところで、Node.jsでは、グローバルな空間を参照するためのキーワードがある。
globalである。

また、次のようなやり方で参照する方法もあるようだ。

const { inspect } = require('util');
var g = Function('return this')();
console.log(inspect(g, { depth: 0 }));

これらを駆使しつつ、Hexoの場合には、私が見たところほとんど全ての場所で、hexoという、トップレベルの変数が見えるので、これを足がかりにしたい。
また、他にも使える要素がもしあるなら、確かめたい。

グローバル汚染はなかった

調査を進めてから理解できたことだが、Hexoではグローバル変数、またはグローバル・オブジェクトを使ってはいない。

何らかのプラグインで、グローバルを意図して使うのならばともかくとして、少なくともHexoの本体と言える範囲や、純正/バンドルされた各プラグインでは、グローバル変数は使わないようだ。いわゆる「グローバル汚染」はない。

プラグイン含めて各所で見かけるhexoという変数が存在し、トップレベルの階層にあるし、自ら呼び出しているわけでもないので、私は当初これがグローバル変数なのかな?と勘違いしていました。

しかしこれは、実際には、module.exportsの仕組みによって与えられたもので、各モジュール(概ね各jsファイルに相当)毎にそれぞれエクスポートされていました。

私はこれまでmodule.exportsについて理解していないままでしたが、今回勉強になりました。

(調査中)

Hexoオブジェクト

{
_events: [Object: null prototype] {},
_eventsCount: 0,
_maxListeners: undefined,
base_dir: '/home/naoto/www/MyBlog/',
public_dir: '/home/naoto/www/MyBlog/public/',
source_dir: '/home/naoto/www/MyBlog/source/',
plugin_dir: '/home/naoto/www/MyBlog/node_modules/',
script_dir: '/home/naoto/www/MyBlog/scripts/',
scaffold_dir: '/home/naoto/www/MyBlog/scaffolds/',
theme_dir: '/home/naoto/www/MyBlog/themes/stage/',
theme_script_dir: '/home/naoto/www/MyBlog/themes/stage/scripts/',
env: [Object],
extend: [Object],
config: [Object],
log: [Logger],
render: [Render],
route: [Router],
post: [Post],
scaffold: [Scaffold],
_dbLoaded: true,
_isGenerating: true,
database: [Database],
config_path: '/home/naoto/www/MyBlog/_config.yml',
source: [Source],
theme: [Theme],
locals: [Locals]
}

(進捗途中)