1. 程式人生 > >js的動態載入、快取、更新以及複用(一)

js的動態載入、快取、更新以及複用(一)

使用範圍:

  OA、MIS、ERP等資訊管理類的專案,暫時不考慮網站。

遇到的問題:

  完成一個專案,往往需要引用很多js檔案,比如jQuery.js、easyUI等。還有自己寫的一些列js檔案,那麼這些檔案如何方便的載入,如果檔案有變化如何才能讓客戶端及時更新快取?如果能夠提高點執行效率,那就更好了。

目標:

1、  可以方便的引用js檔案。

2、  儘量使用各種快取,避免頻繁從伺服器讀取檔案。

3、  如果js檔案有更新或者增加、減少幾個減少js檔案,需要客戶端能夠自動、立刻更新。

4、  Js檔案的複用。

頁面結構:

  一般OA、MIS這一類的專案,大多采用frameset或者iframe的方式來實現,這樣就有了父頁和子頁的概念。我們可以利用這一點來做做文章。

  網頁可以分為三塊:外殼、首頁、標籤、資料列表、表單(新增、修改)。因為這裡要說的載入js的方法,需要利用這種頁面結構,也正是因為這個原因,所以暫時不支援網站。

  看這個圖有點眼熟吧。恩,就是這種結構。

  

正文

  現在做web版的應用,越來越依賴各種js了,第三方的jQuery、easyUI、my97等,還有自己寫的各種js。要實現的功能越來越多,需要使用的js也越來越多,js檔案的修改也很頻繁。於是就出現了許多問題,比如每個頁面都要寫一大堆<script src=””>。這個也太麻煩了吧,增加一個新的js檔案,需要改多少頁面?js檔案更新瞭如何讓客戶端也立即更新?如何讓客戶端更快的載入js。有的Js檔案還有依賴關係,如何確保載入順序?本文內容就是分享一下我的解決方案。

動態載入

  在頁面裡使用<script>載入js,顯然很麻煩,那麼怎麼辦呢?想來想去還是用動態載入的方法來解決。在網上也搜尋了一番,有很多種方法,有自己手動寫的,有整理成框架的(比如seejs)。有的時候還是感覺自己弄一個更加的應手,所以打算自己寫一套。

  如何動態載入呢?使用jQuery提供的方法嗎?這個倒是可以,但是頁面必須引用jQuery和我寫的載入js檔案的js。也就是說一個頁面要寫兩個<script>,這個就麻煩了。能寫一個,就一定不要寫兩個,雖然只是多了一個,但是多了這麼一個就真的很麻煩。所以決定自己手寫一個動態載入的小方法。

  不會寫怎麼辦呢?百度大嬸來幫忙吧。各種搜呀,終於找到了一個比較理想的方法,恩就用這個了。

 1 /*實現動態載入js的函式,來自於網際網路,做了一點修改,可以相容IE10 */
 2 var loadscript =
 3 {
 4     $$: function(id) { return document.getElementById(id); },
 5     tag: function(element) { return document.getElementsByTagName(element); },
 6     ce: function(element) { return document.createElement(element); },
 7     js: function(url, callback) {
 8         var s = loadscript.ce('script');
 9         s.type = "text/javascript";
10         s.src = url;
11         if (document.documentMode == 10 || document.documentMode == 9) {
12             s.onerror = s.onload = loaded;
13         } else {
14             s.onreadystatechange = ready;
15             s.onerror = s.onload = loaded;
16         }
17         loadscript.tag('head')[0].appendChild(s);
18 
19         function ready() { /*IE7.0/IE10.0*/
20             if (s.readyState == 'loaded' || s.readyState == 'complete') {
21                 callback();
22             }
23         }
24 
25         function loaded() { /*chrome/IE10.0*/
26             callback();
27         }
28     }
29 };

載入順序

  和新程式碼已經搞定了,下面就是如何載入其他js檔案了,由於檔案比較多,還有一定的依賴關係,想來想去還是弄個js檔案的字典吧,然後做一個載入順序,按照這個順序來載入。

  為了更穩定一點,決定採用一個一個載入的方式,即載入完一個js,然後在載入另一個js。這樣就可以確保依賴關係。當然缺點是載入速度會比較慢。一般網頁載入js是可以多個js檔案一起下載的,這個速度就會比較快。

使用快取

  一般瀏覽器對於各種資源(比如網頁、圖片、js、css等)會有一個快取,已經有了就不會再向伺服器去下載了。看似很好,但是有兩個問題:

    A、瀏覽器如何判斷快取的js檔案是不是最新的?

    B、js檔案更新了,如何強制瀏覽器更新?

  瀏覽器是怎麼判斷的呢?具體步驟我也不太清楚,只是知道有一個步驟是要到伺服器問問,我快取的js檔案是不是最新的,然後才能夠確定本地的快取是否是最新的,如果是最新的就不折騰了,如果不是再去下載最新的。就是說呢,即使客戶端已經有了js檔案的快取,但是瀏覽器要確認一下是否最新,還是會跑到伺服器去問問。這個,折騰呀。當然一般情況下,這個過程會很快,但是有時候這個過程會很慢。

  所以呢,還是儘量避免載入js的好。於是就引出來的“js檔案的複用”。

