はじめに
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な関数やクラスとして公開されます)
function hello() {
return "hello"
}
module.exports = {
hello,
}
class Hello {
constructor(v) {
this.value = v;
}
hello() {
return ("hello, " + this.value);
}
}
module.exports = {
Hello,
}
3.2 メインモジュール作成
パッケージのメインファイルとなるjsファイルを作成します。
今回は、index.js
という名前で作成していますが、package.json
のmain
に記載するファイル名を変更することで変更可能です。
モジュールを利用するファイルからrequire
で読み込んだ場合に実行されるスクリプトで、基本的にはライブラリモジュールを読み込んで、任意の名前で再度exportしておきます。(このファイルでexportされた識別子がモジュールを利用するコードから呼び出すことができる要素となります)
const hello = require('./lib/hello.js')
const hello2 = 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されている各関数やクラスを利用することができる。
const modtest = require('modtest')
// helloメソッド(hello.js内)
console.log(modtest.hello.hello())
// hello2.Heloクラス(hello2.js内)
var h = new modtest.hello2.Hello("test")
console.log(h.hello())