今天碰到一個題目:
如果你是一個熟悉模塊化打包工具的前端開發(fā)者。不考慮使用如require.js等這些已經(jīng)實現(xiàn)的工具。要求用原生的方法實現(xiàn),如何引入三個模塊,即三個js文件,比如a.js ,b.js和c.js。要求同時引入,然后在執(zhí)行相應(yīng)的回調(diào)函數(shù)。
思路:模塊化思想的核心
根據(jù)上面那位兄得的答案,順手寫了一下,可能不正確,never mind
就寫兩個子模塊吧,原理應(yīng)該是一樣的
main.js
var opt1 = {
type: 'GET',
url: './1.js',
headers: {
"Content-Type": "text/plain"
},
dataType: "script"
}
var opt2 = {
type: 'GET',
url: './2.js',
headers: {
"Content-Type": "text/plain"
},
dataType: "script"
}
var pro1 = ajax(opt1)
var pro2 = ajax(opt2)
Promise.all([pro1, pro2]).then(function(result) {
for(var i = 0, len = result.length; i < len; i ++) {
eval(result[i])
}
this.mod1 = mod1
})
function ajax(options) {
options = options || {};
options.type = (options.type || "GET").toUpperCase();
options.async = (options.async == false) ? false : true;
options.dataType = options.dataType || "json";
//form-data上傳文件可以用{}覆蓋默認設(shè)置
options.headers = options.headers || { "Content-Type": "application/json" };
var xhr = _createXHR();
var isPost = options.type == 'POST';
return new Promise(function (resolve, reject) {
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
resolve((options.dataType == 'json') ? JSON.parse(xhr.responseText) : xhr.responseText);
}
else {
reject(xhr.status);
}
}
}
xhr.open(options.type.toUpperCase(), isPost ? options.url : encodeURI(options.url), options.async);
for (var key in options.headers) {
xhr.setRequestHeader(key, options.headers[key]);
}
xhr.send(isPost ? options.data : null);
});
function _createXHR() {
if (window.XMLHttpRequest) {
return new XMLHttpRequest();
}
else if (window.ActiveXObject) {
return new ActiveXObject('Microsoft.XMLHTTP');
}
else {
alert('Your browser does not support Ajax');
}
}
}
1.js
var mod1 = {
say: function (it) {
console.log(it)
}
}
2.js
var mod2 = {
bark: function () {
alert('wong wong')
}
}
然后放在瀏覽器里面執(zhí)行:
暫時只想到把模塊里的對象放到window上面變?nèi)肿兞窟@個方法
至于你說的會向服務(wù)器發(fā)請求,我覺得一般主模塊和子模塊都是放在同個服務(wù)器上面的,就算主模塊要發(fā)起請求加載子模塊,也是相當于服務(wù)器本地加載js文件而已,沒什么大問題
僅供參考。
剛看了看Promise.all是按順序同步發(fā)出請求,在這里說明一下免得誤導(dǎo),不過都是異步操作,按順序發(fā)出請求也不會相互阻塞
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團,成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達內(nèi)教育集團成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負責(zé)iOS教學(xué)及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。