JavaScript

Node.js でも Webブラウザでも利用できる ライブラリのイントロ

More than 5 years have passed since last update.

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 は確実に怒るやり方なので冒頭の書き方の方がやっぱり良いなって思う