コマンドとしてもライブラリとしても動くnode.jsスクリプト

Perlではモジュールとコマンドの拡張子が違うのであまりやりませんが、node.jsスクリプトだとたまに必要になるので備忘録として。
process.argv[1]がnode(1)に渡されたスクリプト名、__filenameがスクリプトファイルの名前なので、これが一致したときはメイン関数を呼ぶだけですね。

#!/usr/bin/env node
"use strict";

function hello() {
    console.log("Hello, world!");
}

if(process.argv[1] === __filename) {
    hello();
}
else {
    module.exports = hello;
}
$ node hello.js
Hello, world!

$ node -e 'var hello = require("./hello"); hello()'
Hello, world!