私が使用しているいくつかの node.js 環境 (すべて Windows) の中で、 ほぼ同じ構成の npm パッケージにしているはずであるにもかかわらず、 yo コマンドを実行してからインターフェースが表示されるまでの時間に、大きく開きがあった。 その差、 ほぼ瞬時~数十秒。
正直、 yo コマンド実行する度に数十秒待たされるのは非常にストレスがたまる。
何が問題なのか調べてみた。
遅い原因は ユーザ名取得部分
デバッガを使って、どの部分の実行に時間がかかっているのか調べてみたところ、 fullname モジュール でユーザ名を取得している部分に時間がかかっていることがわかった。
しかもこのユーザ取得部分、 yo コマンド の引数に ジェネレータ 指定して ユーザ名を表示しないようにしても、 ユーザ名取得は必ず実行されるらしい。
では、この fullname モジュール、いったいどうやってユーザ名を取得しているのだろうか…?
ユーザ名取得の方法
ということで、 今度は fullname モジュール を見てみよう。
Windows マシン上で実行した場合、以下のような順番でユーザ名を取りに行っている。
- npm の
init.author.name
設定を見る - カレントディレクトリで
git config --global user.name
コマンドをたたく - wmic で wmi クエリをたたく
冒頭の、「同じ構成の npm パッケージにしているはずであるにもかかわらず、結果が異なっていた」 原因は、 git の PATH が通っているかどうかの違いによるものだった。
git の PATH が通っている環境では、 git のユーザ名が取得できたため、わりかし瞬時にファイル名が取得できていた。
しかし、そうではない場合は、 wmi クエリをたたいてしまい、 しかも 大量のイベントログの記録があるマシンだったために、 クエリの結果が取得されるまで長時間待たされる結果になってしまっていたのだ。
yo でのユーザ名取得を早くする yo!
問題の解決は簡単で、 yo が一番最初にユーザ名を取得しに行く、 npm の init.author.name
の設定に、何かしらの名前を入れておけば良い。
具体的には、 npm config set init.author.name <ユーザ名>
を実行することになる。
このように設定することで、 これまで yo コマンドを実行するのに時間がかかる状況から脱出できた。
メモ: | fullname モジュールが npm の設定値をとる手段は、 DEPRECATED な npmconf モジュールになっている。 このモジュールを使って設定している場合、 グローバル設定ファイルの情報は読んでくれない。 このため、 npm config set init.author.name <ユーザ名> -g と設定しても、yo が取得するユーザ名としては機能しないので注意。(ユーザ名はユーザ単位で保存されるべきなので、動作的に致命的に間違っているわけではないが…) |