java模塊化按需加載,JavaScript模塊化之使用requireJS按需加載

模塊加載器的概念可能稍微接觸過前端開發的童鞋都不會陌生,通過模塊加載器可以有效的解決這些問題:

JS文件的依賴關系。

通過異步加載優化script標簽引起的阻塞問題

可以簡單的以文件為單位將功能模塊化并實現復用

主流的JS模塊加載器有requireJS,SeaJS等,加載器之間可能會因為遵循的規范不同有微妙的差別,從純用戶的角度出發,之所以選requireJS而不是SeaJS主要是因為:

功能實現上兩者相差無幾,沒有明顯的性能差異或重大問題。

文檔豐富程度上,requireJS遠遠好于SeaJS,就拿最簡單的加載jQuery和jQuery插件這回事,雖然兩者的實現方法相差無幾,但requireJS就有可以直接拿來用的Demo,SeaJS還要讀文檔自己慢慢折騰。一些問題的解決上,requireJS為關鍵詞也更容易找到答案。

requireJS 加載jQuery + jQuery插件

可能對于一般Web App來說,引入jQuery及相關插件的概率是最大的,requireJS也親切的給出了相應的解決方案及動態加載jQuery及插件的文檔及實例代碼。

在最新的jQuery1.9.X中,jQuery已經在最后直接將自己注冊為一個AMD模塊,即是說可以直接被requireJS作為模塊加載。如果是加載舊版的jQuery有兩種方法:

1. 讓jQuery先于requireJS加載

2. 對jQuery代碼稍做一點處理,在jQuery代碼包裹一句:

define(["jquery"], function($) {

// $ is guaranteed to be jQuery now */

});

requireJS的示例中,直接將requireJS與jQuery合并為一個文件,如果是采用jQuery作為核心庫的話推薦這種做法。

同樣對于jQuery插件來說也有兩種方法

1. 在插件外包裹代碼

define(["jquery"], function($){

// Put here the plugin code.

});

2. 在使用reuqireJS代碼加載前注冊插件(比如在main.js)中

requirejs.config({

"shim": {

"jquery-cookie" : ["jquery"]

}

});

requireJS加載第三方類庫

在實例的App中還用到了jQuery以外的第三方類庫,如果類庫不是一個標準的AMD模塊而又不想更改這些類庫的代碼,同樣需要提前進行定義:

require.config({

paths: {

'underscore': 'vendor/underscore'

},

shim: {

underscore: {

exports: '_'

}

}

});

CSS文件的模塊化處理

在requireJS中,模塊的概念僅限于JS文件,如果需要加載圖片、JSON等非JS文件,requireJS實現了一系列加載插件。

但是遺憾的是requireJS官方沒有對CSS進行模塊化處理,而我們在實際項目中卻往往能遇到一些場景,比如一個輪播的圖片展示欄,比如高級編輯器等等。幾乎所有的富UI組件都會由JS與CSS兩部分構成,而CSS之間也存在著模塊的概念以及依賴關系。

為了更好的與requireJS整合,這里采用require-css來解決CSS的模塊化與依賴問題。

require-css是一個requireJS插件,下載后將css.js與normalize.js放于main.js同級即可默認被加載,比如在我們的項目中需要加載jQuery Mobile的css文件,那么可以直接這樣調用:

require(['jquery', 'css!../css/jquery.mobile-1.3.0.min.css'], function($) {

});

不過由于這個CSS本質上是屬于jQuery Mobile模塊的一部分,更好的做法是將這個CSS文件的定義放在jQuery Mobile的依賴關系中,最終我們的requireJS定義部分為:

require.config({

paths: {

'jquerymobile': 'vendor/jquery.mobile-1.3.0',

'jstorage' : 'vendor/jstorage',

'underscore': 'vendor/underscore'

},

shim: {

jquerymobile : {

deps: [

'css!../css/jquery.mobile-1.3.0.min.css'

]

},

underscore: {

exports: '_'

}

}

});

在使用模塊時,只需要:

require(['jquery', 'underscore', 'jquerymobile', 'jstorage'], function($, _) {

});

jQuery Mobile的CSS文件就會被自動加載,這樣CSS與JS就被整合為一個模塊了。同理其他有復雜依賴關系的模塊也可以做類似處理,requireJS會解決依賴關系的邏輯。

數據源的加載與等待

Web App一般都會動態加載后端的數據,數據格式一般可以是JSON、JSONP也可以直接是一個JS變量。這里以JS變量為例:

var restaurants = [

{

"name": "KFC"

},

{

"name": "7-11"

},

{

"name": "成都小吃"

}

]

載入這段數據:

$.getScript('data/restaurants.json', function(e){

var data = window.restaurants;

alert(data[0].name); //KFC

});

單一的數據源確實很簡單,但是往往一個應用中會有多個數據源,比如在這個實例App中UI就需要載入用戶信息、餐廳信息、訂餐信息三種數據后才能工作。如果僅僅靠多層嵌套回調函數的話,可能代碼的耦合就非常重了。

為了解決多個數據加載的問題,我習慣的解決方法是構造一個dataReady事件響應機制。

