どうもSuです。
npm installしてますか?Node.jsの開発をしていると、頻繁に登場するコマンド、それが「npm install」ですね。npm installの仕組みを理解するとNode.jsの開発もよりスムーズになると思いますので、一緒に勉強していきましょう。
この記事の目的は、実際に開発現場において、ライブラリをインストールするときに考える必要がある、あるいは、考えた方が良いことについて順序立てて解説しています。考えなしにライブラリをインストールすると後で問題になる可能性があるため、1つ1つ丁寧に考えながらライブラリを選択できると良いでしょう。
Node.jsとは?
Node.jsは、JavaScriptを実行するためのオープンソースのランタイム環境です。つまり、Node.jsは、ブラウザの外部でJavaScriptを実行することができるプラットフォームです。Node.jsは、非同期イベント駆動型のプログラミングモデルを採用しており、Webアプリケーションやサーバーサイドのアプリケーションの開発に使用されます。また、Node.jsには、豊富なライブラリやモジュールがあり、開発者はこれらを使用して、効率的かつ簡単にアプリケーションを開発することができます。
npm installとは?
npm installは、Node.jsのパッケージマネージャーであるnpmを使用して、外部のライブラリやモジュールをプロジェクトにインストールするためのコマンドです。例えば、プロジェクトで使用するライブラリをインストールする場合は、ターミナルで npm install <ライブラリ名> と入力することで、npmがそのライブラリを検索し、自動的にインストールしてくれます。また、npm installとだけ入力すると、プロジェクト内で必要な全てのライブラリがインストールされます。これにより、手動でライブラリをダウンロードしてインストールする手間を省くことができます。
まずは、ライブラリを使う目的を決めよう
npm installするということは、ライブラリを使う目的があるはずです。ライブラリは様々あり、1つのライブラリで様々な機能を備えたライブラリもあれば、1つの機能に特化したライブラリもあります。まずは、「何をしたいか」を考えましょう。
例えば、「csvファイルの読み取りや書き出しを行うライブラリが欲しいな」です。
通常csvファイルを読み込むためには、Node.jsが提供している標準ライブラリを使うとストリームを開いて、バッファを読み込んで、データを読み込んだら、カンマ区切りのデータを分割して、配列に1つずつ格納して、なんやかんややって、ストリームを閉じるみたいな処理が必要になってきます。
しかし、これを1から作るのは大変です。世の中の大体のやりたいことは、既に素晴らしいエンジニアが開発済みで、ライブラリとして利用することができます。「車輪の再開発」をせず、ライブラリを使って効率の良い開発をした方が良いですね。コードを書くことは目的ではなく手段なので、目的を達成するためにはライブラリは大いに活用するべきだと思います。
ライブラリの候補を調べよう
では、目的が決まったところで、ライブラリを検索してみましょう。
「nodejs csv ライブラリ」で検索するといくつかの記事が出てきます。これらの記事から使えそうなライブラリ名をピックアップします。
今回は、「csv-parse」というライブラリが紹介されていたので、このライブラリをベースに選定をしていきます。
npm trendを調べよう
npm trendというサービスがあります。これは、npmのライブラリを検索することで、「似たようなライブラリを知ることができる」、「それぞれのライブラリがどれくらいユーザにダウンロードされているのか分かる」「それぞれのライブラリのGithubでのスター数を知ることができる」、「それぞれの最終更新日時を知ることができる」など、ライブラリを選定する時に大事な情報を集めることができます。
もちろん、最初に記事を見なくても、「csv」と入力するだけで、それなりに候補を出してくれるので、最初からnpm trendから探すのもありです。
ライブラリを比較しよう
ライブラリを1つ選択すると、以下のようにそのライブラリの週ごとのダウンロード数が見れます。これだけでも、「人気のライブラリがあるのか」、「マイナーなライブラリなのか」などがある程度分かります。
また、1つライブラリ選択した状態だと、他のライブラリ候補も出てきます。「csv」、「csvtojson」などが候補です。これらをクリックするとライブラリの比較をすることができます。試しに、「csv」をクリックしてみましょう。
比較結果はこのようになります。
npm trendで見るべきポイントは?
ライブラリのダウンロード数を調べよう
ライブラリのダウンロード数を見ると、明らかに「csv-parse」の方がダウンロードされています。ダウンロードされているからOKというわけではありませんが、使いづらければ、そもそもこれほどダウンロードされていないはずです。ということで、これは指標の1つとしては良いと思います。
また、ダウンロード数は直近まで横ばいで高い数値を保っています。ダウントレンド(ダウンロード数が下がり続ける)にもなっていないので、これも選択理由として良いですね。
ちなみに一時的に下がっているのは、「年末だから」ですね。
プルリクエストなどで「なぜこのライブラリを選択したのですか?」の質問に対して、「npm trendでのダウンロード数が多く、ダウントレンドにもなっていないので、他のライブラリよりは良いかなと考えました」と言えることは、正しいかどうかは別として、選択理由を答えられているので良いでしょう。
ライブラリのバージョンを見よう
ライブラリを比較すると以下のように、ライブラリの最新バージョンを知ることができます。
これらは、「6.2.8」、「5.3.6」なので、メジャーバージョンが1を超えています。OSSのライブラリのバージョンは、作成された直後は、「0.1.0」などベータバージョンになっていることが多いです。つまり絶賛開発中だったり、個人開発だったりします。
OSSのライブラリは善意の開発です。無料で利用できますが、バグや脆弱性があった場合、ライブラリ開発者が修正するのを待つか、自分で修正PRなどを出して解決するしかありません。
ベータバージョンの場合は、利用した時のリスクとして、「問題があった時にすぐ対応することができない」ということがあります。そのため、メジャーバージョンでリリースされている他のライブラリがあれば、そちらを選択することをお勧めします。
ライブラリの最終更新日時を見よう
さて、メジャーバージョンを選択して安心する前に、「更新日時」を見ることは必須です。
なぜなら、いくらメジャーバージョンになっていても、最終更新日時が数年前になっていて、全くメンテナンスされていないライブラリも世の中にはあるからです。
メンテナンスされていないということは、つまり、先ほど言った「問題があった時にすぐ対応することができない」というリスクがあります。このような場合は、他のライブラリがないか探すようにしましょう。もしかすると、元のOSS開発者が、新しいライブラリを開発してそちらに運用が移っているかもしれません。
ライブラリのスター数を調べよう
こちらは別な例ですが、スター数を見るのも良いです。スター数はみんなにいいねされている数です。もし、ダウンロード数や更新日などが同じような結果であれば、スター数を参考に選んでも良いでしょう。
ライブラリの容量を調べよう
ライブラリには実際にnpm installした時の容量を知ることができます。これは「容量が大きいファイルは通信に時間がかかる」ということを示しています。
ライブラリは機能によっては過剰な機能である場合があります。様々な機能が入っているライブラリは便利です。しかし不要な機能まで含まれていると、それだけライブラリの容量は大きくなります。
サーバサイドでデプロイするNode.jsアプリケーションであれば、容量はそこまで問題にならないでしょう。問題になるのはクライアントサイド、つまりユーザのブラウザで実行されるライブラリの場合です。
ブラウザはライブラリを含めたアプリケーションのjavascriptをダウンロードし、ダウンロード後にスクリプトが実行され、画面を表示します。しかし容量が大きいjavascriptのファイルは通信に時間がかかるため、画面が表示されるまでユーザを待たせることになります。
1つ1つのライブラリは小さなものです。しかし、ライブラリの数が積み上がっていくと、通信量が多くなり、結果ユーザの体験としては良くないことになります。
なので、もしライブラリを使うことになった場合は、必要な機能が最低限入ってるライブラリを選ぶ、もしくは、よりサイズが小さいライブラリを選びましょう。
画像では、「minizipped」が圧縮時のサイズなので、こちらを参考にすると良いです。「bundelphobia」はクリックすると分かるのですが、外部サイトに遷移し、そちらで、ファイルサイズを教えてくれます。
ちなみに、minifiedは単純にコードから改行、コメントを削除したり、変数名を置き換えたりすることでファイルサイズを削減したファイルのことです。
本当にライブラリが必要なのかを考えよう
ここまで、ライブラリを選択する方法を順を追って解説してきました。しかし、大事なことは「そもそもライブラリを使う必要があるか?」を考えることだと思います。
例えば、「文字列のnullと空文字をチェックする処理を実装したい」という時にライブラリをダウンロードして使うという選択肢は良くないです。そのようなライブラリは軽量かもしれませんが、ライブラリの管理コストとメリットのバランスが悪いですね。
util.jsなどを作成して、以下のようにチェック関数を書いた方が早いですし、無駄にライブラリを使わなくて済みます。(ちなみにこの関数では、undefinedはfalseと判定されるのでご注意ください)
function isNullOrEmpty(str) {
return str === null || str === '';
}
コードレビューで説明できるようにしておこう
ライブラリをアップデートすると、プルリクエストのレビューで「なぜ、このライブラリを選んだのですか?」、「こちらのライブラリの方が良いのではないですか?」という質問が出てきます。
このような質問には、今回のような調査結果を含め、理由付きで答えられると信頼できるエンジニアになれるかなと思います。
もちろん、コードレビューをする時も、今回説明したような観点を持っていると、より意味のあるコードレビューができると思います。
最後に
今回は実際の開発現場でどのようにライブラリの選定を行なっているかのポイントを説明しました。他にも様々な開発現場の大事なポイントがありますので、また別なブログで話したいなと思います。
今日は、読んで頂き、ありがとうございます!