npmライブラリを使うだけではなく、作れる側となるためのスタート

# 概要と対象読者
`npm install XXXXX`
Javascriptである程度開発を積まれた方々は、一度は目にしているコマンドでしょう。

これまでは利用するだけで、作る方法すら知らない身分でした。
すぐに何かライブラリを公開する、といった予定はないですが、最近色々実装する機会があり、いずれ公開するときがくる、、、ような気もしています。

**今回の記事では、作成から公開して使用してみるまでの流れ、これを理解するところから取り組んでみました。**

:::note
**以下のような方々に向けた記事です！**

- Javascriptの基本的な文法を理解している方
- 普段使っている`npm install XXX`の反対側（作る側）がどんなことをするのか気になる方
- npmのライブラリ公開に興味がある方
:::

## npmのアカウント登録

https://www.npmjs.com/

まずは、ライブラリを公開するためにnpmに自分の情報を登録するところから始めます。
ユーザ名・メールアドレス・パスワードを入力して
アカウントを作成してみました。（作成後の画面）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/6c40fbc5-f3ad-da6c-2ab1-29dec04559cd.png)

## 作成してみよう

#### コマンドライン系のライブラリ作成
何かをインストールして、ターミナルから、実行するタイプです。
(Git CLIが代表例の一つですかね。)

任意の作業フォルダを作成し、`npm init`を実行して、ライブラリ作成の土台を用意します。
いくつか質問されますので、設定した値を入力します。（`name`と`license`以外は何も入力せず、Enterキーを押しただけです。）
```package.json
{
  "name": "eno-hello-world",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "MIT"
}
```
**`license`**キー**
> OSS 開発においてライセンスが大事なことは言うまでもありません。 npm の世界では Permissive な MIT ライセンスが一般的です。

こちら、今後はきちんと確認しながら作成が必要ですが、そこに触れるようなレベルのことはしていない、、と思うので、現段階では深堀りしません。

https://t-wada.hatenablog.jp/entry/nodejs-package-json-tips

必要な情報以外を削除して、`bin`キーを用意します。
作成したいライブラリ名と、そのライブラリのための処理を記述するファイル名を設定します。

```package.json
{
  "name": "eno-hello-world",
  "version": "1.0.0",
  "bin": {
    "eno-hello-world": "index.js"
  },
  "license": "MIT"
}

```
コードとしては以下のように、コンソールのログ出力以外のことは特に実施していません。
```index.js
console.log('Eno Hello World');
```

**npm login実行**
一番最後のメッセージの通りにEnterキーを押すと、ブラウザが立ち上がります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/443c7be1-0916-fc8e-f5c4-d2ca713e5267.png)
ワンタイムパスワードが登録したメールアドレスに送信されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/68ad1307-2c20-724a-7bbc-df5a44e418d5.png)
**二段階認証**
画像真ん中あたりに、コードが表記されているので、その値を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/551f152d-2224-839c-aba7-ab6774ebe90f.png)
**認証成功しました。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/1bb3e3ad-2964-7b76-fa09-6b9ce845ffc4.png)
ユーザ名の表示確認をしてみます。
```
$ npm whoami
eno-conan
```
公開してみます。
```
npm publish
```

公開できたようです。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/7ca510a3-d4f8-a09d-6d89-c08ca78dcdce.png)
**npm公開できたことをブラウザで確認できました！！**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/2320409c-94c4-87bc-8a7b-854029cbf1cc.png)
また、
登録したアドレスに、メールが届きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/85d8788e-3721-2abb-8661-d51059630144.png)

公開したライブラリをインストールしてみました。
```
$ npm i --global eno-hello-world

added 1 package in 75ms
```

実行してみるとエラーが表示されます。
```
$ eno-hello-world
index.js: line 1: syntax error near unexpected token `'Eno Hello World2''
```

ここはchatGPTに聞いてみました。
**質問内容**
```
index.jsに以下コードを実装しました。
console.log("Eno Hello World2");

