在前端開發中,在使用webpack
等構建工具開發中咱們常常使用import * from
或者是require
來引入咱們須要的模塊,那麼下面來聊聊前端模塊化幾種規範。html
在早期咱們寫js代碼一般是這樣子:前端
var a=1; var b=1; function a(){ } function b(){ }
這樣子會形成命名衝突和全局污染。
同時當咱們在同一個頁面請求過多的js文件時會形成頁面阻塞和http請求過多。node
因爲上面的種種缺點,這時候模塊化顯得很是重要,前期的模塊化經過閉包來達到變量私有化和模塊化。jquery
var module=(function(){ var a = 1; var b = function(){ } return { b:b } })()
可是這樣子仍是不能解決加載問題。 這時js模塊加載器誕生了,並逐漸造成幾種模塊化規範。webpack
CommonJS
規範是在node的模塊系統基礎上提出來的,也就是CommonJS
在服務器中使用,不能在瀏覽器環境中使用。git
CommonJS
規範規定,每一個模塊內部,module
變量表明當前模塊(一個js文件就是一個模塊)。這個變量是一個對象,它的exports
屬性(即module.exports
)是對外的接口。加載某個模塊,實際上是加載該模塊的module.exports
屬性。github
var a = 1; var b = function (){ } module.exports.a = a; module.exports.b = b;
上面代碼經過module.exports
輸出變量a
和函數b
。web
require方法引入瀏覽器
var main = require('./main') main.a main.b
其實這些代碼在咱們使用webpack配置的時候常常用到,webpack是運行在node環境中的,他使用的是CommonJS規範。緩存
上面說了CommonJS的執行是同步進行的,並且瀏覽器環境中沒有CommonJS模塊中的必要的字段,因此他不適合瀏覽器環境,這時候requirejs
應勢而生,它的誕生逐漸造成了ADM
規範。
ADM規範中規定全部模塊和依懶項異步加載,這樣子js文件就不是一次性引入了。
咱們說ADM
規範主要使用requirejs
。
//a.js define([jquery.js],function($){ var aa = 1 return{ a:aa } }) //b.js define([jquery.js],function($){ var bb = 2; return { b:bb } })
上面文件a.js
和b.js
經過define
方法定義各自的模塊。
經過require
方法引入:
require([a.js,b.js],function(a,b){ console.log(a.aa) //1 console.log(b.bb)//2 })
在seajs
出現後又造成了CDM
規範,CDM規範和ADM相似,都是爲了適應瀏覽器,可是CDM推崇就近依賴,ADM推崇依賴前置。
define(function(require,exports,module){ var $ = require(jquery.js) exports.sayHello = function() { $('#hello').toggle('slow'); }; })
CDM規範中模塊代碼書寫和CommonJS類似,其實ADM規範中也能夠這樣子引用模塊。具體能夠看seajs使用文檔和requirejs使用文檔
CDM規範和ADM規範是相似的,都是異步按需引入。
可是他們執行的時機不一樣。
CDM是加載模塊後馬上執行,也就是提早執行,
而ADM是加載模塊後遇到require方法才執行模塊,也就是延遲執行,能夠參考這篇文章中的幾個列子。
在前面幾個模塊化規範發展中,逐漸造成了ES6規範,也是咱們在項目中用的最多的了,也是咱們最熟悉的模塊化規範了,這裏就不展開說了。
參考:
https://blog.csdn.net/weixin_40969472/article/details/78646003
http://www.360doc.com/content/19/0519/15/13328254_836725029.shtml
http://www.ruanyifeng.com/blog/2015/05/commonjs-in-browser.html