摘要:能達到一個積木塊模塊的要求。接下來我們將改進它。結尾到此,我們自己構建了一個很實用的模塊化工具,項目的源碼在這里,喜歡的話,給個。
前言
希望編寫程序能像玩積木一樣,首先規劃要產出怎樣的作品,然后在積木堆中挑選合適的積木塊,最后一組合就完工了。
于是JavaScript需要類似這樣模塊化,每個模塊都隱藏內部細節并且對外暴露接口,再處理好模塊之間的依賴關系,就可以達到玩積木的效果了。
雖然現有很多模塊化框架/工具,但對于新手來說,為什么不自己擼一個簡單的模塊化工具呢?
希望通過這個工具把自己覺得好用的代碼以模塊的方式組織起來,漸漸形成自己的JS庫,之后可以勇敢地和HR說,自己的小項目用的是自己小JS庫,^_^。我覺得,在這個封裝的過程中,新手能學習到很多東西。
新手嘛,多造輪子總是有好處的,=_=。
從閉包到模塊以下是《你所不知道的JavaScript(上卷)》中對于閉包的說明。
當函數可以記住并訪問所在的詞法作用域,即使函數是在當前詞法作用域之外執行,這時就產生了閉包。
其實,不管怎樣,閉包正如其字面意思一樣,既能提供一個相對封閉的空間,也能向外界暴露必要的接口。這不就正符合我們模塊化的需求嗎?
在此,建議參考這篇文章,以加強您對閉包的理解:《假如技術HR問您JavaScript的“閉包”,嘿嘿嘿,舉這個例子就夠了》。
最簡單的模塊var test = (function test(){ function run(){ console.log("run test"); } return { run: run }; })(); test.run();
上面的代碼有個叫test的函數作為模塊創建器,每次調用它都可以創建一個新的模塊。這里使用立即執行函數,立即創建了一個test模塊。參考閉包的概念,外部可以調用test模塊中的run函數,同時test模塊又有自己獨立的作用域。能達到一個積木塊(模塊)的要求。
簡單的模塊這樣寫沒有問題,但是模塊間的依賴問題沒有解決。
最簡單的模塊管理工具模塊之間必然會存在依賴關系,而模塊管理工具需要能夠很好地管理模塊間的依賴。下面我們模仿實現了AMD規范的工具requirejs,主要是模仿其define,get的API風格,自己寫一個簡單的版本。
//模塊管理工具,MyModules var MyModules = (function Manager() { var modules = {}; function define(name, deps, impl) { for (var i=0; i可以看出,利用MyModules可以很方便地定義使用模塊,管理模塊依賴。但是還存在一個問題,MyModules對于模塊定義的順序有要求。以上面的例子來說,就是app模塊依賴data模塊,那data模塊必須在app模塊之前被定義。這個限制讓我們實際使用中不是很方便。接下來我們將改進它。
改進模塊管理工具我們需要讓模塊管理工具不需要限制模塊的定義順序,這里我的做法是,使用一個rebuilds數組來保存未成功構建的模塊。每次有新模塊構建成功的時候就會重新嘗試去構建整個rebuilds數組中的模塊。具體看下面的代碼。
window.mm_modules = (function Manager() { var debug = false; var modules = {}; var rebuilds = []; function copyArray (array){ var tempArray = []; for(var i=0; i改進后的模塊管理工具,能夠自動地處理模塊依賴,而不需要限制定義順序了。
gulp輔助
那,能不能更進一步呢?試著想一下,我們日常會怎么使用?單文件單模塊,然后把這些文件放在不同文件夾里組織好。于是,我就想到使用gulp這樣的工具輔助我們。請參考下面的目錄結構。
├── dist │?? ├── index.html │?? └── js │?? └── mm-modules-build.js ├── gulpfile.js ├── mm-modules │?? ├── queryObject.js │?? ├── request.js │?? ├── template.js │?? ├── test.js │?? └── util.js ├── mm-modules.js可以在mm-modules下隨意地定義模塊,如util模塊內有各種工具函數,template模塊則包含了artTemplate模版引擎。之后利用gulp將mm-modules.js(模塊管理工具)與mm-modules下所有的模塊文件打包成mm-modules-build.js。項目中只要引入mm-modules-build.js即可。
結尾到此,我們自己構建了一個很實用的JavaScript模塊化工具,項目的源碼在這里:https://github.com/MIKUScallion/mm-modules,喜歡的話,給個?。
再回顧一下前言的話。
參考希望通過這個工具把自己覺得好用的代碼以模塊的方式組織起來,漸漸形成自己的JS庫,之后可以勇敢地和HR說,自己的小項目用的是自己小JS庫,^_^。我覺得,在這個封裝的過程中,新手能學習到很多東西。
新手嘛,多造輪子總是有好處的,=_=。
《你所不知道的JavaScript(上卷)》
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/79617.html
摘要:文檔翻譯系列一安裝原文地址原文本系列是針對文檔進行的翻譯,因為自己在學習的時候,最開始通過看博客或者論壇等中文資料,有些內容是零零散散的接收,并沒有給自己帶來很好的效果,所以后來決定把文檔的原文從頭到尾看一遍。 React文檔翻譯系列(一)安裝 原文地址:原文 本系列是針對React文檔進行的翻譯,因為自己在學習react的時候,最開始通過看博客或者論壇等中文資料,有些內容是零零散散的...
摘要:我已經把學習如何構建自動化跨瀏覽器的的單元測試列在我的年度清單中,但我每一次坐下來真正想要做的時候,我又退卻了。供應商支持許多主流的單元測試框架,包括,,和。 作者:Philip Walton譯者:Yeaseon原文鏈接:Learning How to Set Up Automated, Cross-browser JavaScript Unit Testing 譯文僅供個人學習,不用...
摘要:在當前階段,僅僅只是字節碼規范。如果都沒有將代碼編譯為字節碼的工具,要起步就很困難了。接下來要做的是使用將格式的代碼轉換為二進制碼。運行文件,最后就能得到瀏覽器需要的真正的二進制碼。 本文轉載自:眾成翻譯譯者:文藺鏈接:http://www.zcfy.cc/article/1031原文:http://cultureofdevelopment.com/blog/build-your-fi...
摘要:適用于,演示這是開發的一個簡單的可視化庫,它允許你創建所有常用的圖表類型條形圖,樹形圖,折線圖,面積圖等。可以輕松地對折線圖和條形圖進行混合和匹配以組合不同的數據集,這是非常棒的功能。 翻譯:瘋狂的技術宅原文:https://www.monterail.com/blo... 本文首發微信公眾號:jingchengyideng歡迎關注,每天都給你推送新鮮的前端技術文章 你的程序有多...
摘要:第一個主要的包管理器在被引用后不久就搭建起來了,并且迅速成為世界上最受歡迎的包管理器之一。簡介是一款新的包管理器,在取代客戶端和其他包管理器現有工作流的同時,又保留了對代理的兼容性。 在JavaScript社區,工程師們分享了成百上千的代碼段,我們不用自己從頭編寫基礎組件、類庫或者框架。反過來,每段代碼又或許依賴于其它的代碼段,而這些依賴就是通過 package managers(包管...
閱讀 1362·2021-11-15 11:45
閱讀 3127·2021-09-27 13:36
閱讀 2874·2019-08-30 15:54
閱讀 992·2019-08-29 12:38
閱讀 2910·2019-08-29 11:22
閱讀 2992·2019-08-26 13:52
閱讀 2037·2019-08-26 13:30
閱讀 590·2019-08-26 10:37