搜尋
首頁web前端js教程JavaScript 專案優化總結
JavaScript 專案優化總結Nov 26, 2016 pm 04:19 PM
JavaScript

前段時間對公司已有專案JavaScript程式碼進行最佳化,本文的是對優化工作的一個總結,拿出來與大家分享。當然我的最佳化方式可能不是最優的,或者說有些不對的地方,請指教。

JavaScript優化總結分為以下幾點

優化前後對比

優化前

優化後

程式碼混亂,同樣功能的函數重複出現在多個地方。如果需要修改實現,需要找到所有的地方。牽一發而動全身 模組化,提取公共介面組織為函式庫、結構清晰、方便程式碼重複使用、能夠遊戲防止變數污染問題。

JavaScript檔案未壓縮,size比較大載入消耗網路耗時,阻塞頁面渲染JavaScript公共程式庫檔案使用UglifyJS壓縮:

●   Size比較小優化了網路載入時間

●   壓縮混淆了程式碼,在一定程度上保護程式碼

使用時需要載入多個單獨的JavaScript文件,增加了http請求數降低效能對公用程式庫合併壓縮在減少size的同時,減少http請求數

缺乏文件(讓後面的開發者對已有功能不清楚,這在一定程度上造成前面說的,同樣功能的函數重複出現在多個地方) 公共庫中每個類別、函數、屬性都有說明文件

●   模組化(類別程式設計):程式碼清晰、有效防止變數污染問題、程式碼重複使用方便擴充等;

●   JavaScript壓縮混淆:減少size最佳化載入時間,混淆保護程式碼;

●   JavaScript檔案合併:減少http請求最佳化網路耗時提升效能;

●   JavaScript檔案合併:減少http請求最佳化網路耗時提升效能;

●   產生文件:方便公共庫的使用,尋找介面方便。

 

模組化(類別程式設計)

對於靜態類別來說JavaScript實作比較簡單,使用Object直接量就已經夠用了;但是要創建實例化、可繼承經典的類別需要做一番工作。因為JavaScript是基於原型的(prototype-based)程式語言,並沒有包含內建類別的實作(它沒有存取控制符,它沒有定義類別的關鍵字class,它沒有支援繼承的extend或冒號,它也沒有用來支援虛函數的virtual等),但我們透過JavaScript可以輕易地模擬出經典的類別。

靜態類別

根據寶寶JS公共介面的特性,它們不需要實例化,所以最佳化使用了該方式。以下以PetConfigParser為例介紹下實現方式:

 

var PetConfigParser;

if (!PetConfigParser) {

    PetConfigParser = {figParser) {

    PetConfigParser = {figParser) {

 

    //private 變數、函數

    /**

     * 寶寶所有設定字典,以【cate * 10000 + (lvl - 1) * 10 + dex - 1】為key

     * @attribute    * @private

     */

    var petDic = null;  //寶寶字典

 

        petDic = new Object() ;

        for (var item in __pet_config) {

            var lvl = parseInt(__pet_config[item]['lvl']); config[item]['dex']);

            var cate = parseInt(__pet_config[item]['cate']);

            var key = cate * 10000 + (lvl - 1) * 我

        }

    }

 

    //public 介面

 

    /**

     * 依照__pet_config建構一個Object字典,使用cate、dex、lvl組合為key

     * @method buildPetDic

} @pri   */

)   if (    PetConfigParser.getPetById = function (petId) {

            var pet = ("undefined" == typeof (__pet_config)) ? null : __pet_config["pet_" + petId];

            return pet;

        }

}

})();

 域在內部存取功能總結上述過程分為以下步驟:

1)        定義一個全域的變數(var PetConfigParser),注意變數首字母大寫與普通變數差異;

(2)        然後建立一個匿名函數並執行匿名函數並執行匿名函數並執行匿名函數並執行一個匿名函數並執行匿名函數並執行匿名函數並執行匿名函數)(function) {/*xxxx*/ })(); ),在匿名函數內部創建局部變數和函數,它們只能在目前作用域中被存取;

