WSL環境におけるNode.jsのためのyarn導入から利用

# はじめに
投稿者の備忘録としての活用が主です。
Webの作成において役に立つNode.jsのパッケージマネージャーとして
yarnを導入しました。([Node.jsの導入はこちらから][nodejs])
(Pythonでいうところのpip的な感じ)
yarnを使って様々なライブラリなどを自分のプログラミングに活用していけます。

# 環境
`wsl(Windows Subsystem for Linux)`にインストールします。

```
Editor: VSCode
Shell : bash version 4.4.20
Ubuntu: 18.04.4 LTS
node  : v10.14.2
```

# 目次
1. **yarnの導入**[ >>](#1yarnの導入)
2. **yarnについて**[ >>](#2yarnについて)
3. **npmパッケージ作成**[ >>](#3npmパッケージの作成)
4. **作成したパッケージの利用**[ >>](#4作成したパッケージの利用)


# 1.yarnの導入
`wsl`のコンソールを開き、

```bash:wsl
$ curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.21.1
```
```bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     

中略
> Successfully installed Yarn 1.21.1! Please open another terminal where the 
`yarn` command will now be available.
```
最後の一行が表示されればインストール完了です。

次に、`.bashrc`ファイルを読み込むか、`VSCode`を立ち上げなおします。

```bash:wsl
$ source ~/.bashrc
```

# 2.yarnについて
詳しい使い方(CLI)は[公式サイト][yarncli]でみてほしいです。

yarnによる`npm`パッケージのインストールには、
`グローバルインストール`:Node.js実行環境全体で使う
`ローカルインストール`:カレントディレクトリ内でのみ使う
の二種類ありますが、今回試していくのはすべて`ローカルインストール`であると
理解してください。

# 3.npmパッケージの作成
このパッケージは、フィボナッチ数列とトリボナッチ数列を出力するパッケージです。
どのような場面で活躍するかな知りません。
あくまでパッケージ作成の練習です
### 〇パッケージを作成するディレクトリを作成

```bash:wsl
$ mkdir trib
$ cd trib 
```
以下`trib`ディレクトリで作業を行います。

---
### 〇npmパッケージ作成のチュートリアル
今回は特に変更などしません。

```bash:wsl
$ yarn init
yarn init v1.21.1
question name (trib):
```
`Enter`を押下して、パッケージ名を`trib`にしました。

```
question version (1.0.0):
```
`Enter`を押下して、バージョンを `1.0.0` にしました。

```
question description:
```
`Enter`を押下して、パッケージの説明をつけませんでした。

```
question entry point (index.js):
```
`Enter`を押下して、`ライブラリ`として読み込まれるファイル名を
`index.js`にしました。

```
question repository url:
```
`Enter`を押下して、Gitリポジトリは公開しません。

```
question author:
```
`Enter`を押下して、npmの著者名は設定しませんでした。

```
question license (MIT):
```
`Enter`を押下して、`MITライセンス`に従うものとしました。

```
question private:
```
`Enter`を押下して、

```
success Saved package.json
Done in 3.45s.
```
これでパッケージの内容が書き込まれた`package.json`というファイルが作成されました。

```bash:wsl
$ ls
package.json
$ cat package.json
{
  "name": "trib",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT"
}
```
---
### 〇パッケージtribの実装
任意の方法(touchとか)で`trib`ディレクトリ内に`index.js`を作成し、
実際に実装していきます。

```index.js
'use strict';
// フィボナッチ数列
function printFib(length) {
    console.log(length+'番目までのフィボナッチ数列');
    const memo = new Map;
    memo.set(0, 0);
    memo.set(1, 1);
    function fib(n) {
        if (memo.has(n)) {
            return memo.get(n);
        }
        const value = fib(n - 1) + fib(n - 2);
        memo.set(n, value);
        return value;
    }
    for (let i = 0; i < length; i++) {
        console.log(fib(i));
    }
}

// トリボナッチ数列
function printTrib(length) {
    console.log(length+'番目までのトリボナッチ数列');
    const memo = new Map();
    memo.set(0, 0);
    memo.set(1, 0);
    memo.set(2, 1);
    function trib(n) {
        if (memo.has(n)) {
            return memo.get(n);
        }
        const value = trib(n - 1) + trib(n - 2) + trib(n - 3);
        memo.set(n, value);
        return value;
    }
    for (let i = 0; i < length; i++) {
        console.log(trib(i));
    }
}
module.exports = { printFib, printTrib };
```
関数の内容はさておき...(すみません)

>```
module.exports = { printFib, printTrib };
```

この部分で、`module.exports`オブジェクトのプロパティとして関数を登録します。
これはプロパティ名と値の変数名が同一である場合の略記法なので、
プロパティ名と値の変数名が異なる場合などは、

```
module.exports = {
  printFib: printFib,
  printTrib: printTrib
};
```
のように書いてください。

#4.作成したパッケージの利用
パッケージを利用する(インストール)するための、
ディレクトリを作成します。 (∵ローカルインストール)

```bash:wsl
$ cd ..
$ mkdir trib-run
$ cd trib-run/
```
以下、`trib-run`ディレクトリで作業を行います。

---

先ほど同様に、[チュートリアル](#〇npmパッケージ作成のチュートリアル)を行います。

```
$ yarn init
yarn init v1.21.1
以下略
```
完了したら、先ほど作成したパッケージをインストールします。

```bash:wsl
$ yarn add ../trib
yarn add v1.21.1
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...
success Saved lockfile.
success Saved 1 new dependency.
info Direct dependencies
└─ trib@1.0.0
info All dependencies
└─ trib@1.0.0
Done in 0.28s.
```
色々メッセージがでて、インストール完了です。

任意の方法(touchとか)で`trib-run`ディレクトリ内に`sample.js`などの
JSファイルを作成し、実際に活用していきます。

```js:sample.js
'use strict';
const algo = require('trib');

algo.printFib(10);
algo.printTrib(10)
```
それでは、実行してみます。

```bash:wsl
$ node sample.js
10番目までのフィボナッチ数列
0
1
1
2
3
5
8
13
21
34
10番目までのトリボナッチ数列
0
0
1
1
2
4
7
13
24
44
```
以上のことから、パッケージのインストールと利用を行えました。

# おわりに
まだ自分が初心者なので、頭の整理を兼ねて書きました。
知識の更新があり次第、こちらに追加していくつもりです。
まだまだNode.js, yarnに関して浅学なので、内容の薄さはご了承ください。
Gitとの関係などもしっかり理解していこうと思っています。

yarnのネコかわいい...
さよなら:wave:

# 関連記事
- [Linux環境におけるNode.jsの導入から利用][nodejs]

# 参考
- [N予備校 2020年 プログラミング入門](https://www.nnn.ed.nico/courses/668/chapters/9516)
- [yarn公式サイト][yarncli]



[nodejs]:https://qiita.com/RoaaaA/items/17df30bf9400edfb7fb3
[yarncli]:https://classic.yarnpkg.com/ja/docs/cli/