本次改進是沿着上次的思路,讓定義模塊名盡量的短,然后只要保證請求時路徑正確,那么它就會內部非常智能修正這個模塊的名字,自動加上路徑。至於這些模塊叫什么名字,有什么屬性,可以查看框架的系統屬性@modules。盡管v14做得的改進非常人性化,但畢竟初次試水,還有許多不足與BUGs。v15就是在這方面進行了改良,原先模塊名的修正邏輯是寫define方法中,現在轉移到一個叫innerDefine的方法中,並讓其在臨時生成的iframe沙箱環境中執行,確保沒有改錯。另外,v15,還對許多內部函數與私有屬性進行更名,讓其更加秀氣易懂。下面是改進詳情:
- 用於保存需要處理的模塊名列表的內部數組 names 改名為 tokens(令牌集)。
- 相對應,原來叫name或_name的變量與屬性名也改名為 token(令牌)。
- 用於收集各個模塊的返回值的內部對象 rets 改名為 transfer(中轉器)。
- 用於保存每個模塊的信息的對象map 更名 mapper。
- 用於轉換iframe執行環境中生成的函數的內部函數 safeEval 改名為assemble(裝配)。assemble比原來的safeEval 職責更加單一,收集依賴列表對應模塊的返回值,傳入目標模塊中執行。
- 添加innerDefine 方法,它用於處理iframe沙箱環境中通過script節點加載回來的$.define,它也相當於一個中轉器,但會將其第一個參數(模塊名)修正一下,加上相對路徑,並且將callback重新解析為父窗口的函數實例(這相當於原來safeEval的工作),最后才交給父窗口的命名空間對象的define方法去處理。
- 用於創建沙箱環境加載子模塊的內部方法 loadModule 更名為 load, 並且在其內部字符串拼接部分進行大重構。
- 用於判定某一模塊的依賴列表是否都加載成功的內部函數_resolveCallbacks,更名為_checkDeps。
- 另外,_checkFail方法也做了些許改良,確保命名空間改名后報“找不到對象”錯誤。
v15借助於innerDefine來校正模塊名的思路,其實已經很好地解決了業界AMD的匿名模塊難題。但mass Framework作為一個大規模開發的框架,還要考慮一下JS文件合並的情況。因此$.define的第一個參數——模塊名還是保留下來。這也有出於向前兼容的考慮。
最后舉個例子說明v14與v15做了什么魔術吧。在KISSY中定義一個位於另一個文件夾的JS模塊,需要指定路徑,來防止重名。如aaa文件夾下有個test模塊,bbb文件夾下也有一個test模塊。定義時是這樣進行區分的:
KISSY.add('aaa/test', function () { //....aaa/test略 }); KISSY.add('bbb/test', function () { //....bbb/test略 }); KISSY.use('aaa/test', function () { //....略 }); KISSY.use('bbb/test', function () { //....略 });
而從mass Framework的v14開始,則可以省略路徑,如果不考慮服務器合並JS文件的情況,模塊名叫什么也沒所謂,因為請求模塊時的路徑就會被innerDefine改為其“正確”的模塊名!它這種特性非常有利於我們在項目對目錄結構的重構。
$.define('test', function () { //....aaa/test略 }); $.define('test', function () { //....bbb/test略 }); $.require("aaa/test",function(){ //....略 }); $.require("bbb/test",function(){ //....略 });
相關鏈接: