npmとjsdelivrで自作スクリプトを使えるようにする

# はじめに
　手っ取り早く自作ライブラリを雑にOpenProcessingとかp5.Editorで使ってみたい人のためのお手軽な公開手順。node.jsのインストールは終わっているとする。今のバージョンは22.16.0.
# 手順
　作りたいフォルダに移動してプロジェクトフォルダを作る。
```
mkdir myProject5
cd myproject5
```
んで、npm initする。
```
npm init
```
色々聞かれるのでプロジェクト名など適当に設定する。
```
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help init` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (myproject5) my_second_project_fish ここでプロジェクト名を決める

version: (1.0.0)
description: hajimemasite
entry point: (index.js)
test command:
git repository:
keywords:
author: fisce 作者名を決める
license: (ISC) ISC よくわかんないのでISCでいい
About to write to C:\myNPM\myProject5\package.json:

{
  "name": "my_second_project_fish",
  "version": "1.0.0",
  "description": "hajimemasite",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "fisce",
  "license": "ISC"
}
```
同じディレクトリにsrcフォルダを作り、その中にindex.jsを作る。雑にこんな感じで。内容はざっくり言うと「mylibrary」というオブジェクトに「hello」という関数が入っててその内容はメッセージの出力と送出。
```js
(function(global, factory){
  if (typeof exports === "object" && typeof module !== "undefined") {
    factory(exports);
  } else if(typeof define === "function" && define.amd) {
    define(["exports"], factory);
  } else {
    global = global || self;
    factory((global.mylibrary = {}));
  }
})(this, function (exports) {
  "use strict";

  function hello(){
    const message = "はじめまして！はじめてのライブラリ";
    console.log(message);
    return message;
  }

  exports.hello = hello;

  Object.defineProperty(exports, "__esModule", { value: true });
});
```
npmにログインする。あらかじめアカウントを作っておき、パスワードなどを決めておく。

https://www.npmjs.com/

ログインする。自分は二段階認証でやってる。
```
npm login

npm notice Log in on https://registry.npmjs.org/
Login at:
https://www.npmjs.com/login?next=/login/cli/7e7ea1be-c552-45e9-827c-8a0b7296e0f4
Press ENTER to open in the browser...
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437349/59c2bac2-66c6-414f-8d19-affdbaea5324.png)

アイコンはGravatarというのでいじれるらしいけど使ってない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437349/5db2eff6-0cb8-4c48-8dbc-1e393a92d1a4.png)

次に、npm publishでpublishしてみよう。
```
npm publish
```

追加された。

![wr2f23f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437349/9dbf770f-0b9b-43ae-a845-7e2b3f896b99.png)

　これで使えるようになる。jsdelivrを覗いてみる。

https://www.jsdelivr.com/

　しかし見つからない。実はすぐには反映されないようになっている。最初に作った時はその日のうちに作ってもらえなかったので次の日まで待ってみた。朝になったら追加されていた。2回目以降は早くなるみたい。ユーザー名で検索すると簡単に検索できる。自分の場合は「fisce」なので「author:fisce」で検索できる。ユーザー名はnpmのアカウント作成時に付けたもの。

![3t4t3t34e5r.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437349/182ac1d1-9e9b-46f2-9b34-0d57a70b8fe4.png)

　数分で反映された。はやい。

![w2f2f2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437349/355c882e-da8b-42ed-92bb-8784f722f7fa.png)

　これがCDNで、なんと自動的にminifyを作ってくれる。うれしいね。早速使ってみよう。OpenProcessing.

![qwd2qcwcwfcwcd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437349/14d8dd4a-3b67-41d1-842b-67863337caeb.png)

ここにjsdelivrのアドレスをぶち込む。

```js
const {hello} = mylibrary;

function setup() {
	createCanvas(600, 400);
	const msg = hello();
	textAlign(CENTER,CENTER);
	textSize(24);
	noStroke();
	fill(255);
	background(0);
	strokeWeight(2);
	text(msg, 300, 200);
}
```
　どきどき

![wrd2rwr3f3f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437349/a9000b8e-2989-4193-b982-5b12fd78d157.png)

　使えました。やったぁ。

　アップデートする際の注意。バージョンを更新しないといけない。major,minor,patchがある。一番下の数字を更新する場合はpatchを使う。なんらかの更新をしないとpublishできないので注意する。以前にpublishしたバージョンはそのまま残るので切り替えも容易。ここではReadmeを作ってみる。

```md:readme.md
# はじめに
　これは自作ライブラリを作るテストです。
```

npm publishするとエラーになる。そこでpatchのバージョン更新をする。
```
npm version patch -m "readme.mdを追加しました。"
```
これでpublishできる。
```
（略）
npm notice Publishing to https://registry.npmjs.org/ with tag latest and default access
+ my_second_project_fish@1.0.1
```
サイトに行ってみるとバージョンが増えている。

![efwfwf3ww.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437349/3c9881f1-2522-4361-8055-b2bc532604e3.png)

![qe2df2wfwf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437349/d9f266b5-9deb-4b72-bd8a-efa71e6aedcd.png)

トップに置いたreadme.mdの内容が反映される。
jsdelivrも1.0.1が使用可能になっている。

[https://cdn.jsdelivr.net/npm/my_second_project_fish@1.0.1/src/index.min.js](https://cdn.jsdelivr.net/npm/my_second_project_fish@1.0.1/src/index.min.js)

```js:https://cdn.jsdelivr.net/npm/my_second_project_fish@1.0.1/src/index.min.js
/**
 * Minified by jsDelivr using Terser v5.39.0.
 * Original file: /npm/my_second_project_fish@1.0.1/src/index.js
 *
 * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
 */
!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?o(exports):"function"==typeof define&&define.amd?define(["exports"],o):o((e=e||self).mylibrary={})}(this,(function(e){"use strict";e.hello=function(){const e="はじめまして！はじめてのライブラリ";return console.log(e),e},Object.defineProperty(e,"__esModule",{value:!0})}));
//# sourceMappingURL=/sm/f7ced3208938d885b125953ea3108c0c883291a1b698971aba55dfe524e67963.map
```

数分後には更新されていた。

![wcd2wcfwv3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437349/9f303a83-776c-4e72-bd38-3bc24f2a100a.png)


ざっくりこんな感じ。

# おわりに
　拝読感謝。

```
npm logout
```

# 参考サイト
　[本当にやさしいnpmライブラリ開発入門](https://qiita.com/saltyshiomix/items/0306e17cde8f2475f193)
　[npm入門](https://www.tohoho-web.com/ex/npm.html)

## p5.jsのアドオンライブラリを作ろう
　きゃべさんの次の記事も参考になります。

https://kyabe.net/blog/create-addon-library-for-p5js/

自作するより既にあるものを使った方が楽なのは言うまでもありません。

https://kinsta.com/jp/blog/javascript-libraries/