ライブラリの一部でありながら単体利用も可能にする工夫

140文字を超えちゃうので、こちらで。

JavaScriptなコードを書いてると「このへんの処理はどこにも依存してないから、特定のライブラリの一部ではなく、単体でロードしても使えるような部品としてまとめられたらなぁ」とか「でも、ライブラリの一部として利用する場合にグローバルネームスペースを汚染するのはダメだよなぁ」と、考えたことはありませんか?

window.uu 以下をライブラリのネームスペースとして利用している uupaa.js では、このような工夫をしています。

// === uu.base64 / window.base64 ===
(function(namespace) {

namespace.base64 = {
    encode: base64encode, // base64.encode(data:String/ByteArray,
                          //               toURLSafe64:Boolean = false):Base64String/URLSafe64String
    decode: base64decode  // base64.decode(data:Base64String/URLSafe64String,
                          //               toByteArray:Boolean = false):String/ByteArray
};

function base64encode() { ... }
function base64decode() { ... }

})(this.uu || this);

こうすることで、window.uu があれば uu.base64 が追加され、無ければ window.base64 が追加されるため、ソースコードが単体でも利用可能になります。

最後の行を window.uu || window とせず this.uu || this とすることでサーバサイドからの利用も、ちょっとだけ考慮しています。

シングルトンな構造にしたいなら

何度ロードされても一度しか初期化されないように(安全に)するには、こうします。

(this.uu || this).base64 || (function(namespace) {

namespace.base64 = { ... }

})(this.uu || this);

簡単ですね。

使い方

GoogleCodeリポジトリにあるコードを、直接呼び出すこともできます。

<script src="http://uupaa-js.googlecode.com/svn/trunk/0.8/src/misc/msgpack.js"></script>
<script src="http://uupaa-js.googlecode.com/svn/trunk/0.8/src/misc/utf8.js"></script>
<script src="http://uupaa-js.googlecode.com/svn/trunk/0.8/src/misc/base64.js"></script>