自定義require函數(shù)讓瀏覽器按需加載Js文件
前言
本文介紹的是自定義require函數(shù)讓瀏覽器實(shí)現(xiàn)按需加載Js文件,那到底要怎么自己寫一個(gè)按需加載的庫(kù)呢
為了實(shí)現(xiàn)按需加載:
//這是我們要實(shí)現(xiàn)的功能,require('str.js')時(shí)加載str.js文件,并創(chuàng)建一個(gè)叫str對(duì)象,等加載完畢之后執(zhí)行str對(duì)象的ready方法里的函數(shù)。
var str = require('str.js');
str.ready(show);
//要執(zhí)行的函數(shù)
function show(res){
console.log(res);
}
//str.js 文件,提供"我是str"字符串
//require.js 這個(gè)是我們要寫的庫(kù)
實(shí)現(xiàn)思路
1、如何加載str.js文件呢?
A:我們可以插入一個(gè)<script src="str.js"></script> ,這樣不僅加載了str.js,里面的代碼還可以被瀏覽器自動(dòng)運(yùn)行呢。
2、如何判斷str.js文件已經(jīng)加載完畢?
A:可以在str.js文件里執(zhí)行一個(gè)函數(shù),通知大家,我已經(jīng)加載完了。
3、require('str.js')返回一個(gè)對(duì)象,這個(gè)對(duì)象要怎么和str.js相關(guān)聯(lián)呢?
A:我們可以創(chuàng)建一個(gè)叫JS['str.js']的對(duì)象,使str指向這個(gè)對(duì)象就行了。
4、我不想把代碼都寫進(jìn)一個(gè)ready里面,我要寫在很多個(gè)ready里面,加載完之后它們都能執(zhí)行嗎?
A:不管多少個(gè)ready,沒(méi)加載完的時(shí)候,都會(huì)丟進(jìn)一個(gè)隊(duì)列里面先保存著,所以我們需要一個(gè)隊(duì)列。
5、加載完的那個(gè)時(shí)刻觸發(fā)ready,那加載完之后我再寫的ready函數(shù),就不執(zhí)行嗎?
A:也會(huì)執(zhí)行,所以,在加載完的那個(gè)時(shí)刻,我們將重寫ready函數(shù)。
6、這么多東西20行代碼能完成嗎?
A:....
執(zhí)行方案
根據(jù)上訴思路,寫了一個(gè)require.js文件:
function require(path){
//比如我們r(jià)equire('js/str.js') , 我們需要獲取'str.js'這個(gè)文件名
var filename = path.split('/');
filename = filename[filename.length-1];
JS[filename]={
fn:[/*這個(gè)就是(4)中提到的那個(gè)隊(duì)列*/],
//這是(2)中提到的方法,str.js文件里面執(zhí)行這個(gè)方法就代表它加載完了
ready:function(){
JS[filename].fn.forEach(function(fn){
//JS['str.js'].export就是str.js要提供的東西:'我是str'
fn(JS[filename].export);
});
//這是(5)中提到的,ready函數(shù)的重寫
JS[filename].rt.ready = function(fn){
fn(JS[filename].export);
};
},
rt:{
ready:function(fn){JS[filename].fn.push(fn)}//這個(gè)就是str對(duì)象的ready函數(shù)
}
};
//這是(1)中提到的插入script標(biāo)簽
var script = document.createElement('script');
script.src = path;
document.head.appendChild(script);
//這是(3)中要返回的對(duì)象
return JS[filename].rt;
}
接下來(lái),就差str.js的寫法了:
/* 這里你想寫什么代碼都行,推薦寫在閉包里,以免污染全局變量 */ JS['str.js'].export = '我是str';//這個(gè)是供大家使用的參數(shù) JS['str.js'].ready();//執(zhí)行這個(gè)函數(shù),通知大家,str.js加載完畢了
確認(rèn)一下執(zhí)行結(jié)果
<!DOCTYPE html>
<script src="require.js"></script>
<script>
var str = require('str/str.js');
str.ready(show);
setTimeout(function(){
str.ready(show);
},3000);
//要執(zhí)行的函數(shù)
function show(res){
console.log(res);
}
</script>
ok,一切正常。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。
- javascript自定義日期比較函數(shù)用法示例
- JS中創(chuàng)建自定義類型的常用模式總結(jié)【工廠模式,構(gòu)造函數(shù)模式,原型模式,動(dòng)態(tài)原型模式等】
- AngularJs1.x自定義指令獨(dú)立作用域的函數(shù)傳入?yún)?shù)方法
- JS自定義函數(shù)實(shí)現(xiàn)時(shí)間戳轉(zhuǎn)換成date的方法示例
- JavaWeb開(kāi)發(fā)之JSTL標(biāo)簽庫(kù)的使用、 自定義EL函數(shù)、自定義標(biāo)簽(帶屬性的、帶標(biāo)簽體的)
- js document.getElementsByClassName的使用介紹與自定義函數(shù)
- 常用原生js自定義函數(shù)總結(jié)
- JS自定義函數(shù)對(duì)web前端上傳的文件進(jìn)行類型大小判斷
- PHP自定義函數(shù)格式化json數(shù)據(jù)示例
- 詳解JavaScript自定義函數(shù)
相關(guān)文章
js實(shí)現(xiàn)簡(jiǎn)單的可切換選項(xiàng)卡效果
這篇文章主要介紹了js實(shí)現(xiàn)簡(jiǎn)單的可切換選項(xiàng)卡效果的方法,涉及javascript操作css樣式實(shí)現(xiàn)切換選項(xiàng)卡的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
Three.js開(kāi)發(fā)實(shí)現(xiàn)3D地圖的實(shí)踐過(guò)程總結(jié)
這篇文章主要給大家介紹了關(guān)于利用Three.js開(kāi)發(fā)實(shí)現(xiàn)3D地圖的實(shí)踐過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用three.js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11
javascript中typeof操作符和constucor屬性檢測(cè)
這篇文章主要介紹了javascript中typeof操作符和constucor屬性檢測(cè)的相關(guān)資料,需要的朋友可以參考下2015-02-02
js獲取RadioButtonList的Value/Text及選中值等信息實(shí)現(xiàn)代碼
RadioButtonList的Value,Text及選中值等信息想必有很多的朋友都想獲取到,接下來(lái)將為你介紹下如何使用js獲取,代碼很詳細(xì),感興趣的你可以參考下,或許對(duì)你有所幫助2013-03-03
最簡(jiǎn)單的JavaScript圖片輪播代碼(兩種方法)
基于javascript代碼實(shí)現(xiàn)最簡(jiǎn)單的圖片輪播效果,非常簡(jiǎn)單,本文通過(guò)兩種方式給大家介紹最簡(jiǎn)單的圖片輪播,感興趣的朋友一起學(xué)習(xí)吧2015-12-12
一個(gè)簡(jiǎn)單的JavaScript數(shù)據(jù)緩存系統(tǒng)實(shí)現(xiàn)代碼
數(shù)據(jù)緩存系統(tǒng),主要是將一些可復(fù)用的數(shù)據(jù)臨時(shí)存放一下,放下數(shù)據(jù)后面的再次調(diào)用。2010-10-10
jquery form表單獲取內(nèi)容以及綁定數(shù)據(jù)
這篇文章主要介紹了jquery form表單獲取內(nèi)容以及form表單綁定數(shù)據(jù),獲取表單的數(shù)據(jù)保存到數(shù)據(jù)庫(kù),或者將數(shù)據(jù)綁定到form表單,感興趣的小伙伴們可以參考一下2016-02-02

