初めてnpmパッケージを作ってみて、わりといろいろやることがあったのでメモします。
ES2015のコードで開発して、babelでES5にコンパイルしています。
ここに動いているコードは置いてあります。 https://github.com/mookjp/multi-proxy
前提
babelを使って、以下のようなパッケージ構成でES2015でnpmモジュールを開発しているものとします。
.
├── dist # babelでコンパイルしたコードを配置
├── package.json
└── src # ES2015のコードを配置
├── main
│ ├── lib
│ ├── main.js
│ └── middleware
└── test
├── lib
└── middleware
パッケージの設定
package.json
"scripts"
に、babel-cli
を使ってES2015のコードをコンパイルする処理を追加します。
また、"main"
にはコンパイル後のコードを指定します。
// 省略
"main": "dist/main.js", # babelでコンパイルしたコード
"scripts": {
// 省略
"build": "babel src/main -d dist" # dist以下に出力
},
"devDependencies": {
"babel-cli": "^6.3.17",
// 省略、テスト用パッケージ等
}
.gitignore
ES2015で開発しているモジュールなので、babelでコンパイルした後のコードはバージョン管理は不要だと思います。
.gitignore
にはbabelでコンパイルしたコードは含めないようにします。
// 省略
dist/
.npmignore
npm publish
するとき、パッケージのルートディレクトリに
-
.npmignore
がない -
.gitignore
がある
場合は、.gitignore
で無視されているファイルがnpm publish
時にも無視されます。
(参考: developers | npm Documentation)
今回は
- npmモジュールとしては
dist/
以下にビルドしたES5のファイルを配布したい - 逆にgitリポジトリに含めているES2015のソースコードは無視したい
ので、以下のような.npmignore
を書きます。
// 省略
# dist/
src/ # ES2015のソースコードが配置されているディレクトリ
TravisCIの設定
.travis.yml
deployフェーズの設定をします。
以下の例ではTravisCIが標準で用意している、npmパッケージをデプロイできるproviderをそのまま使っています。
language: node_js
node_js:
- "4.1"
after_success:
- npm run-script build
deploy:
provider: npm
email: "mookjpy@gmail.com"
api_key: $NPM_API_KEY
skip_cleanup: true # `run-script build`で生成したES5のコードを消さないようにする
on:
tags: true
TravisCIのプロジェクト設定
TravisCIのプロジェクトごとの環境変数設定項目に、$NPM_API_KEY
をあらかじめ設定しておきます。
プロジェクトの設定は https://travis-ci.org/your-username/project/ の、右側にsettings
というリンクがあるのでそこから行うことができます。
$NPM_API_KEY
は自分のマシンでnpm login
した後に以下のコマンドから確認することができます。
cat ~/.npmrc
//registry.npmjs.org/:_authToken=<Your key>
babel6からのdefault exportの扱いについて
babel6からはexport default
でexportしたモジュールにrequire
でアクセスする際の挙動が変わっています。
以下のようにES2015のexport default
を使った時は
export default myVar;
以下のようにrequire
で取得したオブジェクトのdefault
を参照する必要があります。
// var myVar = require('myVar'); これはbabel6からは使えない
var myVar = require('myVar').default; // defaultオブジェクトを指定する
今回例にしているプロジェクトをbabel6を使ってコンパイルする際は、src/main/main.js
を以下のように書くことができます。
これはES5のコードなので、babelのコンパイラを通してもそのままdist/main.js
に書きだされます。
module.exports = require('./lib/my_util').default; // ユーザー側からrequireを使ってアクセスされるであろうモジュール
npmモジュールのユーザーは普段通りの感覚でrequire
を使うことができます。
npm install great-package
var myUtil = require('great-package');