javascript 構建模塊化開發(fā)過程解析
在使用 sea.js 、require.js 、 angular 的時候。
我們使用到 define 、 module(require) 的方式,定義模塊,和依賴模塊
下面給出 define 和 module 的簡單實現(xiàn)。 其本質,就是往一個對象上面添加方法
var F = {};
F.define = function(str,fn){
var parts = str.split(".");
var parent = this; // parent 當前模塊的父模塊
var i = len = 0;
//如果第一個模塊是模塊單體對象,則移除
if(parts[0] == "F"){
parts = parts.slice(1);
}
//屏蔽對 define module 模塊方法重寫
if(parts[0] == "define" || parts[0] == "module"){
return ;
}
for(len = parts.length; i < len-1; i++){
//如果父模塊中不存在當前模塊
if(typeof parent[parts[i]] === 'undefined'){
//聲明當前模塊
parent[parts[i]] = {};
}
//緩存下一層父模塊
parent = parent[parts[i]];
}
if(fn && parts[i]){
//如果給定模塊方法,則綁定該模塊的方法,
parent[parts[i]] = fn();
}
return this;
}
F.module = function(){
var args = [].slice.call(arguments);//復制參數(shù)
var fn = args.pop(); //獲取回調
var parts = args[0] && args[0] instanceof Array ? args[0] : args;
//模塊的依賴
var modules = [];
//模塊的路由
var modIDs = "";
//依賴模塊的索引
var i = 0;
var len = parts.length; // 依賴模塊的長度
var parent,j,jlen; //父級模塊,模塊路由層級索引,模塊路由層級長度
while(i < len){
if(typeof parts[i] == "string"){
parent = this;
//解析路由,并且屏蔽掉 F
modIDs = parts[i].replace(/^F\./,"").split(".");
//遍歷模塊層級
for( j = 0,jlen = modIDs.length; j < jlen; j++){
//迭代 父模塊
parent = parent[modIDs[j]] || false;
}
modules.push(parent); //將模塊添加到依賴列表
}else{
//直接將模塊添加到依賴列表
modules.push(parts[i]);
}
//取下一個模塊
i++;
}
//執(zhí)行回調,將依賴的模塊注入
fn.apply(null,modules);
}
//定義 string 模塊
F.define("string",function(){
return {
trim(str){
return str.replace(/^s+|\s+$/g,"");
}
}
});
//定義 string 模塊,的子模塊 sub
F.define("string.sub",function(){
return {
low(str){
return str.toLowerCase();
}
}
});
console.log(F);
//使用模塊
F.module(["string","string.sub",document],function(str,strSub,doc){
console.log(str,strSub,doc)
});
當然了,這里使用的,F(xiàn) 對象,實際應用中,應該寫在閉包里面。不能讓外界直接訪問,于是有如下代碼。
var Sea = (function(){
var F = {};
F.define = function(str,fn){
var parts = str.split(".");
var parent = this; // parent 當前模塊的父模塊
var i = len = 0;
//如果第一個模塊是模塊單體對象,則移除
if(parts[0] == "F"){
parts = parts.slice(1);
}
//屏蔽對 define module 模塊方法重寫
if(parts[0] == "define" || parts[0] == "module"){
return ;
}
for(len = parts.length; i < len-1; i++){
//如果父模塊中不存在當前模塊
if(typeof parent[parts[i]] === 'undefined'){
//聲明當前模塊
parent[parts[i]] = {};
}
//緩存下一層父模塊
parent = parent[parts[i]];
}
if(fn && parts[i]){
//如果給定模塊方法,則綁定該模塊的方法,
parent[parts[i]] = fn();
}
return this;
}
F.module = function(){
var args = [].slice.call(arguments);//復制參數(shù)
var fn = args.pop(); //獲取回調
var parts = args[0] && args[0] instanceof Array ? args[0] : args;
//模塊的依賴
var modules = [];
//模塊的路由
var modIDs = "";
//依賴模塊的索引
var i = 0;
var len = parts.length; // 依賴模塊的長度
var parent,j,jlen; //父級模塊,模塊路由層級索引,模塊路由層級長度
while(i < len){
if(typeof parts[i] == "string"){
parent = this;
//解析路由,并且屏蔽掉 F
modIDs = parts[i].replace(/^F\./,"").split(".");
//遍歷模塊層級
for( j = 0,jlen = modIDs.length; j < jlen; j++){
//迭代 父模塊
parent = parent[modIDs[j]] || false;
}
modules.push(parent); //將模塊添加到依賴列表
}else{
//直接將模塊添加到依賴列表
modules.push(parts[i]);
}
//取下一個模塊
i++;
}
//執(zhí)行回調,將依賴的模塊注入
fn.apply(null,modules);
}
return {
define:function(){
F.define.apply(F,arguments);
},
module:function(){
F.module.apply(F,arguments);
}
}
})();
//定義 string 模塊
Sea.define("string",function(){
return {
trim(str){
return str.replace(/^s+|\s+$/g,"");
}
}
});
//定義 string 模塊,的子模塊 sub
Sea.define("string.sub",function(){
return {
low(str){
return str.toLowerCase();
}
}
});
console.log(Sea);
//使用模塊
Sea.module(["string","string.sub",document],function(str,strSub,doc){
console.log(str,strSub,doc)
});
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
使用JS前端技術實現(xiàn)靜態(tài)圖片局部流動效果
本文使用前端開發(fā)技術,結合?SVG?和?CSS?來實現(xiàn)類似的液化流動效果,包含的知識點主要包括:mask-image?遮罩、feTurbulence?和?feDisplacementMap?濾鏡、filter?屬性、canvas?繪制方法、TimelineMax?動畫及input[type=file]?本地圖片資源加載,需要的朋友可以參考下2022-08-08
JS 截取字符串substr 和 substring方法的區(qū)別
JS 截取字符串substr 和 substring方法的區(qū)別,需要的朋友可以參考下,根據需要自行選擇。2009-10-10
html+css+js實現(xiàn)簡易版ChatGPT聊天機器人
OpenAI的一款聊天機器人模型ChatGPT爆火,本篇文章用一百行html+css+js代碼給大家制作一款簡易的聊天機器人。2023-02-02
字節(jié)跳動面試之如何用JS實現(xiàn)Ajax并發(fā)請求控制
這篇文章主要給大家介紹了關于字節(jié)跳動面試之如何用JS實現(xiàn)Ajax并發(fā)請求控制的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-05-05
淺談javascript中的instanceof和typeof
這篇文章主要簡單介紹了javascript中的instanceof和typeof的相關資料,需要的朋友可以參考下2015-02-02
微信小程序事件對象中e.target和e.currentTarget的區(qū)別詳解
這篇文章主要介紹了微信小程序事件對象中e.target和e.currentTarget的區(qū)別詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05

