著者は、 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... + [email protected] 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 [email protected] --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├─┬ [email protected] │ ├─┬ [email protected] │ │ └─┬ [email protected] │ │ └── [email protected] │ └── [email protected] └─┬ [email protected] ├─┬ @babel/[email protected] │ └─┬ @babel/[email protected] │ ├── [email protected] deduped │ ├── [email protected] deduped │ └── [email protected] ├─┬ [email protected] │ ├── [email protected] │ ├── [email protected] │ ├── [email protected] │ └─┬ [email protected] ...
デフォルトでは、lsは、依存関係ツリー全体(プロジェクトが依存するモジュールと、依存関係が依存するモジュール)を表示します。 インストールされているものの概要を知りたい場合、これは少し扱いにくい場合があります。
インストールしたモジュールのみを依存関係なしで印刷するには、シェルに次のように入力します。
npm ls --depth 0
出力は次のようになります。
Output├── [email protected] └── [email protected]
--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 [email protected] No repository field. + [email protected] 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 [email protected] No repository field. removed 5 packages and audited 176 packages in 1.488s found 0 vulnerabilities
axiosが削除されたことを明示的には示していません。 アンインストールされたことを確認するには、依存関係をもう一度リストします。
npm ls --depth 0
これで、eslintがインストールされていることがわかります。
Output└── [email protected]
これは、axiosパッケージが正常にアンインストールされたことを示しています。
監査モジュール
npmは、依存関係の潜在的なセキュリティリスクを強調するためのauditコマンドを提供します。 監査の動作を確認するには、次のコマンドを実行して、古いバージョンのrequestモジュールをインストールします。
npm i [email protected]
この古いバージョンのrequestをインストールすると、次のような出力が表示されます。
Output+ [email protected] 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 [email protected] 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+ [email protected] 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チュートリアルをご覧ください。