var foodOrder = {

//數據載入后要執行的函數暫存在這里

dataReadyFunc : []

//數據源URL及載入狀態

, dataSource : [

{ url : 'data/restaurants.json', ready : false, data : null },

{ url : 'data/users.json', ready : false, data : null },

{ url : 'data/foods.json', ready : false, data : null }

]

//檢查數據源是否全部載入完畢

, isReady : function(){

var isReady = true;

for(var key in this.dataSource){

if(this.dataSource[key].ready !== true){

isReady = false;

}

}

return isReady;

}

//數據源全部加載完畢,則逐一運行dataReadyFunc中存放的函數

, callReady : function(){

if(true === this.isReady()){

for(var key in this.dataReadyFunc){

this.dataReadyFunc[key]();

}

}

}

//供外部調用,會將外部輸入的函數暫存在dataReadyFunc中

, dataReady : function(func){

if (typeof func !== 'function') {

return false;

}

this.dataReadyFunc.push(func);

}

, init : function(){

var self = this;

var _initElement = function(key, url){

$.getScript(url, function(e){

//每次載入數據后,將數據存放于dataSource中,將ready狀態置為true,并調用callReady

self.dataSource[key].data = window[key];

self.dataSource[key].ready = true;

self.callReady();

});

}

for(var key in this.dataSource){

_initElement(key, this.dataSource[key].url);

}

}

}

用法為:

foodOrder.dataReady(function(){

alert(1);

});

foodOrder.init();

dataReady內的alert將會在所有數據載入完畢后開始執行。

這段處理的邏輯并不復雜,將所有要執行的方法通過dataReady暫存起來,等待數據全部加載完畢后再執行,更加復雜的場景此方法仍然通用。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533204.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533204.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533204.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

宇軒網絡面試題目PHP,二十道接地氣的php面試題,讓你直接通過面試!就此奉上~...

1、echo count(“abc”); 輸出什么?答:"1"count— 計算數組中的單元數目或對象中的屬性個數int count ( mixed var\[,intvar \[, intvar\[,intmode ] ), 如果 var 不是數組類型或者實現了 Countable 接口的對象,將返回 1&#xff0…

java期末試題c卷,JAVA程序設計期末考試試卷及參考答案

《JAVA程序設計》期末考試試卷考生注意:1.本試卷滿分100分。2.考試時間90分鐘。3.卷面整潔,字跡工整。4.填寫內容不得超出密封線。總分題號一二三四五六核分人題分21204019復查人得分一、單選擇題(每題2分&…

mysql 分組查詢原理,MySQL分組查詢Group By實現原理詳解

由於GROUP BY 實際上也同樣會進行排序操作,而且與ORDER BY 相比,GROUP BY 主要只是多了排序之后的分組操作。當然,如果在分組的時候還使用了其他的一些聚合函數,那么還需要一些聚合函數的計算。所以,在GROUP BY 的實現…

mysql 執行計劃詳解,Mysql中的explain執行計劃詳解(1)

創建一個表test_explain,并添加入下的數據mysql> create table test_explain( a int primary key, b int);Query OK, 0 rows affected (0.09 sec)mysql> insert into test_explain value(1,1),(2,2),(3,3),(4,4),(5,5);explian中的type字段:表示m…

mac php命令行模式,phpstorm分別在Mac和Windows下啟動命令行,并啟用ssh

Mac:在terminal下運行 sudo -i 輸入密碼 就可以用ssh IP:端口 命令行登錄了DAssist是一個命令行開發輔助,可直接在系統命令行工具中使用,Linux和MacOS等自帶命令終端的系統好說,windows下也有cmd和powerShell。那么如何結合開發IDE工具進行…

matlab 價格統計,matlab中的金融數據統計

1.均勻分布隨機數生成函數unidrnd(N,m,n)N生成1到N之間的一個隨機數,確定輸出矩陣m行,n列。2.生成連續均勻分布的隨機數unifrnd(A,B,m,n)A,B表示上下界。3.生成正態分布隨機數normrnd(mu,sigma,m,n)mu均值,…

php訪問js文件不存在,php文件里js不能被執行

我想把上傳文件路徑返回到前端保存&#xff0c;但是后臺php文件里的js沒有執行&#xff0c;前臺input標簽里的value值一直為空后臺acceptfile.php代碼如下:<?php if(!isset($_REQUEST[filename])){exit(No file);}else{$upload_path dirname(__FILE__)./audio;date_defaul…

php 零寬斷言,正則表達式之零寬斷言實例詳解【基于PHP】

這篇文章主要介紹了正則表達式之零寬斷言,簡單介紹了零寬斷言的概念、分類及php實現技巧與相關注意事項,需要的朋友可以參考下本文實例講述了正則表達式之零寬斷言。分享給大家供大家參考&#xff0c;具體如下&#xff1a;前言之前我曾寫了一篇關于正則表達式的文章(//www.jb51…

python 邏輯回歸準確率是1,Python利用邏輯回歸模型解決MNIST手寫數字識別問題詳解...

本文實例講述了Python利用邏輯回歸模型解決MNIST手寫數字識別問題。分享給大家供大家參考&#xff0c;具體如下&#xff1a;1、MNIST手寫識別問題MNIST手寫數字識別問題&#xff1a;輸入黑白的手寫阿拉伯數字&#xff0c;通過機器學習判斷輸入的是幾。可以通過TensorFLow下載MN…

php面試題接口方面,php面試題6 - osc_xb4v1nhl的個人空間 - OSCHINA - 中文開源技術交流社區...

php面試題6一、總結二、php面試題6寫出你認為語言中的高級函數:1)preg_replace()2)preg_match()3) ignore_user_abort()4) debug_backtrace()5) date_default_timezone_set(“PRC”)6) get_class_methods() 得到類的方法名的數組7) preg_split() 字符串分割成數組8)json_encode…

