ContailJSJavaScript 模塊加載器
ContainJS 是什么?
ContainJS 是一個(gè)基于 Commonjs 模塊管理規(guī)范的瀏覽器端的 JavaScript 模塊加載器(目前為非標(biāo)準(zhǔn)的,代碼會(huì)持續(xù)迭代,現(xiàn)階段主要提供思路,想集結(jié)各路 js 大神一同完善)
使用
獲取 Containjs
下載頁(yè)面下載文件。
目錄結(jié)構(gòu)
Containjs 目前的目錄結(jié)構(gòu)非常簡(jiǎn)單,項(xiàng)目中 JavaScript 都放在一個(gè) "js" 目錄。 例如, 你的項(xiàng)目中有一個(gè) index.html 頁(yè)面和一些 js 文件
├─index.html 項(xiàng)目html所在目錄為主目錄 ├─js/ 項(xiàng)目js目錄 ├─├─lib/ 項(xiàng)目類(lèi)庫(kù)目錄 // 非必須 ├─├─└─contain.js contain.js框架文件 // 也可以放在其他目錄,只需引入即可 ├─├─a.js ├─├─b.js ├─└─app.js 項(xiàng)目的入口文件
開(kāi)始使用
在你的應(yīng)用中包含 Contain.js 文件,并且使用服務(wù)器環(huán)境打開(kāi)(本地服務(wù)器即可)
// index.html <script src="js/lib/Contain.js"></script>
然后在 js/app.js 入口文件中開(kāi)始編寫(xiě)你的應(yīng)用代碼
Ps:需要注意的是,js/app.js 為默認(rèn)入口文件,暫時(shí)未支持修改
Containjs 模塊使用教程,像寫(xiě) node 一樣寫(xiě)瀏覽器端代碼即可
Ps:如果您已經(jīng)對(duì)于,Commonjs 規(guī)范有所了解,則不需要看此教程
模塊依賴(lài)
Containjs 的模塊依賴(lài)非常簡(jiǎn)單,使用 require(url) 函數(shù)直接引入即可
var a = require('a.js')
Ps:需要注意的是,在 Containjs 中,url 需要純靜態(tài)的字符串,不支持使用表達(dá)式或者變量
模塊定義
Containjs 的模塊定義非常簡(jiǎn)單,滿(mǎn)足 commonjs 模仿,以一個(gè)文件一個(gè)模塊的形式,暴露接口的方式也符合 commonjs 規(guī)定
//a.js
var name = 'a.js'
var getName = function() {
console.log(name)
}
// 使用模塊中的全局變量 exports 提供對(duì)外接口
exports.getName = getName
// 或者也可以這樣
module.exports.getName = getName
使用 Containjs 常見(jiàn)問(wèn)題解答
為什么 index.html 頁(yè)面必須使用服務(wù)器環(huán)境打開(kāi),例如:127.0.0.1/index.html 打開(kāi)
答:原因是 containjs 所以的文件均有 ajax 異步加載
為什么 require(url) 中的 url 不可以是變量或者表達(dá)式。只能是單純字符串
答:原因是 Containjs 模塊中所依賴(lài)文件均是使用異步提前加載,同步 require 時(shí)調(diào)用執(zhí)行,而異步提前加載的原理是,使用正則表達(dá)式去匹配出需要調(diào)用的模塊的,如果使用表達(dá)式則會(huì)導(dǎo)致無(wú)法正確匹配結(jié)果導(dǎo)致程序錯(cuò)誤 Ps:需要注意的是,在目前的版本中,請(qǐng)不要在注釋中出現(xiàn),require(url),因?yàn)檫@樣也會(huì)對(duì)此模塊進(jìn)行加載,如果本模塊這本應(yīng)用中不需要使用則會(huì)導(dǎo)致,浪費(fèi)的加載
如果我在本應(yīng)用中多次 require 某個(gè)模塊會(huì)不會(huì)導(dǎo)致請(qǐng)求數(shù)太多?
答:在 containjs 中,任何模塊,只要路徑相同只會(huì)進(jìn)行加載一次,加載完成后進(jìn)行執(zhí)行上下文的生產(chǎn)(context 但是不會(huì)執(zhí)行),然后存在模塊的 module.context 中
且在 containjs 中,require 在多次調(diào)用過(guò)某一模塊過(guò)程中,只會(huì)進(jìn)行一次生產(chǎn)模塊接口,之后會(huì)緩存在 moudule.exports 中,與 node 中不同的是,node 直接返回 module.exports 的引用,而 containjs 則是使用 module.exports 的繼承的引用,且每一次調(diào)用生產(chǎn)一個(gè)新的繼承對(duì)象,這樣帶來(lái)的好處是,一個(gè)應(yīng)用中只會(huì)生產(chǎn)一次本模塊的接口,也不必?fù)?dān)心被別處修改接口內(nèi)容
