摘要:簡易模塊加載器示例點來了接下來我們先來看一段建議模塊加載器的示例代碼以上是加載器的實現,再來看看如何使用吧你好啊要去杭州玩了章煒今天天氣不錯噢在以上代碼中,我們定義了三個模塊,分別名為。
前端模塊化
關注前端技術發(fā)展的各位親們,肯定對模塊化開發(fā)這個名詞不陌生。隨著前端工程越來越復雜,代碼越來越多,模塊化成了必不可免的趨勢。
各種標準由于javascript本身并沒有制定相關標準(當然es6已經有了import和export),所以在模塊化方面誕生了各種不同的規(guī)范。主要有AMD規(guī)范(隨requirejs誕生而普及),CMD規(guī)范(隨seajs的出現而普及),commonjs(主要用于node,并不適合前端)。至于以上幾種規(guī)范的異同,無恥的我在這里就不多費口水了,請還不了解的親們自行去找google爸爸。
簡易模塊加載器示例G點來了!
接下來我們先來看一段建議模塊加載器的示例代碼:
let Module = (() => { let module_list = {}; function define(name,rely,callback){ if (module_list[name]){ console.log("The module have already existed!") }else{ for(let i = 0;i < rely.length;i++){ rely[i] = module_list[rely[i]]; } module_list[name] = callback.apply(callback,rely); } } function require(name){ if (module_list[name]){ return module_list[name] }else{ console.log("There is no such module!") } } let api = { "define":define, "require":require }; return api; })();
以上是加載器的實現,再來看看如何使用吧:
Module.define("test",[],()=>{ function sayHello(name){ return name+",你好啊"; } return { "sayHello":sayHello } }) Module.define("haha",[],()=>{ function gotoHZ(name){ return name+"要去杭州玩了"; } return { "gotoHZ":gotoHZ } }) Module.define("my_module",["test","haha"],(test,haha)=>{ let name = "andrew"; function sayHello2() { let str = test.sayHello(name); console.log(haha.gotoHZ("章煒")) str = str + ",今天天氣不錯噢"; return str; } return { "sayHello2":sayHello2 } }) console.log(Module.require("my_module").sayHello2()) console.log(Module.require("test").sayHello("steve"))
在以上代碼中,我們定義了三個模塊,分別名為test,haha,my_module??吹竭@里的你,如果js基礎不好,可能是一臉懵逼,腦子繞暈...先不急,讓我們來看看運行的結果:
結果很簡單,打印了一些我們想要的信息。
代碼分析接下來我們詳細來解析一下代碼原理。
加載器中的幾個重點,
module_list
module_list是一個對象,用于存儲定義的模塊,以模塊名:callback這樣
的鍵值對的形式存儲;
define函數
然后我們定義了一個define函數,其三個參數分別為模塊名、此模塊依賴列表、此模塊回調函數,當我們調用define函數時,首先先去檢查module_list對
象中是否已經有同名模塊,如果有,直接告訴用戶該模塊名字已被使用,如果沒有,我們循環(huán)依賴列表rely,循環(huán)中的操作用于將依賴列表從名稱列表轉換為真正的模塊列表,然后利用apply函數,將其逐個傳入到定義好的callback函數中。
require函數
由于我們的module_list存在于內部作用域,保證了模塊的私密性,外部并不能
直接操作模塊列表去讀取模塊,因此我們定義了一個require函數,利用閉包來讀取操作相應模塊
實例解析
Module.define("my_module",["test","haha"],(test,haha)=>{ let name = "andrew"; function sayHello2() { let str = test.sayHello(name); console.log(haha.gotoHZ("章煒")) str = str + ",今天天氣不錯噢"; return str; } return { "sayHello2":sayHello2 } })
這里我們定義了my_module模塊,它依賴的模塊有test、haha兩個模塊,而在回調函數中,我們將這兩個模塊傳入,可以看到我們能調用test模塊的sayHello方法,可以調用haha模塊的gotoHZ方法,至此,一個簡單的模塊加載器就實現了。
結語這個簡單的模塊加載器只是很簡化的介紹了模塊加載器實現的基本原理,成熟的模塊加載器當然是要復雜得多,但是原理了解了,才是最重要,不是嘛~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/81702.html
摘要:簡要說明長處在于使用模塊規(guī)范,而不是使用的模塊規(guī)范,以及使用的模塊規(guī)范。簡單使用關于命令行工具使用,請參照官方文檔。相同模塊重復依賴模塊重復依賴很容易理解,模塊實現時可能分割為多個子文件實現,每個子文件內部可能會引用同一個模塊,如。 簡介 browerify: http://browserify.org/index.html browserify可以看做瀏覽器端的又一個模塊...
摘要:一個專注于瀏覽器端和兼容的包管理器。一個整合和的最佳思想,使開發(fā)者能快速方便地組織和編寫前端代碼的下一代包管理器。完全插件化的工具,能在中識別和記錄模式。健壯的優(yōu)雅且功能豐富的模板引擎。完整的經過充分測試和記錄數據結構的庫。 【導讀】:GitHub 上有一個 Awesome – XXX 系列的資源整理。awesome-javascript 是 sorrycc 發(fā)起維護的 JS 資源列表...
摘要:轉載來源包管理器管理著庫,并提供讀取和打包它們的工具。能構建更好應用的客戶端包管理器。一個整合和的最佳思想,使開發(fā)者能快速方便地組織和編寫前端代碼的下一代包管理器。很棒的組件集合。隱秘地使用和用戶數據。 轉載來源:https://github.com/jobbole/aw... 包管理器管理著 javascript 庫,并提供讀取和打包它們的工具。?npm – npm 是 javasc...
摘要:轉載來源包管理器管理著庫,并提供讀取和打包它們的工具。能構建更好應用的客戶端包管理器。一個整合和的最佳思想,使開發(fā)者能快速方便地組織和編寫前端代碼的下一代包管理器。很棒的組件集合。隱秘地使用和用戶數據。 轉載來源:https://github.com/jobbole/aw... 包管理器管理著 javascript 庫,并提供讀取和打包它們的工具。?npm – npm 是 javasc...
閱讀 2428·2021-11-23 09:51
閱讀 2457·2021-11-11 17:21
閱讀 3097·2021-09-04 16:45
閱讀 2380·2021-08-09 13:42
閱讀 2218·2019-08-29 18:39
閱讀 2879·2019-08-29 14:12
閱讀 1279·2019-08-29 13:49
閱讀 3363·2019-08-29 11:17