以下のpackage.jsonの内容で、
npmにeno-hello-worldという名前でライブラリを公開しました。
{
  "name": "eno-hello-world",
  "version": "1.0.1",
  "bin": {
    "eno-hello-world": "index.js"
  },
  "license": "MIT"
}

ローカル環境にライブラリをインストールしました。
npm i --global eno-hello-world
以下のエラーが表示されてしまいました。原因は何でしょうか。
line 1: syntax error near unexpected token `'Eno Hello World2''
```

**回答**
```
原因として考えられるのは、index.js ファイルの最初の行にシェバン (#!/usr/bin/env node) が欠けている可能性です。シェバンは、スクリプトが実行可能な Node.js スクリプトであることを示すために必要です。

したがって、index.js ファイルの先頭に次の行を追加してみてください:

javascript
Copy code
#!/usr/bin/env node
これにより、Node.js がスクリプトを実行するときに正しく解釈されるはずです。その後、再度パッケージをグローバルにインストールしてみてください。
```
シェバンを追加して、再度公開してみると、先ほどのエラーは表示されずに、コンソールに設定した値が表示されることを確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/718a44fb-a721-7f25-d7b7-35451736b21f.png)

また公開する際に、バージョンアップを行いますが、npmライブラリのアップデートには、Major,Minor,patchがあります。
今回は不具合修正くらいなので、patchに分類して、`npm version patch`を実行しました。
(`npm version major`や`npm version minor`といったコマンドもある)

**追加で確認してみました**
何かを更新して、再度公開する際に、同
じバージョンで複数回公開しようとしたらどうなるのか、試してみました。
以下のように**403エラー**が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/f325886d-0e4d-68e3-7546-106716e64377.png)

#### スクリプト系のライブラリ作成
あるファイルで、`import axios from 'axois'`といった形で、使用したいライブラリを定義する形をみなさん、よくみたことがあると思います。
そういったコード内の処理で使用できる形で公開したい場合にどうするのか確かめてみました。

```js:index.js
function hello() {
    console.log('Eno Hello Script');
}

// require('YYYY')で使用できる形
module.exports = hello; 
// import xxx from 'YYYY'で使用できる形
module.exports.default = hello; 
```

公開しました。（先ほどと同じなので、実行後だけ記載しています）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/ef96e762-ece6-968b-bac1-a2f819b6527c.png)

別の作業フォルダを用意し、`npm init`でpackage.jsonを作成します。
以下のコマンドで作成ライブラリをインストールすると、
`dependencies`に公開したライブラリ名の情報が追加されました。
```
npm i eno-hello-script
```
```json:package.json(一部抜粋)
{
  "dependencies": {
    "eno-hello-script": "^1.0.0"
  }
}
```
```js:workIndex.js
const hello = require('eno-hello-script');

hello();
```
nodeコマンドを使ってスクリプトを実行すると、出力されました！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345414/4bbe1a1b-b4e0-f127-4860-b79a8c262f88.png)

## 感想と今後
今回は、以下の記事を参考にして、作成を進めてきました。

https://qiita.com/saltyshiomix/items/0306e17cde8f2475f193

**本当に基本的な部分だけですが、大した手間なく公開まで行うことを確認できました。**

何かしらのライブラリをすぐに公開する予定はないですが、
以下のようにもう少し本格的なライブラリを公開するまでの手順を記載した記事もあるので、参考にしつつ、後々は自身でも公開できるようなレベルにあげられたら、と思いました。

https://zenn.dev/antez/articles/a9d9d12178b7b2

また`package.json`に記述で話題に挙げた`license`については、全然知識がないので、そのあたりも勉強です！！

Qiitaのnpmタグの記事にも参考になる情報が多そうなので、眺めてみようかと思います。

https://qiita.com/tags/npm

ありがとうございました！