はじめに
npmでインストール可能なモジュール(パッケージ)のなるべく最小構成の作成方法が中々見つからなかったので、簡単にまとめました。
環境
- Node.js 12.16
- npm 6.14
ファイル構成
npmパッケージには、1つのディレクトリ内にモジュールのソースコードセット、package.json
、エントリーポイントとなるjsファイル(今回はindex.js
とする)の3種類が必要となる。
今回の例としては、ディレクトリをmodtest、モジュールのソースコードをサブディレクトリlibの配下に2種類(hello.js, hello2.js)、index.jsとします。
- modtest/
- lib/
- hello.js
- hello2.js
- index.js
- package.json
- lib/
モジュールの作成
1. ディレクトリ作成
空のディレクトリ(今回はmodtest)を作成しておきます。
2. package.jsonの作成
空のディレクトリへ移動し、npm init
コマンドを実行します。
npm init
対話式にモジュール名、バージョン番号等のパッケージ情報を尋ねられるため、必要事項を入力すると、同ディレクトリに下記のようなpackage.json
が作成されます。
{"name":"modtest","version":"1.0.0","description":"The test modules for npm.","main":"index.js","scripts":{"test":"echo \"Error: no test specified\"&& exit 1"},"author":"aqmr-kino","license":"ISC"}
3. ライブラリモジュールの作成
3.1 モジュール作成
モジュール化する対象のコードを作成します。
今回はサンプルとして関数1個(hello)とクラス1個(Hello)を作成します。
各ファイルの最後にmodule.exports
を使用して外部からアクセス可能とする関数を設定します。(exportした関数やクラスのみがpublicな関数やクラスとして公開されます)
functionhello(){return"hello"}module.exports={hello,}
classHello{constructor(v){this.value=v;}hello(){return("hello, "+this.value);}}module.exports={Hello,}
3.2 メインモジュール作成
パッケージのメインファイルとなるjsファイルを作成します。
今回は、index.js
という名前で作成していますが、package.json
のmain
に記載するファイル名を変更することで変更可能です。
モジュールを利用するファイルからrequire
で読み込んだ場合に実行されるスクリプトで、基本的にはライブラリモジュールを読み込んで、任意の名前で再度exportしておきます。(このファイルでexportされた識別子がモジュールを利用するコードから呼び出すことができる要素となります)
consthello=require('./lib/hello.js')consthello2=require('./lib/hello2.js')module.exports={hello,hello2,}
モジュールのインストール
上記の各種ファイルセットを作成後、npm install
コマンドでpackage.json
があるディレクトリを指定することで、パッケージとしてインストールすることが可能です。
ローカルのディレクトリから
npm install
コマンドで作成したモジュールセットの格納されたディレクトリを指定することでモジュールとしてインストールすることができます。
npm install ./modtest
GitHubから
上記のファイル構成をGithubのリポジトリとしては登録しておけば、npm install
でコマンドでgit+リポジトリのURL
を指定することによりインストールすることもできる。
npm install git+https://github.com/user_name/repository_name.git
インストールしたモジュールの使い方
npmでパッケージとしてインストールしたモジュールは一般的なnpmパッケージと同様にrequireで読み込み、パッケージ内でexportされている各関数やクラスを利用することができる。
constmodtest=require('modtest')// helloメソッド(hello.js内)console.log(modtest.hello.hello())// hello2.Heloクラス(hello2.js内)varh=newmodtest.hello2.Hello("test")console.log(h.hello())