更新js檔案

  Js檔案更新了,但是瀏覽器卻還在用以前的js檔案,因為有快取了,而且還固執的認為快取的js檔案就是最新的,哎咋辦呀?

  最簡單的方法就是在載入js的時候,後面跟一個版本號,有更新了,就版本號+1。比如 xxx.js?v=1。Js檔案更新後就是 xxx.js?v=2。這樣js就肯定會被更新了。

  看起來似乎很簡單,但是這個版本號如何加上去?版本號本身又如何更新呢?

複用

  這個就要先看看上面那個圖了,就是頁面結構,有一個外殼頁(或者首頁),我們叫做父頁。裡面還有若干個iframe載入的頁面,我們加做子頁。

  一般的做法是,父頁里加載jQuery.js,然後子頁裡也要載入jQuery.js。當然當子頁在載入jQuery.js的時候,直接從快取裡面提取,一般不會再去折騰伺服器了。

  但是,既然父頁裡面已經載入了,子頁為啥還要再載入一次?直接用父頁里加載好的行不行呢?到網上搜了一下,似乎沒有人這麼做。也許是我太另類了吧,我就是想實現這個方法。優點就是,所有的js檔案都在父頁里加載,子頁直接使用父頁里加載好的js,這樣子頁就不需要在折騰js檔案了。這樣效率也可以更高一些,畢竟即使用快取里加載,也是要判斷一下,然後在做個載入的動作,還是會有一點點損耗,js檔案越多也就越明顯。

  那麼如何實現呢,想想似乎很簡單。

  父頁裡使用jQuery

  Var aa = $(’div’);  //找到父頁裡的所有div

  子頁裡是不是可以這麼做?

  Var  bb = top.$ (’div’) ; //能夠找到div,但是不是子頁的div而是父頁裡的div。

  咋回事呢?原因就在於搜尋範圍。jQuery是有三個引數的,我們平時只用了第一個,後面的就被忽略了。那麼第二個引數是啥呢?就是搜尋範圍。沒有指定的時候,jQuery會在哪裡搜尋呢?載入jQuery的頁面裡面搜尋,而不是呼叫$的頁面裡搜尋。

  解決方法也很簡單,加個引數就好了

  Var  bb = top.$ (’div’,document) ; //指定搜尋範圍:子頁的document

  等等,這個似乎很煩人,我們在寫指令碼的時候,還要考慮一下,這個指令碼是在父頁裡執行還是在子頁裡執行嗎?

  好了,做一個簡單的封裝,避免這個麻煩。子頁裡寫個函式

function $ (p1){

         return top.$ (p1,document);

}

  好了,大功告成了嗎?當然沒有!預知後事如何,請聽下回分解。

ps:下集預告。就是具體的實現程式碼,還有一些思路和想法,不知道大家還有啥想知道的沒,有的話,歡迎在下面回覆一下。謝謝先。

相關推薦

js動態載入快取更新以及

使用範圍:   OA、MIS、ERP等資訊管理類的專案,暫時不考慮網站。 遇到的問題:   完成一個專案,往往需要引用很多js檔案,比如jQuery.js、easyUI等。還有自己寫的一些列js檔案,那麼這些檔案如何方便的載入,如果檔案有變化如何才能讓客戶端及時更新快取?如果能夠提高點執行效率,

js動態載入快取更新以及

總體思路 1、  建立一個js服務,該服務實現通用js檔案的載入、依賴、快取、更新以及複用。 2、  各個專案如果使用通用js,可(bi)以(xu)使用js服務實現載入。 3、  Js服務只提供通用的js,比如jQuery、my97、easyUI等(可根據實際情況設定具體的js檔案)。 4、  其他針

js動態載入快取更新以及

  本來想一氣呵成,把載入的過程都寫了,但是卡著呢,所以只好在分成兩份了。   1、頁面裡使用<script>來載入 boot.js 。   2、然後在boot.js裡面動態載入 bootLoad.js。以時間作為標識 var dateVer = date.getYear() + '_

js動態載入快取更新以及

  上一篇發出來後得到了很多回復,在此首先感謝大家的熱情捧場!有的推薦第三方框架,比如 In.js、requrieJS、sea.js、lab.js等。這個開闊了眼界,以前只知道sea.js,省去了自己搜尋的麻煩。也用了點時間簡單看了一下,因為每一個都是大塊頭,都有自己的理念,如果只是簡單使用的話,那麼誰便

IO多路-- SelectPollEpoll

