◆ rmdir で再帰的削除ができる

mkdir に続いて rmdir も recursive に対応しました
rimraf を入れたり OS コマンドを直接呼び出したりの手間が省けます

内部的には 1 から実装してるのかとおもいきや rimraf をそのまま取り込んだようです
https://github.com/nodejs/node/pull/29168

経緯はこっちの方が詳しいです
https://github.com/nodejs/node/pull/28208

ファイルシステムにふれる部分で OS 固有の問題もあったりして rimraf は昔から一番使われてるものでそういうところの対処もされているのでそのまま使うのが良いという判断のようです
並列処理的なところでも C++ でするより Node.js レベルでやったほうが libuv のイベントループでの非同期処理で並列実行できてパフォーマンスが良いみたいです

名前については fs.rmdir とは別に shutil を作ることが提案されてましたが すでに shutil って名前のはパッケージはあったり 新しいパッケージを作ることは反対の人が多いようです
個人的にも Python で shutil が分かれてるのは使いやすいと思ってないので fs にまとめてくれてよかたです

rmdir は OS コマンド的にはフォルダを消すものでファイルは削除しません
動作的には rm -rf です
なので混乱するから rmdir じゃないほうが良いという意見も出てますが Node.js だと通常のファイル削除が rm じゃなくて unlink ですでにコマンドと違います
なので rmtree という新しい関数名も出てますが 結局 rmdir に引数追加で決まったようです

rmdir の反対意見には その機能があることを検出できないというのもありました
mkdir のときに 今のバージョンが mkdir に recursive が有効なのかどうかを Node.js の内部で見分ける方法がなくてそれがほしいという意見もでていたそうです
たぶん polyfill 用だと思います
ただそれを理由で rmdir に入れるのをやめるほどじゃないみたいな意見もあって 入れるなら process.features とかに追加すれば良いと言う感じでした

process.features はドキュメントにもなってないようで そんなのあるなんて全然知らなかったです
ただ 見てみても余り情報はなかったです

12.10 での結果です
> process.features
{
inspector: true,
debug: false,
uv: true,
ipv6: true,
tls_alpn: true,
tls_sni: true,
tls_ocsp: true,
tls: true,
cached_builtins: true
}

mkdir のときと違って rmdir の引数にオプションの数が増えたので検出自体は関数の length プロパティを見ることでできるようです

あとは rimraf 自体は glob パッケージに依存していて foo/* みたいなので削除できるようです
ただ glob は含めず rmdir に rimraf の機能だけを入れたいのでここをどうするかも問題となっていました
それも作者が glob は必須じゃないよう対応してくれて無事リリースされたようです

rimraf は 2.7.0 から glob はあるときだけ使うようにして ないのに使おうとしたらエラーがでるようになりました
https://github.com/isaacs/rimraf/commit/dc1682d546114fd042f90e57af09da1959953395

package.json の dependencies には含まれてるので普通に npm や yarn で install した場合は glob も入るので使えます
Node.js に組み込んだ物を使う場合には glob が使えないだけのようです


Node.js はデフォルトだと最低限の機能だけでちょっとしたことでも npm パッケージが必要になったりするのでこういうふうによく使われる便利機能はデフォルトで含んでくれるといいですね
ただ 反対意見ではコミュニティでメンテするコストについて言及してる人もいたので Python みたいに基本なんでも入ってるというようにするのは難しいのかもしれません