メインコンテンツまでスキップ

npm

npmとは

npmとはNode.jsのパッケージを管理するシステム、パッケージ管理システム。
アプリケーションを作成する際、便利なパッケージをそのプロジェクトにインストールして、使用できる。

package.json 覚書

npmの管理ファイルであるpackage.jsonについて記載する。

各項目について

package.jsonの中身を理解する

今まで知らずにいたnpmスクリプトでできる3つのこと

今まで知らずにいたnpmスクリプトでできる3つのこと

npmのprivate registry 過去のやつのため注意

npm Docs

会社など、プライベートな空間がある場合に、Node.jsパッケージ管理にnpm private registryという手法がある。
npmのレジストリにprivateでパッケージをpublishする形式

注意

この移行が終わったタイミングで、GitHubがnpmを買収することが発表され、将来的にnpm private registryはGitHub Packages Registryへと統合される予定です。

pre/postがついたスクリプト

参考URL

  "scripts": {
"prebuild": "rimraf dist",
"build": "tsc",
"postbuild": "npm run test",
"test": "jest"
}

ここで npm run build をすると以下のものが自動的にトリガーされる。 上記のスクリプトがあるとする。

  1. prebuildが呼び出され、rimrafツールを実行し、distフォルダーを削除
  2. buildが実行され、TypeScriptコンパイラが実行される
  3. postbuildが呼び出され、npm run testが実行される
  4. testが実行され、jest test runnerが実行される

これが機能するのはnpmがスクリプトに同じ形式で名前が付けられていて、pre または post が前についた同じ名前の他のスクリプトがないかを自動で検索する。 ※これはスクリプトを複雑にすることなくコマンドを繋げる便利な方法。

package.jsonにある未使用のライブラリを確認する方法

参考URL

package.jsonのscriptsに引数を渡す

参考URL

npm run のスクリプトの中でディレクトリの削除を行う (rimraf)

OSに依存しない $ rm -rf ができる ※パッケージをインストールしなくてもデフォルトでできる。

参考URL

なぜ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

参考URL

npm ciを実行すると常にpackage-lock.jsonから依存関係をインストールする すでにnode_modulesフォルダーの中身があってもいったん削除する

従来のnpm installとの相関は? 従来の npm install コマンドを実行すると、package.jsonとpackage-lock.jsonの両方を見て依存関係の解決と依存パッケージのnode_modulesへのインストールを行う。 package.jsonを解決して必要に応じてロックファイルであるpackage-lock.jsonの更新もする。

脆弱性テスト

参考URL

yarn audit で検出されたパッケージを更新するには yarn upgrade で更新します。 パッケージを指定しなければ全部更新してくれます。 package.jsonで指定されたバージョンの範囲で更新され、package.jsonは変更されません。

対話型更新 $ yarn upgrade-interactive


version指定

参考URL

指定したバージョンをインストールしたい →1.0.0のバージョンがインストールされる。

{
"dependencies": {
"foo": "1.0.0"
}
}

指定したバージョンよりも大きいバージョンをインストールしたい →1.0.0より大きいバージョンがインストールされる

{
"dependencies": {
"foo": ">1.0.0"
}
}

packageの静寂性対応の流れ

参考URL

  1. 脆弱性を含むパッケージの依存ツリーを確認
npm ls glob-parent
# or
yarn list --pattern glob-parent

npm workspace

参考URL

ワークスペースの最大メリットは重複したパッケージをインストールしなくても良くなること。
ルートディレクトリの node_modules へ依存関係をインストールする

yarn workspace

リファレンス
参考URL
これがわかりやすい
tsで導入し

デフォルトで利用できるパッケージのアーキテクチャを設定する新しい方法です。ワークスペースにより複数のパッケージを設定する際に、 yarn install を一度実行するだけで、それらのすべてが単一のパスにインストールされるようになります。

1つのプロジェクトを立ち上げるとき クライアント・サーバ・共通ロジック・Lambda・デザインシステム・LPなどのさまざまなサブプロジェクトが必要になることは多い。 これらを1つのリポジトリで扱えるようにする考え方がmonorepoであり、それを実現する手段がワークスペースとなります。 monorepo環境の管理には、現在においてはLernaなどが方法として存在するが、ワークスペースはより低レベルでプリミティブな、内部依存関係の解決に特化した仕組みを提供してくれる。 ※lernaは開発があまり活発ではない。

やるべきこと

private: true が必要であること。

追加方法

$ npm init -w packages/a

TypeScriptでのモノレポ

リファレンス
参考URL

プロジェクト参照と言われている。
TypeScriptプログラムをより小さな部分に構造化できる。
これを行うことで、ビルド時間を大幅に短縮し、コンポーネント間の論理的な分離を強化し、新しいより優れた方法でコードを編成できます。

tscまた、--buildフラグの新しいモードを導入しています。これは、プロジェクト参照と連携して動作し、より高速なTypeScriptビルドを可能にします。

yarn.lockがコンフリクトしたら

参考URL

どちらか正にして対応してあげなければならない

git checkout --theirs yarn.lock # merge先
git checkout --ours yarn.lock # merge元