Webの勉強はじめてみた その20 ～Node.js編 ライブラリの使い方～

N予備校「プログラミング入門Webアプリ」コースを受講しています。
今回は第3章4,5節です。

<h2>ライブラリを利用する</h2>
:::note
require: 必要なモジュールだけをメモリに記録する
:::

<h3>CSVを読み込む</h3>

```javascript
'use strict';
//FileSystem Module
const fs = require('fs');
//ReadLine Module
const readline = require('readline');
//ReadStream from CSV
const rs = fs.createReadStream('./popu-pref.csv');
//ReadLine from rs
const rl = readline.createInterface({input:rs, output:{}});
//DataMap key: 都道府県 value: 集計データのオブジェクト
const prefectureDataMap = new Map();
//line Event
// function(lineString){}
rl.on('line', lineString=>{
    //配列として取得
    const columns = lineString.split(',');
    //年
    const year = parseInt(columns[0]);
    //都道府県
    const prefecture = columns[1];
    //人口
    const popu = parseInt(columns[3]);
    //2010年 と 2015年を抽出
    if(year === 2010 || year === 2015){
        //DataMapに都道府県が存在するかチェック
        let value = prefectureDataMap.get(prefecture);
        if(!value){
            //存在しない場合、valueを初期化
            value ={
                //2010年人口
                popu10: 0, 
                //2015年人口
                popu15: 0,
                //変化率
                change: null
            };
        }
        if(year === 2010){
            value.popu10 = popu;
        }
        if(year === 2015){
            value.popu15 = popu;
        }
        //DataMap に追加
        prefectureDataMap.set(prefecture, value);        
    }
})
//close Event
rl.on('close', ()=>{
    //変化率
    for(let [key, data] of prefectureDataMap){
        data.change = data.popu15 / data.popu10;
    }
    //配列をソート 比較元(pair1)と比較先(pair2)
    const rankingArray = Array.from(prefectureDataMap).sort((pair1, pair2) =>{        
        //pair1[0], pair2[0]は都道府県(key)
        //pair1[1], pair2[1]は連想配列のオブジェクト
        //変化率を降順        
        return pair2[1].change - pair1[1].change;
    });
    const rankingStrings = rankingArray.map(([key, data], num) =>{
        let rank = num + 1;
        return `第 ${rank} 位: ${key} : ${data.popu10} => ${data.popu15} 変化率: ${data.change}`;        
    })
    console.log(rankingStrings);
})
```

`on`メソッド：関数をイベント登録する。AddHandlerみたいなもの？
`parseInt`: 整数値へ変換。CInt。
`map`: Array の要素それぞれを、与えられた関数を適用した内容に変換する。

<h2>yarn</h2>
:::note
Node.jsのためのパッケージマネージャ
依存関係にあるパッケージのインストールも行ってくれる。
:::

<h3>インストール</h3>

```
curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.21.1
```

:::note
グローバルインストール: Node.js の実行環境自体に npm パッケージをインストール
ローカルインストール: 現在のディレクトリにのみインストール
他のディレクトリから利用することは出来ない。
:::

<h3>パッケージ</h3>
```
yarn add パッケージ名
```
npmパッケージのインストール。
ローカルのフォルダを指定してインストールできる。

```
yarn init
```
npmパッケージ化。package.jasonを作成する。

<ul>
<li>name : パッケージ名</li>
<li>version : バージョン</li>
<li>description : 説明</li>
<li>entry point : ライブラリとして読み込まれるJSファイル</li>
<li>repository url : Gitリポジトリに公開する際のURL</li>
<li>author : npmに登録された際の著者名</li>
<li>license : デフォルトはMITライセンス</li>
<li>private : npmパッケージを公開するかどうか</li>
</ul>

<h4>パッケージ化するスクリプト</h4>

```javascript
'use strict';
function add(numbers){
    let result = 0;
    for(let num of numbers){
        result = result + num;
    }
    return result;
}
function multi(numbers){
    let result = 1;
    for(let num of numbers){
        result = result * num;
    }
    return result;
}

module.exports = {
    add, multi
};

```

`module exports ={}`
オブジェクトのプロパティとして関数を登録

<h2>まとめ</h2>
アロー関数にまだ戸惑う。
基本的には既存のライブラリを使いましょうということだけれど、そもそもフレームワークやAPIの違いってなんだろうかとふと思った。あとで調べたい。