# NPM

> `npm`の面白い事実は [略語ではない](https://twitter.com/npmjs/status/347057301401763840) ということです。しかし、友人の間では、一般的に`node package manager`と呼ばれています。

`npm`はデフォルトの`node`のインストールに付属するバイナリで、コミュニティに公開されたJavaScript/TypeScriptのパッケージを管理するためのものです。

* NPMパッケージは <https://www.npmjs.com/> (the ☁️) にホストされて（そしてそこからインストールされて）います

## 簡単な共通セットアップ

* npmパッケージは`package.json`を使って設定されます。あなたはそれを素早く`npm init -y`で生成することができます。
* パッケージは`./node_modules`フォルダにインストールされます。あなたは通常それを`.gitignore`に入れています。

> あなたがアプリケーションを作っているとしても、本質的には、`package.json`はあなたのプロジェクトを同じようにパッケージにするものです。なので、`project | package`の用語は交換可能です。

あなたが他の誰かの(あなたのチームの)パッケージをチェックアウトしたら、`package.json`があります。それはあなたがプロジェクトを実行するために必要な依存関係のリストです。

## パッケージのインストール

`npm install <something>`を使ってインストールできます。ほとんどの人はショートハンド`npm i <something>`を使います。例:

```typescript
// Install react
npm i react
```

> これは自動的に`react`を`package.json`の依存関係に追加します。

## devDependencyのインストール

`devDependencies`は、開発(*development*)中のみプロジェクトに必要で、デプロイ後は必要ない場合の依存関係です。

`typescript`は`.ts -> .js`のビルド時だけ必要なものなので、普通は`devDependencies`です。あなたは通常ビルドされた`.js`ファイルをデプロイします:

* 本番環境上に
* または、他の誰かのnpm packageに使ってもらうために

## セキュリティ

公開された`npm`パッケージは世界中のセキュリティチームによってスキャンされ、問題があればnpmチームに報告されます。そして、彼らはセキュリティアドバイスを公開し、問題の詳細や、可能な修正をリリースします。一般的に修正はシンプルにパッケージをアップデートすることです。

あなたは`npm audit`を実行し、プロジェクトを監査することができます。これはパッケージやパッケージの依存関係に存在するかもしれない脆弱性をハイライトしてくれます。例:

```
┌───────────────┬──────────────────────────────────────────────────────────────┐
│ Low           │ Regular Expression Denial of Service                         │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package       │ debug                                                        │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ jest [dev]                                                   │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path          │ jest > jest-cli > istanbul-lib-source-maps > debug           │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info     │ https://nodesecurity.io/advisories/534                       │
└───────────────┴──────────────────────────────────────────────────────────────┘
```

一般的に問題は\_development\_の依存関係に見つかることに注意してください(例えば、このケースではjestです)。これらは本番デプロイの一部ではないので、あなたのアプリケーションはたいてい脆弱ではありません。しかし、良いプラクティスは、脆弱性を`0`に保つことです。

単に`npm audit`（このコマンドはエラーがあれば、エラーコード`1`で終了します）をあなたのデプロイの一部に追加し、あなたのプロジェクトが最新状態であることを確実にしてください。

## NPM Scripts

### スクリプトの`--`は何か

あなたはベースのスクリプトを限られたコマンドライン引数のセットで作ることができます。例えば、これはTypeScriptコンパイラのために`tsc`を走らせるスクリプトターゲットです。

```javascript
{
  "scripts": {
    "build": "tsc -p ."
  }
}
```

あなたは`tsc -p . -w`を実行するために`build:watch`ターゲットを作るか、npmに`build`を実行するよう追加のフラグ`-w`を付けて指示することができます:

```javascript
{
  "scripts": {
    "build": "tsc -p .",
    "build:watch": "npm run build -- -w"
  }
}
```

あなたは必要なフラグを`--`の後ろに渡すことができます。例えば、下記の例では、`build:more`は`something --foo -f -d --bar`と同じ効果を持ちます。

```javascript
{
  "scripts": {
    "build": "something --foo",
    "build:more": "npm run build -- -f -d --bar"
  }
}
```

## Public vs. Private packages

一般に公開されているいずれかのpublicなnpmパッケージを利用する際には、この区別は必要ないでしょう。法人/商用の利用者向けにpublic、privateの区別があることだけ覚えておいてください。

### Public packages

* パッケージはデフォルトでPublicです
* だれでもパッケージをnpmにデプロイできます
* 無料で取得できるアカウントだけが必要です

publicパッケージをダウンロードするには、アカウントは必要ありません。

これは無料でシェアするパッケージであり、npmが成功した理由の1つです🌹

### Private packages

もしあなたの会社/チームのためにprivateパッケージを必要とする場合は、有料プランにサインアップする必要があります。詳細はこちらです:<https://www.npmjs.com/pricing>

もちろんprivateパッケージをダウンロードするには、適切な権限のあるアカウントが必要です。