3)        全域變數(var PetConfigParser)可以在任何地方存取到,在匿名函數內部操作PetConfigParser中新增靜態函數。

使用實例:

 

$(function () {

 

        DialogManager.in p. () {

 

            DialogManager.show ("#msgBoxTest", "#closeId");

 

            return false;

 

#cofirmBtn').click(function () {

 

            DialogManager. hide();

 

            return false;

 

       );總結有三種方法:

●  建構函數方式;

●  原型方式;

●  建構子+原型的混合方式

建構子方式

建構子用來初始化實例物件的屬性和值。任何JavaScript函數都可以用作建構函數,建構函數必須使用new運算子作為前綴來建立新的實例。

 

var Person = function (name) {

    this.name = name;

    this.sayName = function(){

    this.sayName = function(){

}

 

//實例化

var tyler = new Person("tylerzhu");

var saylor = new Person("saylorzhu");

tyler.sayName();

saylor.

tyler.sayName();

saylor.

tyler.sayName();

saylor。檢查實例

alert(tyler instanceof Person);

建構函式方式跟傳統的物件導向語言是不是很相識!只不過是class關鍵字用function取代了。

注意:不要省略new否則Person(“tylerzhu”) //==>undefined。當使用new關鍵字來呼叫建構函式時,執行上下文(context)會從全域物件(window)變成一個空的上下文,這個上下文代表了新產生的實例。因此,this關鍵子指向目前建立的實例。所以省略new時,沒有進行上下文切換會在全域物件中尋找name,沒有找到而建立一個全域變數name回傳undefined。

原型方式

建構函式方式簡單,但是有一個浪費記憶體的問題。如同上面的例子中實例化了兩個對象tyler、saylor,表面上好像沒什麼問題,但是實際上對於每一個實例對象,sayName()方法都是一模一樣的內容,每一次生成一個實例,都必須為重複的內容申請內容。

alert(tyler. sayName == saylor. sayName) 輸出false! ! !

Javascript中每一個建構子都有一個prototype屬性,指向另一個物件。這個物件的所有屬性和方法,都會被建構函數的實例共用。

 

var Person = function (name) {

    Person.prototype = name;

    Person.prototype.sayName = function(){

}

 

//實例化

var tyler = new Person("tylerzhu");

var saylor = new Person("saylorzhu");

tyler.sayName();

lor.Name();

//檢查實例

alert(tyler instanceof Person);

這時tyler、saylor實例的sayName方法,都是同一個記憶體位址(指向prototype物件),因此原型方法更節省記憶體。

但是看tyler.sayName();saylor.sayName();兩者輸出,會看出問題 —— 它們都輸出「saylorzhu」。因為原型所有屬性都共享,只要一個實例改變其他的都會跟著改變,所以實例化物件saylor覆蓋了tyler。

構造函數+原型的混合方式

構造函數方式可以為同一個類別的每一個物件分配不同的內存,這很適合寫類別的時候設定屬性;但是設定方法的時候我們就需要讓同一個類別的不同物件共享同一個內存了,寫方法用原型的方式最好。所以寫類別的時候需要把構造方法和原型兩種方式混合著用(很多類別庫提供的創建類別的方法或框架的寫類別方式本質上都是:構造函數+原型)。

 

var Person = function (name) {

    Person.prototype = name;

    Person.prototype.sayName = function(){

}

 

//實例化

var tyler = new Person("tylerzhu");

var saylor = new Person("saylorzhu");

tyler.sayName(); /檢查實例

alert(tyler instanceof Person);

這樣即可透過建構子建構不同name的人,物件實例也都共享sayName方法,不會造成記憶體浪費。

JavaScript壓縮/合併

JavaScript程式碼壓縮混淆的意義:簡單的說就是為了減小js檔案大小,去掉多餘的註解和換行縮排等,使得下載起來更快,提高使用者體驗。

JavaScript壓縮工具很多,我推薦使用jQuery現在使用的工具UglifyJS(jQuery以前也使用過多種壓縮工具,如Packer),因為它壓縮性能很好。

「jQuery 1.5 發佈的時候 john resig 大神說所用的程式碼最佳化程式從Google Closure切換到UglifyJS,新工具的壓縮效果非常令人滿意」

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
在JavaScript中替換字符串字符在JavaScript中替換字符串字符Mar 11, 2025 am 12:07 AM

JavaScript字符串替換方法詳解及常見問題解答 本文將探討兩種在JavaScript中替換字符串字符的方法:在JavaScript代碼內部替換和在網頁HTML內部替換。 在JavaScript代碼內部替換字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 該方法僅替換第一個匹配項。要替換所有匹配項,需使用正則表達式並添加全局標誌g: str = str.replace(/fi

如何創建和發布自己的JavaScript庫?如何創建和發布自己的JavaScript庫?Mar 18, 2025 pm 03:12 PM

文章討論了創建,發布和維護JavaScript庫,專注於計劃,開發,測試,文檔和促銷策略。

如何在瀏覽器中優化JavaScript代碼以進行性能?如何在瀏覽器中優化JavaScript代碼以進行性能?Mar 18, 2025 pm 03:14 PM

本文討論了在瀏覽器中優化JavaScript性能的策略,重點是減少執行時間並最大程度地減少對頁面負載速度的影響。

jQuery矩陣效果jQuery矩陣效果Mar 10, 2025 am 12:52 AM

將矩陣電影特效帶入你的網頁!這是一個基於著名電影《黑客帝國》的酷炫jQuery插件。該插件模擬了電影中經典的綠色字符特效,只需選擇一張圖片,插件就會將其轉換為充滿數字字符的矩陣風格畫面。快來試試吧,非常有趣! 工作原理 插件將圖片加載到畫布上,讀取像素和顏色值: data = ctx.getImageData(x, y, settings.grainSize, settings.grainSize).data 插件巧妙地讀取圖片的矩形區域,並利用jQuery計算每個區域的平均顏色。然後,使用

如何使用瀏覽器開發人員工具有效調試JavaScript代碼?如何使用瀏覽器開發人員工具有效調試JavaScript代碼?Mar 18, 2025 pm 03:16 PM

本文討論了使用瀏覽器開發人員工具的有效JavaScript調試,專注於設置斷點,使用控制台和分析性能。

如何構建簡單的jQuery滑塊如何構建簡單的jQuery滑塊Mar 11, 2025 am 12:19 AM

本文將引導您使用jQuery庫創建一個簡單的圖片輪播。我們將使用bxSlider庫,它基於jQuery構建,並提供許多配置選項來設置輪播。 如今,圖片輪播已成為網站必備功能——一圖胜千言! 決定使用圖片輪播後,下一個問題是如何創建它。首先,您需要收集高質量、高分辨率的圖片。 接下來,您需要使用HTML和一些JavaScript代碼來創建圖片輪播。網絡上有很多庫可以幫助您以不同的方式創建輪播。我們將使用開源的bxSlider庫。 bxSlider庫支持響應式設計,因此使用此庫構建的輪播可以適應任何

用JavaScript增強結構標記用JavaScript增強結構標記Mar 10, 2025 am 12:18 AM

核心要点 利用 JavaScript 增强结构化标记可以显著提升网页内容的可访问性和可维护性,同时减小文件大小。 JavaScript 可有效地用于为 HTML 元素动态添加功能,例如使用 cite 属性自动在块引用中插入引用链接。 将 JavaScript 与结构化标记集成,可以创建动态用户界面,例如无需页面刷新的选项卡面板。 确保 JavaScript 增强功能不会妨碍网页的基本功能至关重要;即使禁用 JavaScript,页面也应保持功能正常。 可以使用高级 JavaScript 技术(

如何使用Angular上傳和下載CSV文件如何使用Angular上傳和下載CSV文件Mar 10, 2025 am 01:01 AM

數據集對於構建API模型和各種業務流程至關重要。這就是為什麼導入和導出CSV是經常需要的功能。在本教程中,您將學習如何在Angular中下載和導入CSV文件

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器