Web で動く前提のライブラリだけど、node のコンソールで叩いて検証した事はよくある。async.js のソース見て、「ああ、こうすればよかったのか」感銘を受けたので。
intro.js
(function(root) { // 引数の root はグローバルオブジェクト
var myModule = {},
// もし先に同じ名前のオブジェクトが当てられていた場合の対策
oldMyModule = root.myModule;
if (typeof module !== 'undefined' && module.exports) { // Node.js の場合
module.exports = myModule;
} else { // ブラウザの場合
root.myModule = myModule;
}
// 衝突対策
myModule.noConflict = function() {
root.myModule = oldMyModule;
return myModule;
};
// 以下モジュールのAPI の宣言
})(this); // トップレベルでの this はグローバルオブジェクトを指す
require
不要なスタンドアロンのライブラリだとこれでよい
おまけ
(function(exports) {
// モジュールの API を宣言する
})(typeof exports === 'undefined' ? (myModule = {}) : exports);
↑ の書き方もよく見るけど、こっちの場合 myModule
をグローバルにダイレクトに代入してるので、先の例のような noConflict()
のような対応が出来ないのと、JsLint は確実に怒るやり方なので冒頭の書き方の方がやっぱり良いなって思う