Mach3.laBlog

条件分岐に特化したリソースローダー「yepnope.js」を試してみる

この記事は賞味期限切れです。(更新から1年が経過しています)

最近ブログ記事のソースコードで見かけるようになった「yepnope.js」を試してみました。
条件分岐によって読むリソースを切り分ける事に特化したライブラリです。

条件分岐に特化したリソースローダー「yepnope.js」を試してみる

yepnope.jsとは

yepnope.js | A Conditional Loader For Your Polyfills!

yapnope.js

手書き風のロゴがかわいい。

yepはyes、nopeはnoの口語体で、固く言えば「yesno.js」。
与えた条件がtrueの場合とfalseの場合で読むJS/CSSを切り替えるのが得意な
リソースローダーです。

最も簡単なサンプル

yepnope("hoge.js");
yepnope("style.css");

単一ファイルをロードするだけの簡単なサンプルです。
内部的には、ドキュメント内で一番最初のScript要素を探して、
その前にinsertBeforeしているみたい。

ちなみに、スクリプトローダーではなく「リソースローダー」なので
JavaScriptだけではなくCSSもロード出来ます。

複数ファイルを読んでみる

yepnope({
    load : [ "hoge.js", "fuga.js" ]
});
load
後述するtestの結果に関わらず、とにかく読み込む。

条件分岐で読むJSを分ける

yepnope({
    test : ('localStorage' in window) && window['localStorage'] !== null,
    yep : [ "hoge.js", "fuga.js" ], /* testの結果がtrueの場合こっちを読む */
    nope : [ "foo.js", "bar.js" ] /* testの結果がfalseの場合こっちを読む */
});
test
基準となる条件文等
yep
testがtrueの時に読み込むファイル。単一ファイルの場合は文字列でも可。
nope
testがfalseの時に読み込むファイル。単一ファイルの場合は文字列でも可。

上の例は、localStorageが使用可能である場合はyepに設定したhoge.js,fuga.jsがロードされ、
そうでない場合はnopeに設定したfoo.js,bar.jsがロードされます。

コールバックを設定する

yepnope({
    test : ('localStorage' in window) && window['localStorage'] !== null,
    yep : [ "hoge.js", "fuga.js" ],
    nope : [ "foo.js", "bar.js" ]
    callback : function( url, result, key ){
        console.log( url ); /* ロードされたリソースのURL */
        console.log( result ); /* testの結果(true|false) */
        console.log( key ); /* yep|nope におけるインデックス(またはキー) */
    },
    complete : function(){
        console.log( "全部読み込み終わりました!" );
    }
});

ロード完了時の処理をcallback/completeで設定出来ます。
ファイルのロードは非同期に行われる為、
読むリソースを元に何かを処理したい場合はこれらのコールバックを使用します。

callback
リソースが読み込まれる度に呼ばれる。
complete
全リソースがロードし終えた時に一度だけ呼ばれる。

「無ければ読めばいいじゃない」を実装する

var Init = function(){
    if( !window.MyClass ){ return; }
    new MyClass();
};

yepnope({
    test : window.MyClass,
    nope : "myclass.js",
    complete : Init
});

myclass.js

var MyClass = function(){
    console.log( "Hello, MyClass" );
};

MyClassが無い場合はjsファイルをロードしてから、
既にある場合はスルーしてcompleteが呼ばれるのでそのまま初期化。

コールバックで再度条件分岐をしているのは、myclass.jsが読み込めたかどうかの保証が無い為。
myclass.jsが404でも、タイムアウト後にcompleteは呼ばれてしまいます。

まとめ

以前、ローダーもくっついている器用な「head.js」を記事にしましたが、
やはり特化したローダーともなると、さすがに色々と気が効いています。
基本的にJavaScriptファイルはパックしてしまう事が多いのですが、
新要素のフォールバック等にはかなり活用出来るかもしれませんね!

コメント

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*