-
Notifications
You must be signed in to change notification settings - Fork 8
ModuleName
このエントリでは、WebModule をベースにしたモジュールの命名について説明します。
初めて npm にモジュール(パッケージ)を登録しようとした方は、いくつかの制約が存在することに気がつくはずです。
- モジュール名に利用可能な文字種は a〜z, 0〜9, ドットとアンダーバーだけで、A〜Zは利用禁止です
- npm はモジュールをフラットな名前空間で管理しており、npm 全体でユニークな名前をつける必要があります
- 既に npmjs.org に存在する名前は使えません
- そして、大抵の名前は、既にどこかの誰かに取得されています
- package.json の name が衝突するとエラーになります(npm publish の段階でエラーになります)
例えばあなたが、非同期問題を美しく解決するモジュールを開発し、モジュール名を async にしたくても、その願いは恐らく叶いません。ドメイン名の登録と同じような、やり場のない敗北感を味わうのが現状です。
名前の衝突が発生するかどうかは $ npm search キーワード が調べることが可能ですが、npm search コマンドのレスポンスが30秒〜50秒ほど返ってこない事もあり、「最初から衝突しない名前空間を設計する」事がより重要になってきます。
WebModule をベースとしたモジュールは、2つの名前を持つことになります。
1つ目は github のリポジトリ名です。これは Valid.js のような名前になります。
2つ目は npm に登録してあるモジュール名です。これはユーザ名を先頭に付けた uupaa.valid.js のような名前になります。
本来は、github と npm の名前を統一できれば良いのですが、このエントリの上部で述べたようなパッケージマネージャのシステム上の理由により、ダブルネームを使い分ける必要があります。
WebModule が推奨するモジュールの命名規則は、以下の通りです。
-
github に登録するモジュール名は以下の規則を守ってください
- モジュールの機能を端的に表したキーワードを使ってください
- モジュール名はURLの一部になります。URLに利用できる文字種を使ってください
- モジュール名の一部はクラス名としても利用されます、単語と単語の接続にはハイフンやアンターバーではなく PacalCase を使ってください。
- JavaScript で書かれたモジュールの末尾は ".js" にしてください
-
npm に登録するモジュール名は、以下の式で生成することを推奨しています。
var npmModuleName = [githubUserName, githubModuleName, ".js"].join(".").toLowerCase();
npm 公式では「モジュール名(パッケージ名)の末尾に".js"をつける必要はありません。不要です」と説明がありますが、WebModule では ".js" をつける事を推奨しています。理由は2つあります。
-
github 上のモジュール名と ⇔ npm 上のモジュール名の関係性が明白になるため(自動変換が簡単になるため)
// github リポジトリ名が "https://github.com/uupaa/Valid.js" の場合は、 // 以下の式で github 名から npm 名を生成できます "uupaa/Valid.js".replace("/", ".").toLowerCase(); // -> "uupaa.valid.js"
-
AltJS のように js をトランスレーションで作成するケースが増えてきたため、モジュール名の末尾に記述言語を、".ts" や ".coffee" のように付けたほうが分類しやすいため
です。
モジュールの命名例です。
// package.json
{
"name": "valid" // 既に存在するため npm publish でエラーになります
}// package.json
{
"name": "uupaa.Valid.js", // npm 名を指定します
"url": "https://github.com/uupaa/Valid.js", // github 名を指定します
"repository": {
"type": "git",
"url": "https://github.com/uupaa/Valid.js.git"
},
"x-build": {
"module": {
"develop": ["uupaa.reflection.js", "uupaa.help.js"], // npm 名を指定します
"release": ["uupaa.nodemodulejs"] // npm 名を指定します
}
},
"dependencies": { // npm 名を指定します
},
"devDependencies": { // npm 名を指定します
"uupaa.nodemodule.js": "",
"uupaa.reflection.js": "",
"uupaa.console.js": "",
"uupaa.help.js": "",
"uupaa.task.js": "",
"uupaa.test.js": "",
"uupaa.watch.js": "",
"uupaa.plato.js": "",
"uupaa.minify.js": ""
},
}