軌道車輛垂向振動Matlab建模與仿真,基于matlab/simulink的車輛建模與故障分析

隨著鐵路行業高速發展,列車運行速度逐漸提高,鐵路安全越來越受到人們的重視,如何保證鐵道車輛運行安全及其故障監測成為一個亟待解決的重大課題。客車車輛在結構上的故障主要有一系彈簧斷裂、減振器失效、空氣彈簧漏氣、高圓彈簧斷裂、車輪踏面擦傷、軸承故障以及蛇形減震器故障…

關于php的問題有哪些,關于PHP的報錯問題?

關于這個報錯的表格我不知到怎么去做&#xff0c;下面的是代碼&#xff1a;header(content-type:text/html;charsetutf-8);session_start();include_once ../include/conf.php;include_once ../include/func.php;include_once ../include/mysql.func.php;check_login();$pageSi…

oracle消耗內存的查詢,在AIX中計算ORACLE消耗的私有內存總數

一早就收到兄弟伙發的QQ信息&#xff0c;關于aix中oracle內存計算的內容The RSS number is equal to the sum of the number of working-segment pages in memory times 4 andthe code-segment pages in memory times 4.The TRS number is equal to just the code-segment page…

php讀取ds18b20,DS18B20_單總線協議

.H文件#ifndef _ONEWIRE_H#define _ONEWIRE_H#include "STC15F2K60S2.H"#include #define OW_SKIP_ROM 0xcc#define DS18B20_CONVERT 0x44#define DS18B20_READ 0xbe//IC引腳定義sbit DQ P1^4;//函數聲明extern void Delay_OneWire(unsigned int t);extern void Wri…

oracle官方文檔查看方法,oracle官方文檔_查看初始化參數(舉例)

深藍的blog&#xff1a;http://blog.csdn.net/huangyanlong/article/details/46864217記錄了一下&#xff0c;使用oracle11g聯機文檔&#xff0c;查看初始化參數的步驟。如果想查看&#xff0c;可以修改的初始化參數的概念信息&#xff0c;可以點擊“ChangingParameter Values …

matlab usewhitebg,Matlab的:geo??show的網格和框架

對於問題1和問題2&#xff0c;原因是軸總是在圖的後面。因此&#xff0c;一種解決方案是在當前的軸上添加新軸並顯示網格&#xff0c;框和自定義刻度。對於問題3&#xff0c;我使用regexprep以取代S後綴負緯度(同上爲經度)。我唯一的問題是經度0將是0E&#xff0c;緯度0,0N。這…

oracle p l,使用P.A.L制作便攜軟件 (一) 基本原理 | 么么噠擁有者

因愛好自學所得&#xff0c;并非專業&#xff0c;此處只是拋磚引玉&#xff0c;歡迎相互交流、學習、提高&#xff0c;辛苦碼字不易&#xff0c;如轉載望保留鏈接出處。簡單介紹&#xff1a;P.A.L是PortableApps.com Launcher的簡稱&#xff0c;它是PortableApps.com開發的便攜…

oracle form執行后左上角沒出現oracle標記,oracle form學習筆記

新增form步驟打開模板TEMPLATE&#xff0c;將其改成自己所要的名稱&#xff0c;刪除Data Blacks中的BLOCKNAME,DETAILBLOCK,刪除Canvases中的BLOCKNAME,刪除Windows中的BLOCKNAME,新增自己的Windows&#xff0c;Canvases&#xff0c;DateBlacks&#xff0c;在form級別的PRE-FOR…

linux 建oracle分區表,Oracle 10g 11g分區表創建舉例

1.3. 創建其他類型分區表1.3.1. 用多列分區鍵創建范圍分區表SQL> create table aning_mutilcol_range2 (aning_id number,3 aning_name varchar2(100),4 aning_year number,5 aning_month number,6 aning_day number,7 aning_amount number8 )9 partition by range (aning_y…

php carbon 連續日期,日期及時間處理包 Carbon 在 Laravel 中的簡單使用

在編寫 PHP 應用時經常需要處理日期和時間&#xff0c;這篇文章帶你了解一下 Carbon – 繼承自 PHP DateTime 類的 API 擴展&#xff0c;它使得處理日期和時間更加簡單。Laravel 中默認使用的時間處理類就是 Carbon。namespace Carbon;class Carbon extends \DateTime{// code …