AMD和CMD出生的背景和它们解决的问题
這是一篇純故事沒有代碼的博客,畢竟ES6官方標準規定了模塊化,這兩位民間出生的規范就差點意思了,所以也不再詳細介紹它倆了。
我們知道CommonJS的工作原理是:當使用require(模塊路徑)導入一個模塊時,node會做以下兩件事(不考慮模塊緩存):
1)通過模塊路徑找到本機文件,并讀取文件內容
2)將文件中的代碼放入到一個函數環境中執行,并將執行后module.exports的值作為require函數的返回結果
正是這兩個步驟,使得CommonJS在node端可以良好的被支持。可以認為,CommonJS是同步完成的,必須要等到加載完文件并執行代碼后才能繼續向后執行
而當瀏覽器遇到CommonJS時,我們想要把CommonJS放到瀏覽器端時,就出現了一些需要解決的問題
1)瀏覽器要加載JS文件,需要從遠程服務器讀取,而網絡傳輸的效率遠遠低于node環境中讀取本地文件的效率。由于CommonJS是同步的,這會極大的降低運行能力
2)如果需要讀取JS文件內容并把它放入到一個環境中執行,需要瀏覽器廠商的支持,可是瀏覽器廠商不愿意提供支持,最大原因是CommonJS屬于社區標準,并非官方標準
基于以上兩點原因,瀏覽器無法支持模塊化,但是這并不代表模塊化不能在瀏覽器中實現。要在瀏覽器中實現模塊化,只要能解決上面兩個問題就行了,解決辦法很簡單:
1)需要遠程加載的JS采用異步處理,加載完成后執行回調函數,即可解決時間浪費的問題?
2)將編寫的模塊直接放到函數中,即可解決模塊代碼需要放置在函數中的問題
基于這種簡單有效的思路,出現了AMD和CMD規范,有效的解決了瀏覽器模塊化的問題
二.AMD
AMD(Asynchronous Module Definition),即異步模塊加載機制。在AMD中,導入和導出模塊代碼,都必須放置在define函數中。
require.js實現了AMD規范
三.CMD
CMD(Common Module Definition),公共模塊定義規范。在CMD中,導入和導出的代碼模塊,都必須放置在define函數中
sea.js實現了CMD規范。
總結
以上是生活随笔為你收集整理的AMD和CMD出生的背景和它们解决的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: set,存放不重复数据的集合类型
- 下一篇: 属性描述符