RequireJS 是一個非常小巧的 JavaScript 模塊載入框架,是 AMD 規范最好的實現者之一。而YII則是目前最熱門的PHP MVC框架了,下面主要分享如何在YII中使用RequireJS
使用registerScriptFile 引入RequireJS
在action代碼里通過registerScriptFile加載所有的JS代碼,代碼如下:
//deploy js directory of require modules and return a reference to location$js = Yii::app()->assetManager->publish( Yii::getPathOfAlias('application.components.js.requireModules'));//加載其它代碼Yii::app()->clientScript->registerScript( 'requiredScript', 'require.config({baseUrl: "' . $js . '",waitSeconds: 15});require( ["module1","module2"], function() { //start doing things once modules have loaded });', CClientScript::POS_END );
以上的代碼還可以進一步優化,那就是將配置代碼放到一下公共的JS文件里,然后載入該公共文件,這種方法不好的地方是似乎沒有辦法使用RequireJS 的data-main屬性。
在模板文件里載入RequireJS
YII中的Views模板文件其實就是一個HTML文件,所以我們就可以像在普通HTML文件里一樣使用RequireJS。
<script data-main="scripts/main" src="scripts/require.js"></script>
如果要在RequireJS里引入非AMD的模塊,如underscore, jQuery 插件等,則需要用到RequireJS的shim配置,而通過Shim進行配置的模塊在所有的調用之前進行配置,所以我們通過將RequireJS的配置代碼放在main.js中。但是通常每個頁面都有自己的代碼要執行,所以我們在data-main邊上加個非標準的屬性data-start,它的值就是當前頁面里需要執行的模塊。
<script data-main="scripts/main"data-start="scripts/page1,scripts/common" src="scripts/require.js"></script>
然后我們在main.js里遍歷該屬性,取得模塊列表,分別用require方法載入進來。例如我們項目里的每個模塊都有個init方法,所以我們就遍歷調用所有模塊的init方法。
這里再強調一下:data-start是我們自定義的屬性,用來表示該頁面需要初始化的模塊,你可以使用任何名稱。它的值是一個字符串,多個模塊使用逗號隔開,然后在代碼中把它解析成一個數組。
// load module for each page var startModules = $("script[data-main][data-start]").attr("data-start").split(','); _.each(startModules, function (module) { require([module], function(moduleObj) { if (moduleObj && moduleObj.init) { moduleObj.init(); } }); });
下面是完整的main.js里代碼示例:
requirejs.config({ "baseUrl": "js/lib", "paths": { "app": "../app" }, "shim": { "html' target='_blank'>jquery.alpha": ["jquery"], "jquery.beta": ["jquery"] }});// load module for each pagevar startModules = $("script[data-main][data-start]").attr("data-start").split(',');_.each(startModules, function (module) { require([module], function(moduleObj) { if (moduleObj && moduleObj.init) { moduleObj.init(); } }); });
其實以上的用法不限于YII,幾乎可以在任何項目中使用。
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答