著者は、 Open Internet / Free Speech Fund を選択して、 Write forDOnationsプログラムの一環として寄付を受け取りました。
序章
迅速な入出力(I / O)パフォーマンスやよく知られているJavaScript構文などの機能により、Node.jsはすぐにバックエンドWeb開発で人気のあるランタイム環境になりました。 しかし、関心が高まるにつれて、より大きなアプリケーションが構築され、コードベースとその依存関係の複雑さを管理することがより困難になります。 Node.jsは、 modules を使用してこの複雑さを整理します。これは、他のプログラムまたはモジュールで使用できる関数またはオブジェクトを含む単一のJavaScriptファイルです。 1つ以上のモジュールのコレクションは一般にパッケージと呼ばれ、これらのパッケージ自体はパッケージマネージャーによって編成されます。
Node.jsパッケージマネージャー(npm)は、Node.jsエコシステムでデフォルトで最も人気のあるパッケージマネージャーであり、主にNode.jsプロジェクトで外部モジュールをインストールおよび管理するために使用されます。 また、さまざまなCLIツールをインストールしてプロジェクトスクリプトを実行するためにもよく使用されます。 npmは、package.json
ファイルを使用してプロジェクトにインストールされたモジュールを追跡します。このファイルは、プロジェクトのディレクトリにあり、次のものが含まれています。
- プロジェクトに必要なすべてのモジュールとそれらにインストールされているバージョン
- 作成者、ライセンスなど、プロジェクトのすべてのメタデータ。
- プロジェクト内のタスクを自動化するために実行できるスクリプト
より複雑なNode.jsプロジェクトを作成する場合、package.json
ファイルを使用してメタデータと依存関係を管理すると、すべての外部依存関係が同じに保たれるため、より予測可能なビルドが提供されます。 ファイルはこの情報を自動的に追跡します。 プロジェクトのメタデータを更新するためにファイルを直接変更することはできますが、モジュールを管理するためにファイルを直接操作する必要はほとんどありません。
このチュートリアルでは、npmを使用してパッケージを管理します。 最初のステップは、package.json
ファイルを作成して理解することです。 次に、それを使用して、プロジェクトにインストールするすべてのモジュールを追跡します。 最後に、パッケージの依存関係を一覧表示し、パッケージを更新し、パッケージをアンインストールし、監査を実行してパッケージのセキュリティ上の欠陥を見つけます。
前提条件
このチュートリアルを完了するには、次のものが必要です。
- 開発マシンにインストールされているNode.js。 このチュートリアルでは、バージョン10.17.0を使用します。 これをmacOSまたはUbuntu18.04にインストールするには、Node.jsをインストールしてmacOSにローカル開発環境を作成する方法またはのPPAを使用したインストール]セクションの手順に従います。 Ubuntu18.04にNode.jsをインストールする方法。 Node.jsをインストールすると、npmもインストールされます。 このチュートリアルではバージョン6.11.3を使用します。
ステップ1—package.json
ファイルを作成する
このチュートリアルは、サンプルプロジェクト(ユーザーのIPアドレスを取得して原産国を返す架空のNode.js locator
モジュール)を設定することから始めます。 このチュートリアルでは、モジュールをコーディングしません。 ただし、管理するパッケージは、開発する場合は関連性があります。
まず、package.json
ファイルを作成して、プロジェクトに関する有用なメタデータを保存し、プロジェクトに依存するNode.jsモジュールの管理に役立てます。 接尾辞が示すように、これはJSON(JavaScript Object Notation)ファイルです。 JSONは、 JavaScriptオブジェクトに基づいており、キーと値のペアとして保存されたデータで構成される、共有に使用される標準形式です。 JSONについて詳しく知りたい場合は、JSONの概要の記事をお読みください。
package.json
ファイルには多数のプロパティが含まれているため、他の場所からテンプレートをコピーして貼り付けることなく、手動で作成するのは面倒な場合があります。 物事を簡単にするために、npmはinit
コマンドを提供します。 これは、一連の質問をし、回答に基づいてpackage.json
ファイルを作成するインタラクティブなコマンドです。
init
コマンドの使用
まず、モジュールの管理を練習できるようにプロジェクトを設定します。 シェルで、locator
という名前の新しいフォルダーを作成します。
mkdir locator
次に、新しいフォルダに移動します。
cd locator
次に、次のように入力して、インタラクティブプロンプトを初期化します。
npm init
注:コードでバージョン管理にGitを使用する場合は、最初にGitリポジトリを作成してから、npm init
を実行します。 このコマンドは、Git対応フォルダーにあることを自動的に認識します。 Gitリモートが設定されている場合、package.json
ファイルのrepository
、bugs
、およびhomepage
フィールドに自動的に入力されます。 package.json
ファイルの作成後にリポジトリを初期化した場合は、この情報を自分で追加する必要があります。 Gitバージョン管理の詳細については、 Gitの概要:インストール、使用法、およびブランチシリーズを参照してください。
次の出力が表示されます。
OutputThis utility will walk you through creating a package.json file. It only covers the most common items, and tries to guess sensible defaults. See `npm help json` for definitive documentation on these fields and exactly what they do. Use `npm install <pkg>` afterwards to install a package and save it as a dependency in the package.json file. Press ^C at any time to quit. package name: (locator)
最初に、新しいプロジェクトのname
の入力を求められます。 デフォルトでは、コマンドはそれがあなたがいるフォルダの名前であると想定します。 各プロパティのデフォルト値は、括弧()
で示されています。 このチュートリアルではname
のデフォルト値が機能するため、ENTER
を押して受け入れます。
次に入力する値はversion
です。 name
とともに、プロジェクトがnpmパッケージリポジトリ内の他のユーザーと共有される場合は、このフィールドが必要です。
注: Node.jsパッケージは、 Semantic Versioning (semver)ガイドに従う必要があります。 したがって、最初の番号はMAJOR
バージョン番号になり、APIが変更された場合にのみ変更されます。 2番目の番号は、機能が追加されると変更されるMINOR
バージョンになります。 最後の番号は、バグが修正されたときに変更されるPATCH
バージョンになります。
ENTER
を押すと、デフォルトバージョンが受け入れられます。
次のフィールドはdescription
です。これは、Node.jsモジュールの機能を説明するのに役立つ文字列です。 私たちの架空のlocator
プロジェクトは、ユーザーのIPアドレスを取得し、出身国を返します。 フィッティングdescription
はFinds the country of origin of the incoming request
になるので、このように入力してENTER
を押します。 description
は、ユーザーがモジュールを検索するときに非常に便利です。
次のプロンプトで、entry point
の入力を求められます。 誰かがモジュールをインストールしてrequires
した場合、entry point
で設定したものが、ロードされるプログラムの最初の部分になります。 値はJavaScriptファイルの相対的な場所である必要があり、package.json
のmain
プロパティに追加されます。 ENTER
を押して、デフォルト値を維持します。
注:ほとんどのモジュールには、主要なエントリポイントとしてindex.js
ファイルがあります。 これは、package.json
のmain
プロパティのデフォルト値であり、npmモジュールのエントリポイントです。 package.json
がない場合、Node.jsはデフォルトでindex.js
をロードしようとします。
次に、プロジェクトテストを実行するための実行可能スクリプトまたはコマンドであるtest command
の入力を求められます。 多くの一般的なNode.jsモジュールでは、テストは Mocha 、 Jest 、 Jasmine 、またはその他のテストフレームワークを使用して記述および実行されます。 テストはこの記事の範囲を超えているため、このオプションは今のところ空のままにし、ENTER
を押して次に進みます。
次に、init
コマンドは、プロジェクトのGitHubリポジトリを要求します。 この例ではこれを使用しないので、空のままにしておきます。
リポジトリプロンプトの後、コマンドはkeywords
を要求します。 このプロパティは、リポジトリを見つけるために人々が使用できる有用な用語を含む文字列の配列です。 検索をよりターゲットにできるように、プロジェクトに本当に関連する単語の小さなセットを用意するのが最善です。 これらのキーワードを、各値をコンマで区切った文字列としてリストします。 このサンプルプロジェクトでは、プロンプトでip,geo,country
と入力します。 完成したpackage.json
には、keywords
の配列に3つのアイテムが含まれます。
プロンプトの次のフィールドはauthor
です。 これは、あなたと連絡を取りたいモジュールのユーザーに役立ちます。 たとえば、誰かがあなたのモジュールでエクスプロイトを発見した場合、あなたがそれを修正できるように、誰かがこれを使用して問題を報告することができます。 author
フィールドは、"Name \<Email\> (Website)"
の形式の文字列です。 たとえば、"Sammy \<sammy@your_domain\> (https://your_domain)%22
は有効な作成者です。 電子メールとWebサイトのデータはオプションです。有効な作成者は、名前だけである可能性があります。 連絡先の詳細を作成者として追加し、ENTER
で確認します。
最後に、license
の入力を求められます。 これにより、モジュールの使用中にユーザーが持つ法的権限と制限が決まります。 多くのNode.jsモジュールはオープンソースであるため、npmはデフォルトをISCに設定します。
この時点で、ライセンスオプションを確認し、プロジェクトに最適なものを決定します。 さまざまな種類のオープンソースライセンスの詳細については、Open SourceInitiativeのこのライセンスリストを参照してください。 プライベートリポジトリのライセンスを提供したくない場合は、プロンプトでUNLICENSED
と入力できます。 このサンプルでは、デフォルトのISCライセンスを使用し、ENTER
を押してこのプロセスを終了します。
init
コマンドは、作成しようとしているpackage.json
ファイルを表示します。 これは次のようになります。
OutputAbout to write to /home/sammy/locator/package.json: { "name": "locator", "version": "1.0.0", "description": "Finds the country of origin of the incoming request", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [ "ip", "geo", "country" ], "author": "Sammy <sammy@your_domain> (https://your_domain)", "license": "ISC" } Is this OK? (yes)
情報がここに表示されているものと一致したら、ENTER
を押してこのプロセスを完了し、package.json
ファイルを作成します。 このファイルを使用すると、プロジェクトにインストールしたモジュールの記録を保持できます。
package.json
ファイルができたので、次のステップでモジュールのインストールをテストできます。
ステップ2—モジュールのインストール
ソフトウェア開発では、外部ライブラリを使用してプロジェクトの補助タスクを実行するのが一般的です。 これにより、開発者はビジネスロジックに集中し、アプリケーションをより迅速かつ効率的に作成できます。
たとえば、サンプルのlocator
モジュールが地理データを取得するために外部APIリクエストを作成する必要がある場合、HTTPライブラリを使用してそのタスクを簡単にすることができます。 私たちの主な目標は関連する地理データをユーザーに返すことなので、このコードを自分で書き直す代わりに、HTTPリクエストを簡単にするパッケージをインストールできます。これはプロジェクトの範囲を超えたタスクです。
この例を実行してみましょう。 locator
アプリケーションでは、 axios ライブラリを使用します。これは、HTTPリクエストの作成に役立ちます。 シェルに次のように入力してインストールします。
npm install axios --save
このコマンドはnpm install
で開始します。これにより、パッケージがインストールされます(簡潔にするためにnpm i
を使用できます)。 次に、インストールするパッケージをスペースで区切って一覧表示します。 この場合、これはaxios
です。 最後に、オプションの--save
パラメーターを使用してコマンドを終了します。これは、axios
がプロジェクトの依存関係として保存されることを指定します。
ライブラリをインストールすると、次のような出力が表示されます。
Output... + axios@0.19.0 added 5 packages from 8 contributors and audited 5 packages in 0.764s found 0 vulnerabilities
次に、選択したテキストエディタを使用して、package.json
ファイルを開きます。 このチュートリアルでは、nano
を使用します。
nano package.json
次のように強調表示されているように、新しいプロパティが表示されます。
locator / package.json
{ "name": "locator", "version": "1.0.0", "description": "Finds the country of origin of the incoming request", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [ "ip", "geo", "country" ], "author": "Sammy sammy@your_domain (https://your_domain)", "license": "ISC", "dependencies": { "axios": "^0.19.0" } }
--save
オプションは、インストールされたばかりのモジュールとバージョンでpackage.json
を更新するようにnpmに指示しました。 プロジェクトに取り組んでいる他の開発者は、必要な外部依存関係を簡単に確認できるため、これはすばらしいことです。
注:axios
依存関係のバージョン番号の前に^
があることに気付いたかもしれません。 セマンティックバージョニングは、 MAJOR 、 MINOR 、およびPATCHの3桁で構成されていることを思い出してください。 ^
記号は、より高いMINORまたはPATCHバージョンがこのバージョン制約を満たすことを示します。 バージョン番号の先頭に~
が表示されている場合は、より高いPATCHバージョンのみが制約を満たしています。
package.json
の確認が終了したら、ファイルを終了します。
開発の依存関係
プロジェクトの開発には使用されるが、本番環境でのビルドや実行には使用されないパッケージは、開発依存関係と呼ばれます。 これらは、モジュールまたはアプリケーションが本番環境で機能するために必要ではありませんが、コードを作成する際に役立つ場合があります。
たとえば、開発者は code linters を使用して、コードがベストプラクティスに従っていることを確認し、スタイルの一貫性を保つのが一般的です。 これは開発には役立ちますが、本番環境に展開したときに具体的なメリットを提供することなく、配布可能なサイズを増やすだけです。
プロジェクトの開発依存関係としてリンターをインストールします。 シェルでこれを試してください:
npm i eslint@6.0.0 --save-dev
このコマンドでは、--save-dev
フラグを使用しました。 これにより、eslint
が開発にのみ必要な依存関係として保存されます。 依存関係の名前に@6.0.0
を追加したことにも注意してください。 モジュールが更新されると、バージョンのタグが付けられます。 @
は、インストールしているモジュールの特定のタグを探すようにnpmに指示します。 タグを指定しない場合、npmは最新のタグ付きバージョンをインストールします。 package.json
をもう一度開きます。
nano package.json
これにより、次のように表示されます。
locator / package.json
{ "name": "locator", "version": "1.0.0", "description": "Finds the country of origin of the incoming request", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [ "ip", "geo", "country" ], "author": "Sammy sammy@your_domain (https://your_domain)", "license": "ISC", "dependencies": { "axios": "^0.19.0" }, "devDependencies": { "eslint": "^6.0.0" } }
eslint
は、前に指定したバージョン番号とともにdevDependencies
として保存されています。 package.json
を終了します。
自動生成されたファイル:node_modules
およびpackage-lock.json
Node.jsプロジェクトにパッケージを最初にインストールすると、npmは自動的にnode_modules
フォルダーを作成して、プロジェクトに必要なモジュールと、前に調べたpackage-lock.json
ファイルを保存します。
これらが作業ディレクトリにあることを確認してください。 シェルでls
と入力し、ENTER
を押します。 次の出力が表示されます。
Outputnode_modules package.json package-lock.json
node_modules
フォルダーには、プロジェクトにインストールされているすべての依存関係が含まれています。 ほとんどの場合、このフォルダをバージョン管理されたリポジトリにコミットしない必要があります。 より多くの依存関係をインストールすると、このフォルダーのサイズは急速に大きくなります。 さらに、package-lock.json
ファイルは、インストールされた正確なバージョンの記録をより簡潔に保持するため、node_modules
を含める必要はありません。
package.json
ファイルには、プロジェクトにインストールする必要のある適切なバージョンを示す依存関係がリストされていますが、package-lock.json
ファイルは、package.json
または[のすべての変更を追跡します。 X187X]で、インストールされているパッケージの正確なバージョンを教えてくれます。 これは、すべての依存関係をより明確に表現しているため、通常、node_modules
ではなくバージョン管理されたリポジトリにコミットします。
package.jsonからインストールする
package.json
ファイルとpackage-lock.json
ファイルを使用すると、新しいプロジェクトで開発を開始する前に、同じプロジェクトの依存関係をすばやく設定できます。 これを示すために、ディレクトリツリーのレベルを上に移動し、locator
と同じディレクトリレベルにcloned_locator
という名前の新しいフォルダを作成します。
cd .. mkdir cloned_locator
新しいディレクトリに移動します。
cd cloned_locator
次に、package.json
およびpackage-lock.json
ファイルをlocator
からcloned_locator
にコピーします。
cp ../locator/package.json ../locator/package-lock.json .
このプロジェクトに必要なモジュールをインストールするには、次のように入力します。
npm i
npmは、モジュールをインストールするためにpackage-lock.json
ファイルをチェックします。 使用可能なロックファイルがない場合は、package.json
ファイルから読み取ってインストールを決定します。 ロックファイルにはモジュールの正確なバージョンとその依存関係が含まれているため、通常はpackage-lock.json
からインストールする方が高速です。つまり、npmはインストールに適したバージョンを見つけるのに時間を費やす必要がありません。
本番環境にデプロイするときは、開発の依存関係をスキップすることをお勧めします。 開発の依存関係はpackage.json
のdevDependencies
セクションに保存されており、アプリの実行に影響を与えないことを思い出してください。 アプリケーションをデプロイするためのCI/CDプロセスの一部としてモジュールをインストールする場合は、以下を実行して開発の依存関係を省略します。
npm i --production
--production
フラグは、インストール中にdevDependencies
セクションを無視します。 今のところ、開発ビルドに固執します。
次のセクションに移動する前に、locator
フォルダーに戻ります。
cd ../locator
グローバルインストール
これまで、locator
プロジェクト用のnpmモジュールをインストールしてきました。 npmでは、パッケージをグローバルにインストールすることもできます。 これは、他のシェルコマンドと同様に、より広いシステムでユーザーがパッケージを利用できることを意味します。 この機能は、CLIツールである多くのNode.jsモジュールに役立ちます。
たとえば、現在取り組んでいるlocator
プロジェクトについてブログを書くことができます。 そのためには、 Hexo のようなライブラリを使用して、静的なWebサイトのブログを作成および管理できます。 次のようにHexoCLIをグローバルにインストールします。
npm i hexo-cli -g
パッケージをグローバルにインストールするには、コマンドに-g
フラグを追加します。
注:このパッケージをグローバルにインストールしようとしてパーミッションエラーが発生した場合、システムでコマンドを実行するためにスーパーユーザー権限が必要になる場合があります。 sudo npm i hexo-cli -g
で再試行してください。
次のように入力して、パッケージが正常にインストールされたことをテストします。
hexo --version
次のような出力が表示されます。
Outputhexo-cli: 2.0.0 os: Linux 4.15.0-64-generic linux x64 http_parser: 2.7.1 node: 10.14.0 v8: 7.6.303.29-node.16 uv: 1.31.0 zlib: 1.2.11 ares: 1.15.0 modules: 72 nghttp2: 1.39.2 openssl: 1.1.1c brotli: 1.0.7 napi: 4 llhttp: 1.1.4 icu: 64.2 unicode: 12.1 cldr: 35.1 tz: 2019a
これまで、npmを使用してモジュールをインストールする方法を学習しました。 パッケージは、本番または開発の依存関係として、ローカルでプロジェクトにインストールできます。 また、既存のpackage.json
またはpackage-lock.json
ファイルに基づいてパッケージをインストールし、ピアと同じ依存関係で開発することもできます。 最後に、-g
フラグを使用してパッケージをグローバルにインストールできるため、Node.jsプロジェクトに参加しているかどうかに関係なく、パッケージにアクセスできます。
モジュールをインストールできるようになったので、次のセクションでは、依存関係を管理するためのテクニックを練習します。
ステップ3—モジュールの管理
完全なパッケージマネージャーは、モジュールのインストール以上のことを実行できます。 npmには、依存関係の管理に関連する20を超えるコマンドがあります。 このステップでは、次のことを行います。
- インストールしたモジュールを一覧表示します。
- モジュールをより新しいバージョンに更新します。
- 不要になったモジュールをアンインストールします。
- モジュールに対してセキュリティ監査を実行して、セキュリティの欠陥を見つけて修正します。
これらの例はlocator
フォルダーで実行されますが、グローバルにインストールする場合とまったく同じように、コマンドの最後に-g
フラグを追加することで、これらのコマンドをすべてグローバルに実行できます。
モジュールの一覧表示
プロジェクトにインストールされているモジュールを知りたい場合は、package.json
を直接読み取るよりも、list
またはls
コマンドを使用する方が簡単です。 これを行うには、次のように入力します。
npm ls
次のような出力が表示されます。
Output├─┬ axios@0.19.0 │ ├─┬ follow-redirects@1.5.10 │ │ └─┬ debug@3.1.0 │ │ └── ms@2.0.0 │ └── is-buffer@2.0.3 └─┬ eslint@6.0.0 ├─┬ @babel/code-frame@7.5.5 │ └─┬ @babel/highlight@7.5.0 │ ├── chalk@2.4.2 deduped │ ├── esutils@2.0.3 deduped │ └── js-tokens@4.0.0 ├─┬ ajv@6.10.2 │ ├── fast-deep-equal@2.0.1 │ ├── fast-json-stable-stringify@2.0.0 │ ├── json-schema-traverse@0.4.1 │ └─┬ uri-js@4.2.2 ...
デフォルトでは、ls
は、依存関係ツリー全体(プロジェクトが依存するモジュールと、依存関係が依存するモジュール)を表示します。 インストールされているものの概要を知りたい場合、これは少し扱いにくい場合があります。
インストールしたモジュールのみを依存関係なしで印刷するには、シェルに次のように入力します。
npm ls --depth 0
出力は次のようになります。
Output├── axios@0.19.0 └── eslint@6.0.0
--depth
オプションを使用すると、表示する依存関係ツリーのレベルを指定できます。 0
の場合、最上位の依存関係のみが表示されます。
モジュールの更新
npmモジュールを最新の状態に保つことをお勧めします。 これにより、モジュールの最新のセキュリティ修正を取得する可能性が高まります。 outdated
コマンドを使用して、モジュールを更新できるかどうかを確認します。
npm outdated
次のような出力が得られます。
OutputPackage Current Wanted Latest Location eslint 6.0.0 6.7.1 6.7.1 locator
このコマンドは、最初にインストールされているPackage
とCurrent
バージョンを一覧表示します。 Wanted
列には、package.json
のバージョン要件を満たすバージョンが表示されます。 Latest
列には、公開されたモジュールの最新バージョンが表示されます。
Location
列は、依存関係ツリーのどこにパッケージが配置されているかを示します。 outdated
コマンドには、ls
のような--depth
フラグがあります。 デフォルトでは、深さは0です。
eslint
をより新しいバージョンに更新できるようです。 update
またはup
コマンドを次のように使用します。
npm up eslint
コマンドの出力には、インストールされているバージョンが含まれます。
Outputnpm WARN locator@1.0.0 No repository field. + eslint@6.7.1 added 7 packages from 3 contributors, removed 5 packages, updated 19 packages, moved 1 package and audited 184 packages in 5.818s found 0 vulnerabilities
すべてのモジュールを一度に更新する場合は、次のように入力します。
npm up
モジュールのアンインストール
npm uninstall
コマンドは、プロジェクトからモジュールを削除できます。 これは、モジュールがnode_modules
フォルダーにインストールされなくなり、package.json
およびpackage-lock.json
ファイルにも表示されなくなることを意味します。
プロジェクトから依存関係を削除することは、ソフトウェア開発ライフサイクルの通常のアクティビティです。 依存関係は、宣伝されているように問題を解決しない場合や、満足のいく開発エクスペリエンスを提供しない場合があります。 このような場合、依存関係をアンインストールして独自のモジュールを構築する方がよい場合があります。
axios
は、HTTPリクエストを作成するために必要な開発エクスペリエンスを提供しないと想像してください。 次のように入力して、uninstall
またはun
コマンドでaxios
をアンインストールします。
npm un axios
出力は次のようになります。
Outputnpm WARN locator@1.0.0 No repository field. removed 5 packages and audited 176 packages in 1.488s found 0 vulnerabilities
axios
が削除されたことを明示的には示していません。 アンインストールされたことを確認するには、依存関係をもう一度リストします。
npm ls --depth 0
これで、eslint
がインストールされていることがわかります。
Output└── eslint@6.7.1
これは、axios
パッケージが正常にアンインストールされたことを示しています。
監査モジュール
npmは、依存関係の潜在的なセキュリティリスクを強調するためのaudit
コマンドを提供します。 監査の動作を確認するには、次のコマンドを実行して、古いバージョンのrequestモジュールをインストールします。
npm i request@2.60.0
この古いバージョンのrequest
をインストールすると、次のような出力が表示されます。
Output+ request@2.60.0 added 54 packages from 49 contributors and audited 243 packages in 7.26s found 6 moderate severity vulnerabilities run `npm audit fix` to fix them, or `npm audit` for details
npmは、依存関係に脆弱性があることを通知しています。 詳細を取得するには、次のコマンドでプロジェクト全体を監査します。
npm audit
audit
コマンドは、セキュリティ上の欠陥を強調する出力の表を表示します。
Output === npm audit security report === # Run npm install request@2.88.0 to resolve 1 vulnerability ┌───────────────┬──────────────────────────────────────────────────────────────┐ │ Moderate │ Memory Exposure │ ├───────────────┼──────────────────────────────────────────────────────────────┤ │ Package │ tunnel-agent │ ├───────────────┼──────────────────────────────────────────────────────────────┤ │ Dependency of │ request │ ├───────────────┼──────────────────────────────────────────────────────────────┤ │ Path │ request > tunnel-agent │ ├───────────────┼──────────────────────────────────────────────────────────────┤ │ More info │ https://npmjs.com/advisories/598 │ └───────────────┴──────────────────────────────────────────────────────────────┘ # Run npm update request --depth 1 to resolve 1 vulnerability ┌───────────────┬──────────────────────────────────────────────────────────────┐ │ Moderate │ Remote Memory Exposure │ ├───────────────┼──────────────────────────────────────────────────────────────┤ │ Package │ request │ ├───────────────┼──────────────────────────────────────────────────────────────┤ │ Dependency of │ request │ ├───────────────┼──────────────────────────────────────────────────────────────┤ │ Path │ request │ ├───────────────┼──────────────────────────────────────────────────────────────┤ │ More info │ https://npmjs.com/advisories/309 │ └───────────────┴──────────────────────────────────────────────────────────────┘ ...
あなたは脆弱性の経路を見ることができます、そして時々npmはあなたがそれを修正するための方法を提供します。 提案されているようにupdateコマンドを実行するか、audit
のfix
サブコマンドを実行できます。 シェルに次のように入力します。
npm audit fix
次のような出力が表示されます。
Output+ request@2.88.0 added 19 packages from 24 contributors, removed 32 packages and updated 12 packages in 6.223s fixed 2 of 6 vulnerabilities in 243 scanned packages 4 vulnerabilities required manual review and could not be updated
npmは、2つのパッケージを安全に更新し、脆弱性を同じ量だけ減らすことができました。 ただし、依存関係にはまだ4つの脆弱性があります。 audit fix
コマンドは、必ずしもすべての問題を解決するとは限りません。 モジュールのバージョンにはセキュリティの脆弱性がある可能性がありますが、別のAPIを使用するバージョンに更新すると、依存関係ツリーの上位にあるコードが破損する可能性があります。
--force
パラメータを使用して、次のように脆弱性が確実に排除されるようにすることができます。
npm audit fix --force
前述のように、機能が損なわれないことが確実でない限り、これはお勧めしません。
結論
このチュートリアルでは、Node.jsモジュールがパッケージに編成される方法と、これらのパッケージがnpmによって管理される方法を示すために、さまざまな演習を行いました。 Node.jsプロジェクトでは、package.json
ファイル(インストールしたモジュールを含むプロジェクトのメタデータの記録)を作成および維持することにより、依存関係としてnpmパッケージを使用しました。 また、npm CLIツールを使用して、プロジェクトの依存関係ツリーを一覧表示し、古いモジュールをチェックおよび更新することに加えて、モジュールをインストール、更新、および削除しました。
将来的には、モジュールを使用して既存のコードを活用すると、機能を繰り返す必要がなくなるため、開発時間が短縮されます。 また、独自のnpmモジュールを作成することもでき、これらはnpmコマンドを介して他のユーザーによって管理されます。 次のステップとして、さまざまなパッケージをインストールしてテストすることにより、このチュートリアルで学んだことを試してください。 問題解決を容易にするためにエコシステムが提供するものをご覧ください。 たとえば、JavaScriptのスーパーセットである TypeScript を試したり、Cordovaを使用してWebサイトをモバイルアプリに変えたりすることができます。 Node.jsの詳細については、その他のNode.jsチュートリアルをご覧ください。