js的動態加載、緩存、更新以及復用(三)


總體思路

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:下集預告,就是看看運行效果了,可能寫了這么多,大家可能還沒有一個具體的概念,到底是啥樣子的呀。下一篇會貼一些運行截圖。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM