Node.js開発者なら知っておきたい便利なパッケージ12選

本記事は、[Indrek Lasn](https://indreklasn.medium.com/)氏による「[12 Useful Packages Every Node.js Developer Should Know](https://betterprogramming.pub/12-useful-packages-every-node-js-developer-should-know-2746db760e)」（2020年9月２日公開）の和訳を、著者の許可を得て掲載しているものです。

#Node.js開発者なら知っておきたい便利なパッケージ12選

>毎日の生産性を上げるNodeパッケージ

![Image for post](https://miro.medium.com/max/600/1*4_n18FH8hRrvlLyRufD1sQ.png)

##はじめに

Node.jsはコードの再利用にぴったりです。コードを再利用するための根幹となるのはNPMパッケージです。

NPMパッケージは、時間と労力を大幅に節約してくれます。日付ライブラリが必要ですか？パッケージがあります。ユーティリティライブラリが必要ですか？問題ありません。コードの問題解決が必要な時はいつでも、必要に応じたパッケージがあるでしょう。

これは、すべてのNode.js開発者が知っておくべきパッケージのリストです。このNPMパッケージは、時間を節約し、魔法のように解決する助っ人のようなものです。

##1. husky

huskyはgitフックの実装を簡単にしてくれます。チームで仕事をしていて、チーム全体にコーディング規約を適用したいと思うことはありませんか？問題ありません！huskyを使えば、リポジトリにコミットしたりプッシュしたりする前に、コードを自動的にlintしてテストするように全員に要求できます。

![Image for post](https://miro.medium.com/max/700/1*D0V_pIjQbJOOra1_zsKXgA.png)
husky ― <https://github.com/typicode/husky>

###インストール方法

`yarn add husky`

###使い方

huskyフックの実装例です。

```json
// package.json
{
   "husky": {
      "hooks": {
         "pre-commit": "npm lint",
         "pre-push": "npm test"
      }
   }
}
```
[huskyexample.json](https://gist.github.com/indreklasn/5b1438daa5f14641350f3f8cfe97b462#file-huskyexample-json)
huskyフック例

`pre-commit`フックは、リポジトリにコミットする前に実行されます。

`pre-push`フックは、コードをリポジトリにプッシュする前に実行されます。

##2. dotenv

>dotenvは、環境変数を`.env`ファイルから[`process.env`](https://nodejs.org/docs/latest/api/process.html#process_process_env)にロードするゼロ依存モジュールです。コードとは別の環境に設定を保存することは、[The Twelve-Factor App](http://12factor.net/config)の方法論に基づいています。
>[dotenv](https://github.com/motdotla/dotenv)

###インストール方法

`yarn add dotenv`

###使い方

アプリケーションのできる限り早い段階で、dotenvを要求して設定します。

`require('dotenv').config()`

プロジェクトのルートディレクトリに`.env`ファイルを作成します。`NAME=VALUE`の形式で、新しい行に環境固有の変数を追加します。

例：

```
DB_HOST=localhost
DB_USER=root
DB_PASS=s1mpl3
```

`process.env`で、`.env`ファイルで定義したキーと値が使えるようになりました。

```
const db = require('db')
db.connect({
   host: process.env.DB_HOST,
   username: process.env.DB_USER,
   password: process.env.DB_PASS
})
```

##3. date-fns

lodashに似ていますが、date-fnsは日付のためのものです。日付の操作をもっと簡単にするユーティリティ関数がたくさんあります。

>[date-fns](https://github.com/date-fns/date-fns)は、ブラウザやNode.jsでJavaScriptの日付を操作するため、総合的かつシンプルで一貫性のあるツールセットを提供します。
>[date-fns](https://date-fns.org/)

![Image for post](https://miro.medium.com/max/700/1*RPwSAlSQLGPYFu2g2_2_PQ.png)
date-fns ― <https://github.com/date-fns/date-fns>

###インストール方法

`yarn add date-fns`

###使い方

date-fnsライブラリの簡単な例です。

```
import { compareAsc, format } from 'date-fns'

format(new Date(2014, 1, 11), 'yyyy-MM-dd')
//=> '2014-02-11'

const dates = [
   new Date(1995, 6, 2),
   new Date(1987, 1, 11),
   new Date(1989, 6, 10),
]
dates.sort(compareAsc)
//=> [
//    Wed Feb 11 1987 00:00:00,
//    Mon Jul 10 1989 00:00:00,
//    Sun Jul 02 1995 00:00:00
// ]
```

その他の事例や使用例については、[ドキュメント](https://date-fns.org/docs/)を確認してください。

##4. bunyan

bunyan は、分かりやすくてパフォーマンスが高いNode用のJSONロギングライブラリです。

![Image for post](https://miro.medium.com/max/700/1*X0VavDhzY5oXf415PVGhqQ.png)
bunyan ― <https://github.com/trentm/node-bunyan>

###インストール方法

`yarn add bunyan`

**コツ**：`bunyan` CLIツールは、すべてのバージョンのbunyanのログと（合理的な範囲内で）互換性があるようになっています。そのため、`yarn add global bunyan`でグローバルbunyanをインストールしてbunyan CLIをPATHに追加してから、ローカルbunyanをインストールして、アプリでbunyanのNode.jsライブラリを使うと良いでしょう。

###使い方

bunyanはシンプルで高速なNode.jsサービス用のJSONロギングライブラリです。

```
// hi.js
const bunyan = require('bunyan');
const log = bunyan.createLogger({name: "myapp"});
log.info("hi");
```

`node hi.js`を実行するとコンソールに返される内容は、次の通りです。

![Image for post](https://miro.medium.com/max/638/1*o_eRezYadrpuOxN8Qm1kRQ.png)

##5. ramda

rambda は JavaScript プログラマ向けの実用的で機能的なユーティリティライブラリです。rambdaは、より純粋な機能性を重視しています。

不変性と副作用のない関数は、rambdaの設計哲学の中心です。これにより、シンプルで洗練されたコードで仕事を成し遂げられます。

![Image for post](https://miro.medium.com/max/700/1*3p3hpTWcyyatt2l3khFtUQ.png)
rambda ― <https://github.com/ramda/ramda>

###インストール方法

`$ yarn add ramda`

###使い方

```
import * as R from 'ramda'
const greet = R.replace('{name}', R.__, 'Hello, {name}!');
greet('Alice'); //=> 'Hello, Alice!'
```

[上のコードの例です。](https://ramdajs.com/repl/?v=0.27.0#?const%20greet%20%3D%20R.replace%28%27%7Bname%7D%27%2C%20R.__%2C%20%27Hello%2C%20%7Bname%7D%21%27%29%3B%0Agreet%28%27Alice%27%29%3B%20%2F%2F%3D%3E%20%27Hello%2C%20Alice%21%27)

##6. debug

debugはNode.jsコアのデバッグ手法をモデルにした、小さなJavaScriptデバッグユーティリティです。

![Image for post](https://miro.medium.com/max/700/1*Gg5qwH37xwLkyIe-ZYEpHw.png)
debug ― <https://github.com/visionmedia/debug>

###インストール方法

`$ yarn add debug`

###使い方

`debug`には、モジュール名を渡すだけで`console.error`の装飾版を返し、debugステートメントを渡す関数があります。

```javascript

const debug = require('debug');
const log = debug('http:server');
const http = require('http');

const name = 'My App name';

log('booting %o', name);

http.createServer((req, res) => {
   log(req.method + ' ' + req.url);
   res.end('debug examplen');
}).listen(3200, () => {
   log('listening');
});

// run this command in the terminal
// DEBUG=http:server node app.js
```

[app-debug-example.js](https://gist.github.com/indreklasn/8f7cae650757c321882fadb2b3202f26#file-app-debug-example-js)
debug例

これによりデバッグ出力を、モジュール全体だけでなく、モジュールのさまざまな部分で切り替えられます。

![Image for post](https://miro.medium.com/max/700/1*d_Nr9t-06_t1d6Nt7ZSWlw.png)

##7. flat

flat は、ネストされたJavascriptオブジェクトを取得して平坦化します。区切りキーを使って、オブジェクトの平坦化を解除することもできます。

![Image for post](https://miro.medium.com/max/700/1*xGTTX-khtUXuJWDptzo2HQ.png)
flat ― <https://github.com/hughsk/flat>

###インストール方法

`$ yarn add flat`

###使い方

```
const flatten = require('flat')

flatten({
   key1: {
      keyA: 'valueI'
   },
   key2: {
      keyB: 'valueII'
   },
   key3: { a: { b: { c: 2 } } }
})

// {
//    'key1.keyA': 'valueI',
//    'key2.keyB': 'valueII',
//    'key3.a.b.c': 2
// }
```

##8. JSON5

>JSON5 データ交換フォーマットは[JSON](https://tools.ietf.org/html/rfc7159)* のスーパーセットで、[ECMAScript 5.1](https://www.ecma-international.org/ecma-262/5.1/)のプロダクションの一部を含めるために構文を拡張し、JSONの制限の一部を緩和します。
>[*JSON5*](https://json5.org/)

![Image for post](https://miro.medium.com/max/700/1*dP3kUJm0Kxnc22aBKuqSeA.png)
json5 ― <https://github.com/json5/json5>

###インストール方法

```
yarn add json5
const JSON5 = require('json5')
```

###使い方

ファイル拡張子に注意してください。JSON5は、JSONの拡張機能とスーパーセットです。

```json
{
   // comments
   unquoted: 'and you can quote me on that',
   singleQuotes: 'I can use "double quotes" here',
   lineBreaks: "Look, Mom! \

No \\n's!",
   hexadecimal: 0xdecaf,
   leadingDecimalPoint: .8675309, andTrailing: 8675309.,
   positiveSign: +1,
   trailingComma: 'in objects', andIn: ['arrays',],
   "backwardsCompatible": "with JSON",
}
```
[example.json5](https://gist.github.com/indreklasn/4c72668bdcf7aea1ee1c75df7fa84389#file-example-json5)

##9. ESLint

[ESLint](https://eslint.org/)は、バグを回避し、開発チームにコーディング規約を適用する素晴らしいツールです。ECMAScript/JavaScriptコードで見つかったパターンを識別して報告します。

![Image for post](https://miro.medium.com/max/700/1*ardZGExGKQydDVn69orv7Q.png)
ESLint ― <https://github.com/eslint/eslint>

###インストール方法・使い方

`$ yarn add eslint`

次に、設定ファイルの作成が必要です。

`$ ./node_modules/.bin/eslint --init`

その後、任意のファイルやディレクトリでESLintを実行できます。

`$ ./node_modules/.bin/eslint yourfile.js`

詳しくは、[公式ドキュメント](https://eslint.org/)を確認してください。始め方と設定の例がたくさんあります。

##10. PM2

PM2は、Node.jsアプリケーション用のプロダクションプロセスマネージャーで、ロードバランサーを内蔵しています。これにより、アプリケーションを永続化させ、ダウンタイムなしでリロードし、一般的なシステム管理タスクを容易にできます。

![Image for post](https://miro.medium.com/max/700/1*FG5vEFL4JAFRKKo1xV1zDQ.png)
pm2 ― <https://github.com/Unitech/pm2>

###インストール方法

`$ yarn add global pm2`

###使い方

任意のアプリケーション（Node.js、Python、Ruby、$PATHのバイナリ等）を起動できます。

`$ pm2 start app.js`

アプリはデーモン化され、監視され、永続化します。[プロセス管理の詳細はこちら](https://pm2.keymetrics.io/docs/usage/quick-start/)。

##アプリケーション管理

起動したアプリケーションを簡単に管理できます。実行中のすべてのアプリケーションを一覧表示する方法は次の通りです。

`$ pm2 ls`

![Image for post](https://miro.medium.com/max/700/0*KQ58G3X9VXKVn94q.png)
pm2 ls

機能と活用方法の全リストは、[公式ドキュメント](https://pm2.io/)を確認してください。

##11. helmet

[helmet](https://helmetjs.github.io/)ライブラリは、さまざまなHTTPヘッダを設定することでExpressアプリを保護するのに役立ちます。「特効薬ではないが、助けにはなる！」

![Image for post](https://miro.medium.com/max/700/1*DfxAD59vJnefnLfds0Le7w.png)
helmet ― <https://github.com/helmetjs/helmet>

###インストール方法

`yarn add helmet`

###使い方

helmet は[Connect](https://github.com/senchalabs/connect)スタイルのミドルウェアで、[Express](https://expressjs.com/)などのフレームワークと互換性があります（Koaのサポートが必要な場合は、[`koa-helmet`](https://github.com/venables/koa-helmet)を確認してください）。

```
const express = require("express");
const helmet = require("helmet");

const app = express();

app.use(helmet());
```

トップレベルの`helmet`の関数は、11個の小さなミドルウェアのラッパーです。言い換えれば、この2つは同等です。

```
// This...
app.use(helmet());

// ...is equivalent to this:
app.use(helmet.contentSecurityPolicy());
app.use(helmet.dnsPrefetchControl());
app.use(helmet.expectCt());
app.use(helmet.frameguard());
app.use(helmet.hidePoweredBy());
app.use(helmet.hsts());
app.use(helmet.ieNoOpen());
app.use(helmet.noSniff());
app.use(helmet.permittedCrossDomainPolicies());
app.use(helmet.referrerPolicy());
app.use(helmet.xssFilter());
```

##12. compression

[compression](https://github.com/expressjs/compression)ライブラリはNode.jsの圧縮ミドルウェアです。

![Image for post](https://miro.medium.com/max/700/1*9hlAxJy6Eqa9JwGfn-sMNw.png)
compression ― <https://github.com/expressjs/compression>

###インストール方法

`$ yarn add compression`

###使い方

このモジュールを[express](https://github.com/expressjs/express)やconnectで使うには、expressミドルウェアでcompressionを呼び出すだけです。ミドルウェアを通過したリクエストは圧縮されます。

```
const compression = require('compression')
const express = require('express')

const app = express()

// compress all responses
app.use(compression())

// ...
```

##おわりに

私の[ニュースレター](https://wholesomedev.substack.com/welcome)では、コンテンツの最新情報の通知を、いち早く受け取ることができます。ぜひ登録してください。

>Zack Shapiroに謝意を表します。

##翻訳協力

この記事は以下の方々のご協力により公開する事ができました。改めて感謝致します。

Original Author: [Indrek Lasn](https://indreklasn.medium.com/) ([@lasnindrek](https://twitter.com/lasnindrek))
Original Article: [12 Useful Packages Every Node.js Developer Should Know](https://betterprogramming.pub/12-useful-packages-every-node-js-developer-should-know-2746db760e)
Thank you for letting us share your knowledge!

選定担当: @gracen
翻訳担当: @gracen
監査担当: -
公開担当: @gracen

##ご意見・ご感想をお待ちしております
今回の記事はいかがでしたか？
・こういう記事が読みたい
・こういうところが良かった
・こうした方が良いのではないか
などなど、率直なご意見を募集しております。
頂いたお声は、今後の記事の質向上に役立たせて頂きますので、お気軽に
コメント欄にてご投稿ください。[Twitter](https://twitter.com/BabyDegu?lang=ja)でもご意見を受け付けております。
皆様のメッセージをお待ちしております。