この記事を書いてる人: 
tea

Hexoのプラグイン上でローカルサーバーを立ち上げている状態(hexo server : development環境)なのか、生成・デプロイをしている状態(hexo generate : production環境)なのかを判定したい時がありました。今回はその方法についてまとめてみました。

keyboard

photo by Mr. Alex Garcia - Double Cliche on flickr

ちなみに、Hexoのテーマ上で判定する方法は下記をご覧ください。

当ブログ
Hexoのテンプレート上でserverとgenerateを判定する方法

Ads

プラグイン上で判定する方法とは?

まず先に結論を言ってしまうと、プラグイン上でローカルサーバーなのか、デプロイなのかを判定するには、コマンドの引数を判定すればいいと考えています。

issueではどう議論されているか?

Hexoのissue#371によると、serverコマンド時にオプションとして--env='production'を渡す方法が提案されています。このオプションを指定すると、hexo global変数のenvの値が'development'から上書きされて'production'に変化します。

そこで、プラグイン側ではenvを見ればローカルサーバーが立ち上がっているのか、デプロイしているのかが判定できるという事だそうです。しかし、毎回オプションを指定するのは、かなり面倒。ましてや、Hexoユーザー全てがこのオプションを指定してくれる筈がありません(^^;)

ではどうするのか?

思いついたのが、先に述べたように、hexoコマンドの引数で状態を判定する案です。具体的にはprocess.argvの値を見ます。process.argvは、Node.jsのコマンドの引数を取得できます。

というこで、hexo serverhexo generate(deploy)を判定するには、以下のコードでいけそうです。

hexo-env.js
1
2
3
4
5
6
7
8
9
module.exports.isDev = function(){
if(process.argv.length > 2 && ( process.argv[2].match(/^d/) || process.argv[2].match(/^g/) )){
// console.log("デプロイ");
retrun false;
}else{
// console.log("開発環境");
return true;
}
};

あとは、返ってくる状態true(開発環境)やfalse(デプロイ)に応じて、やりたい処理を切り分けるだけです。

your-hexo-plugin/index.js
1
2
3
4
5
6
7
var hexo_env = require('hexo-env.js');
if( hexo_env.isDev ){
// ローカルサーバーが立ち上がっているときに、やりたい処理
}else{
// デプロイするときに、やりたい処理
}

hexoのキャッシュに注意

Hexoのバージョン3.2以降では、マークダウンをHTMLレンダリングした後のデータがキャッシュされる仕様に変わりました。特にafter_post_renderの中で使う時は気をつけましょう。一度$ hexo serverを実行すると、マークダウンの更新や$ hexo cleanされるまで実行されないケースもあります。

plugin-script.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// after_post_renderは一度キャッシュされると、更新されるまで実行されない。
hexo.extend.filter.register('after_post_render', function (post) {
var hexo_env = require('hexo-env.js');
if( hexo_env.isDev ){
console.log("開発環境");
}else{
console.log("デプロイ");
}
return new Promise(function(resolve , reject){
resolve(post);
});
} , {async: true});

キャッシュデータは$ hexo cleanで初期化する事もできます。

ということで

プラグイン上でローカルサーバーなのか、デプロイなのかを判定するには、hexoコマンドの引数を判定すればいいという話でした。詳しくは、以下のプラグインを使ってみて下さい。

正直なところ、Hexoさんには、Railsのようにenvで一発判別できるようにしてほしいですね。最近のHexoバージョンは混沌としているので、ひとまず過去のバージョンでも利用できるような外部プラグインとして公開してみました。もしもっと良い方法があれば、twitterなどで教えて下さいね。それでは!