fs-extraパッケージの置き換え

fs-extraパッケージを便利に使っていたのだが、よくよく確認してみるとreadJson()outputFile()だけしか使っていなかった。それらを使うだけにはfs-extraパッケージはちょっと大きすぎる。両者はコア・モジュールと小さなパッケージでどうにかなりそうなので、ついにという感じで書き換えていくことにした。

指定したパスを読み、JSONとしてパースし、オブジェクトに格納してくれるreadJson()は、fsモジュールとJSON#parse()を組み合わせるだけで置き換えられる。BOMがありそうならそれに気を付けるくらいで良いだろう。

outputFile()は親のディレクトリーがなかったら自動的に作ってくれるものだ。これはコア・モジュールだけで実装するとかなり辛いので、安定のmkdirpを使うのが良さそうだ。

var fs = require("fs");
var mkdirp = require("mkdirp");
var path = require("path");

var data = "Hi!";
var dest = "/some/non/existent/path/to/dest.ext";

// fs-extra.outputFile(dest, data, function (err) {});
mkdirp(path.dirname(dest), function (err) {
  if (err) {
    throw err;
  }

  fs.writeFile(dest, data, function (err2) {
    if (err2) {
      throw err2;
    }
  });
});

書き換えの主な理由は最初に書いたように大きすぎることだ。もうひとつ隠れた理由として、fs-extraパッケージがいつまでたってもメジャーリリースされず、依存アップデートが面倒になってきたことがある。メジャー・バージョン出るまでは更新しないつもりでいたが、fs-extraパッケージが依存している某パッケージの出す警告のせいで更新を強いられ、嫌になった。