總體思路
1、 建立一個js服務,該服務實現通用js文件的加載、依賴、緩存、更新以及復用。
2、 各個項目如果使用通用js,可(bi)以(xu)使用js服務實現加載。
3、 Js服務只提供通用的js,比如jQuery、my97、easyUI等(可根據實際情況設定具體的js文件)。
4、 其他針對特點需求寫的js文件,需要自己寫代碼加載。Js服務可以提供加載用函數。(正在考慮要不要使用sea.js)
5、 Js服務加載的js文件,不需要做任何修改。當然也不負責各個文件里的函數名稱是否沖突。
Sea.js追求自然編程,代碼要寫的自然。很是巧合我也推崇自然編程,我寫的框架就叫做“自然框架”。只是在加載js這塊和sea.js的思路有點不同。
一個項目里需要的js文件可以分為三種:第三方通用js(比如jQuery、my97等);自己公司寫的通用js(比如我寫的NatureUI);自己對特定需求寫的特定js。
我覺得對於通用的js,就不需要每次用的時候都去寫一行代碼進行加載,太麻煩了。比如jQuery,加載(自動處理)之后我直接$就可以用了,沒必要在寫一行加載用的代碼。因為Js服務會把各種通用js文件一次性的加載到top頁面,然后利用“復用”的方式,讓其他頁面可以直接使用。也就是說在子頁里,不用去考慮jQuery有沒有加載,加載完成了沒,不用再令寫一行加載的js,直接用就好了。
就像我們寫C#代碼,新建一個項目的時候,VS會把常用的dll引用進來;新建一個頁面的時候,VS會把常用的命名空間using上,不需要我沒再去操心了。我覺得這種方式比較簡單,至於是否自然,那就是仁者見仁智者見智了。
加載流程
看圖
1、 在頁面里使用<script >引用boot.js。這個主要是一個引導程序,用他來加載其他的js。
2、 然后看看是否有緩存信息。
3、 如果有緩存信息,那么說明這是子頁。調用適配函數,讓子頁可以訪問top頁里加載的js文件。然后看看子頁里有沒有jsReady函數,如果有則調用。
4、 如果沒有緩存信息,說明這是top頁面,需要加載另一個js(bootLoad.js)。這個是真正干活的文件。這里放在配置信息和加載css、加載js的函數。然后開始各種加載。
基本流程就是這樣,如果你看了第一篇的預告,會感覺這個流程圖似乎不太一樣。確實不一樣,我又修改了一遍。感覺修改后流程更簡潔、思路也更清晰了。下面用FAQ的方式來進行說明。估計看了之后會有不少疑問。
FAQ
1、 為啥有一個boot.js后又有一個bootLoad.js?
原來只有一個的,分成兩個是為了讓boot.js盡可能的不需要修改。因為我無法保證boot.js是最新的。
2、 Top頁面是啥?
Top頁面就是最外面的頁面,top頁面里用iframe加載其他頁面,叫做子頁。
3、 子頁是啥?
在top頁面里用iframe加載的頁面。可以通過top.的方式來訪問top頁里的信息和函數。
4、 適配是啥意思?
在子頁里雖然可以訪問top頁里的函數,比如top.$。但是訪問的時候要加上top.這個就比較麻煩了。所謂的適配,就是讓程序員不用操心自己寫的js是運行在top頁里還是子頁里,統統$就可以了。
對於第三方插件需要做一些適配,目前已經搞定了jQuery和my97,easyUI還沒有搞定。
因為可能大家都沒有想過在子頁里使用top頁里的函數吧,所以寫插件的時候根本就沒考慮。比如my97,在top頁里彈出日期選擇的div,由於子頁和top有位置偏差,所以日期選擇也偏出去了,沒想到啥好辦法,只好改my97 的源碼了。
5、 不就是加載js嗎,弄這么復雜干嘛?
如果只有一兩個js文件要加載,確實不需要這么復雜。但是如果有十多個甚至幾十個js文件要加載呢?
如果自己要開發一套UI插件,那么在開發調試階段,要加載未合並的js,這樣便於調試和修改。開發的差不多了,在改成引用合並后的js文件。那么引用js的部分怎么處理呢?尤其是一邊開發UI,一邊開發項目的時候。
6、 怎么還有css的事?
Css也是要加載的,一般一個項目的各個頁面用的css都是一樣的。這里也順便一起加載了。
7、 配置信息里都有啥?
因為js服務在一個單獨的站點里面,那么這個站點的網址是啥呢?192.168.0.55還是Resource.naturefw.com ?這個地址就需要在配置信息里面說明,以便於引用。另外還有單點登錄的網址,還有其他的一些信息。
8、 為啥要緩存?
不想每個頁面都去加載固定不變的東東,比如配置信息和通用函數。雖然瀏覽器在加載的時候會啟用緩存,但是不太好控制。客戶端也可以強制不用緩存。也許是我控制欲比較強吧,我想更好的控制。
另外用緩存,速度會更快一些,比較不用瀏覽器去做各種判斷了。雖然判斷的時間一般也挺快的。
9、 如何實現更新?
用版本號,設定一個版本號,有更新了,改一下這個版本號就可以了。
10、 看你寫了好幾次復用,到底是啥?
就是讓子頁用top頁里加載好的js。
11、 如何避免各個文件里的函數名稱沖突?
我用的是命名空間的方式,C#寫的比較多了,感覺命名空間挺好用的,就移植過來了。看了sea.js的介紹,里面也提到了命名空間的方式,是yahoo用過。Sea.js並不推薦,因為使用的時候要記住長長的命名空間。但是我覺得這個不算事呀。不就是長點嗎,安裝Resharper(R#)之后,點.也是可以出提示的。另外可以用“別名”,比如 var form = Nature.Controls.Form; 這樣就好了。
12、 其他js都是怎么下載的?
做一個js文件路徑的字典,json格式,弄個昵稱最為key,域名 + 路徑 + 文件名作為value。按照依賴制定前后順序,然后按照這個字典進行逐一加載就可以了。
13、 為什么沒有做延遲加載?
我把共用的js文件都加載到了top頁面里,子頁想用的話,直接用好了,完全沒有再次加載的過程。雖然一開始需要加載更多的js,但是一般可以忍受。另外登錄OA,第一件事情就是輸入用戶名和密碼,那么完全可以利用這個“空余”時間來實現其他js的加載。
目前只想到這些,還有哪些疑問,歡迎大家提問。
ps:下集預告,就是看看運行效果了,可能寫了這么多,大家可能還沒有一個具體的概念,到底是啥樣子的呀。下一篇會貼一些運行截圖。