在上一篇博文中提到了五種IO模型,關於這五種IO模型可以參考博文IO模型淺析-阻塞、非阻塞、IO複用、訊號驅動、非同步IO、同步IO,本篇主要介紹IO多路複用的使用和程式設計。 IO多路複用的概念 多路複用是一種機制,可以用來監聽多種描述符,如果其中任意一個描述符處

PHPMySQL和JavaScript學習手冊筆記

本地 後端 驗證 css 考題 php 語言 html oot 第一章思考題1.創建一個完全動態網頁至少需要哪四大要素?服務器 動態語言php js 數據庫2.html代表超文本xxx3.因為sql分支用sql語言4.php用在服務器端 處理後端任務 js用在客戶端 本地驗

angularjs手機webapp 利用input拍照,相簿選擇縮圖顯示 上傳圖片

執行後的截圖: html程式碼 <ul class="list_img"> <li ng-repeat="imageSrc in imgshows track by $index"> <img n

S5PV210的啟動流程詳解

210整個啟動流程可以大致分為三個階段,分別為:      1.執行IROM中的程式碼       2.執行UBOOT的BL1       3.執行UBOOT的BL2,最後啟動核心 IROM是2

IO多路 -- selectpollepoll實現TCP反射程式

接著上文IO多路複用(一)-- Select、Poll、Epoll,接下來將演示一個TCP回射程式,原始碼來自於該博文https://www.cnblogs.com/Anker...,在這裡將其進行了整合,突出select、poll和epoll不同方法之間的比較,但

Android-動態載入外掛化的兩種實現方式:介面

上一篇部落格中http://blog.csdn.net/lxping51/article/details/71480239,主要通過反射的方式來實現動態載入外掛化,今天我們以介面的方式來達到目的。介面的實現比反射更為簡單,而且直接呼叫對效能有很大的提高。但是這也

PHP擴充套件開發之動態載入so模組與靜態重編譯PHP

動態載入so模組:利用ext_skel工具編譯生成so模組,修改php.ini檔案,動態載入即可 靜態編譯:將編寫的模組靜態編譯到PHP,需要重新編譯PHP 假設要編寫一個my_dynamic擴充套件,呼叫my_dynamic函式後輸出字串“The Best

PyQt5 QTableWidget表單控制元件自適應視窗大小欄位大小調整及佈局

目錄 前言 前言 還好,我有C++ Qt Help(幫助文件)O(∩_∩)O哈哈~ 本文旨在介紹QTableWidget(表單控制元件)的自適應視窗大小、欄位大小調整及佈局。 用QtDesigner設計UI 1. 先用QtDe

如何區分Babel中的stage-0,stage-1,stage-2以及stage-3

fun too com window 內容 解決 真的 creat 加載 大家知道,將ES6代碼編譯為ES5時,我們常用到Babel這個編譯工具。大家參考一些網上的文章或者官方文檔,裏面常會建議大家在.babelrc中輸入如下代碼: { "pres

JDBC資料庫連線池連線資料庫及資料庫操作DAO層設計通用更新及查詢方法

該篇文章介紹了資料庫連線池獲取資料庫連線以及資料庫操作的基本使用,然後主要提供了java專案案例中dao層的一種設計,利用反射的原理定義了通用的查詢方法可以對應所有的表和例項。文章中的每段程式碼都提供了詳細的註釋及邏輯步驟 首先匯入資料庫連線的所需要的jar包:    

大資料面試題以及答案整理

kafka的message包括哪些資訊 一個Kafka的Message由一個固定長度的header和一個變長的訊息體body組成 header部分由一個位元組的magic(檔案格式)和四個位元組的CRC32(用於判斷body訊息體是否正常)構成。當magic的值為

大資料開發工程師面試題以及答案整理

kafka的message包括哪些資訊 一個Kafka的Message由一個固定長度的header和一個變長的訊息體body組成 header部分由一個位元組的magic(檔案格式)和四個位元組的CRC32(用於判斷body訊息體是否正常)構成。當magic的值為1的時候,會

更新】Essential Studio for ASP.NET MVC更新至2018 v4

下載Essential Studio for ASP.NET MVC最新版本 Essential Studio for ASP.NET MVC控制元件包是一款MVC介面開發包,它包含了幾乎所有企業級Web應用程式開發所需要的控制元件,如Grids、 Charts、Gauges、Menus、Calenda

更新】Essential Studio for Xamarin更新至2018 v4

下載Essential Studio for Xamarin最新版本 Essential Studio for Xamarin是全面的Xamarin.iOS、Xamarin.Android和Xamarin.Forms元件套包,包含最快的圖表和網格。 COMMON 主題支援 現在,您可以使用預定義的

物件池commons-pool框架的研究以及原始碼分析

    物件池是一個物件集合,用於將建立好的物件存在該集合中,當需要使用池中的物件時,再從池中取出,恰當地使用物件池可以有效減少物件生成和初始化時的消耗,提高系統的執行效率。另外,利用物件池還可以對物件的狀態做一定的維護,確保物件是可用的,提高程式的健壯性。注意:物件池技術