npm
npmとは
npmとはNode.jsのパッケージを管理するシステム、パッケージ管理システム。
アプリケーションを作成する際、便利なパッケージをそのプロジェクトにインストールして、使用できる。
package.json 覚書
npmの管理ファイルであるpackage.jsonについて記載する。
各項目について
今まで知らずにいたnpmスクリプトでできる3つのこと
npmのprivate registry 過去のやつのため注意
会社など、プライベートな空間がある場合に、Node.jsパッケージ管理にnpm private registryという手法がある。
npmのレジストリにprivateでパッケージをpublishする形式
注意
この移行が終わったタイミングで、GitHubがnpmを買収することが発表され、将来的にnpm private registryはGitHub Packages Registryへと統合される予定です。
pre/postがついたスクリプト
"scripts": {
"prebuild": "rimraf dist",
"build": "tsc",
"postbuild": "npm run test",
"test": "jest"
}
ここで npm run build
をすると以下のものが自動的にトリガーされる。
上記のスクリプトがあるとする。
- prebuildが呼び出され、rimrafツールを実行し、distフォルダーを削除
- buildが実行され、TypeScriptコンパイラが実行される
- postbuildが呼び出され、npm run testが実行される
- testが実行され、jest test runnerが実行される
これが機能するのはnpmがスクリプトに同じ形式で名前が付けられていて、pre
または post
が前についた同じ名前の他のスクリプトがないかを自動で検索する。
※これはスクリプトを複雑にすることなくコマンドを繋げる便利な方法。
package.jsonにある未使用のライブラリを確認する方法
package.jsonのscriptsに引数を渡す
npm run のスクリプトの中でディレクトリの削除を行う (rimraf)
OSに依存しない $ rm -rf
ができる
※パッケージをインストールしなくてもデフォルトでできる。
なぜrimrafが必要か? TypeScriptなどのトランスパイラを使ってNode.jsアプリを開発していると、ビルド結果を格納するディレクトリを削除するcleanコマンド(NPMスクリプト)を定義したくなる時がある。
{
"scripts": {
"clean": "rm -rf build"
}
}
これはこれで間違いではないが、Linuxのrmコマンドを使用しているので、OS依存のpackage.jsonになってしまう。
そこで、OSに依存しない rm -rf
コマンドを実現するのが rimraf
というNPMパッケージ。rimrafはNPMの作者であるIsaac氏が作成しており、安心して使用可能。
rimrafという名前はLinuxコマンドの rm -rf
の発音が由来だと言われている。
npm ci
npm ciを実行すると常にpackage-lock.jsonから依存関係をインストールする すでにnode_modulesフォルダーの中 身があってもいったん削除する
従来のnpm installとの相関は?
従来の npm install
コマンドを実行すると、package.jsonとpackage-lock.jsonの両方を見て依存関係の解決と依存パッケージのnode_modulesへのインストールを行う。
package.jsonを解決して必要に応じてロックファイルであるpackage-lock.jsonの更新もする。
脆弱性テスト
yarn audit
で検出されたパッケージを更新するには yarn upgrade
で更新します。
パッケージを指定しなければ全部更新してくれます。
package.jsonで指定されたバージョンの範囲で更新され、package.jsonは変更されません。
対話型更新
$ yarn upgrade-interactive
version指定
指定したバージョンをインストールしたい →1.0.0のバージョンがインストールされる。
{
"dependencies": {
"foo": "1.0.0"
}
}
指 定したバージョンよりも大きいバージョンをインストールしたい →1.0.0より大きいバージョンがインストールされる
{
"dependencies": {
"foo": ">1.0.0"
}
}
packageの静寂性対応の流れ
- 脆弱性を含むパッケージの依存ツリーを確認
npm ls glob-parent
# or
yarn list --pattern glob-parent
npm workspace
ワークスペースの最大メリットは重複したパッケージをインストールしなくても良くなること。
ルートディレクトリの node_modules
へ依存関係をインストールする
yarn workspace
デフォルトで利用できるパッケージのアーキテクチャを設定する新しい方法です。ワークスペースにより複数のパッケージを設定する際に、 yarn install を一度実行するだけで、それらのすべてが単一のパスにインストールされるようになります。
1つのプロジェクトを立ち上げるとき クライアント・サーバ・共通ロジック・Lambda・デザインシステム・LPなどのさまざまなサブプロジェクトが必要になることは多い。 これらを1つのリポジトリで扱えるようにする考え方がmonorepoであり、それを実現する手段がワークスペースとなります。 monorepo環境の管理には、現在においてはLernaなどが方法として存在するが、ワークスペースはより低レベルでプリミティブな、内部依存関係の解決に特化した仕組みを提供してくれる。 ※lernaは開発があまり活発ではない。
やるべきこと
private: true
が必要であること。
追加方法
$ npm init -w packages/a
TypeScriptでのモノレポ
プロジェクト参照と言われている。
TypeScriptプログラムをより小さな部分に構造化できる。
これを行うことで、ビルド時間を大幅に短縮し、コンポーネント間の論理的な分離を強化し、新しいより優れた方法でコードを編成できます。
tscまた、--buildフラグの新しいモードを導入しています。これは、プロジェクト参照と連携して動作し、より高速なTypeScriptビルドを可能にします。
yarn.lockがコンフリクトしたら
どちらか正にして対応してあげなければならない
git checkout --theirs yarn.lock # merge先
git checkout --ours yarn.lock # merge元