搜尋
首頁web前端js教程怎樣優化Vue項目

怎樣優化Vue項目

Sep 07, 2017 pm 01:45 PM
最佳化怎樣專案

前幾天看到大家說 vue 專案越大越難優化,帶來很多痛苦,這是避免不了的,問題終究要解決,框架的效能是沒有問題的,各大測試網站都有相關數據。下面進入正題

基礎最佳化

所謂的基礎最佳化是任何 web 專案都要做的,並且是問題的根源。 HTML,CSS,JS 是第一步要最佳化的點

分別對應到.vue 檔案內的,

<template>,<style>,<script>

,下面逐個談下vue 專案裡有哪些值得優化的點

template

語義化標籤,避免亂嵌套,合理命名屬性等等標準推薦的東西就不談了。

模板部分幫助我們展示結構化數據,vue 透過數據驅動視圖,主要注意幾點

  • v-show,v-if 用哪個?在我來看要分兩個維度去思考問題,第一個維度是權限問題,只要牽涉到權限相關的展示無疑要用 v-if,第二個維度在沒有權限限制下根據使用者點擊的頻率選擇,頻繁切換的使用 v-show,不頻繁切換的使用 v-if,這裡要說的最佳化點在於減少頁面中 dom 總數,我比較傾向於使用 v-if,因為減少了dom 數量,加快首屏渲染,至於性能方面我感覺肉眼看不出來切換的渲染過程,也不會影響用戶的體驗。

  • 不要在範本裡面寫太多的表達式與判斷 v-if="isShow && isAdmin && (a || b)",這種表達式雖說可以識別,但是不是長久之計,當看著不舒服時,適當的寫到methods 和computed 裡面封裝成一個方法,這樣的好處是方便我們在多處判斷相同的表達式,其他權限相同的元素再判斷展示的時候調用同一個方法即可。

  • 循環呼叫子元件時加入 key,key 可以唯一標識一個循環個體,可以使用例如 item.id 作為 key,假如陣列資料是這樣的 ['a' , 'b', 'c', 'a'],使用 :key="item" 顯然沒有意義,更好的辦法就是在循環的時候 (item, index) in arr,然後 :key="index"來確保 key 的唯一性。

style

  • 將樣式檔放在 vue 檔案內還是外?討論起來沒有意義,重點是按模組劃分,我的習慣是放在 vue 文件內部,方便寫代碼是在同一個文件裡跳轉上下對照,無論內外建議加上 <style scoped></style> 將樣式檔案鎖住,目的很簡單,再好用的標準也避免不了多人開發的麻煩,約定命名規則也可能會衝突,鎖定區域後盡量採用簡短的命名規則,不需要 .header-title__text 之類的 class,直接 .title 搞定。

  • 為了和上一條作區分,說下全局的樣式文件,全局的樣式文件,盡量抽象化,既然不在每一個組件裡重複寫,就盡量通用,這部分抽像做的越好說明你的樣式檔案體積越小,重複使用率越高。建議將複寫元件庫如 Element 樣式的程式碼也放到全域中去。

  • 不使用 float 佈局,之前看到很多人封裝了 .fl -- float: left 到全域檔案裡去,然後要 .clear,現在的瀏覽器還不至於弱到非要用 float 去相容,完全可以 flex,grid 相容性一般,功能其實 flex 佈局都可以實現,float 會帶來佈局上的麻煩,用過的都知道不相信解釋坑了。

至於其他通用的規範這裡不贅述,相關文章很多。

script

這部分也是最難優化的點,說下個人意見吧。

  • 多人開發時盡量保持每個元件 export default {}# 內的方法順序一致,方便找出對應的方法。我個人習慣 data、props、鉤子、watch、computed、components。

  • data 裡要說的就是初始化資料的結構盡量詳細,命名清晰,簡單易懂,避免無用的變量,isEditing 實際上可以代表兩個狀態,true 或false,不要再去定義notEditing 控制展示,完全可以在模板裡 {{ isEditing ? 編輯中: 儲存}}

  • props 父子元件傳值時盡量 :width="" :heigth="" 不要 # :option={},細化的好處是只傳需要修改的參數,在子元件 props 裡加資料型,是否必傳,以及預設值,方便排除錯誤,讓傳值更嚴謹。

  • 鉤子理解好生命週期的意義就好,什麼時間該請求,什麼時間註銷方法,哪些方法需要註銷。簡單易懂,官網都有寫。

  • metheds 中每一個方法一定要簡單,只做一件事,盡量封裝可重複使用的簡短的方法,參數不易過多。如果十分依賴lodash 開發,methed 看著會簡潔許多,代價就是整體的bundle 體積會大,假如專案僅用到小部分方法可以局部引入loadsh,不想用lodash 的話可以自己封裝一個util.js 檔案

  • watch 和computed 用哪個的問題看官網的例子,計算屬性主要是做一層filter 轉換,切忌加一些呼叫方法進去,watch 的作用就是監聽資料變化去改變資料或觸發事件如 this.$store.dispatch('update', { ... })

元件最佳化

vue 的元件化深受大家喜愛,到底元件拆到什麼程度算是合理,還要因項目大小而異,小型專案可以簡單幾個組件搞定,甚至不用vuex,axios 等等,如果規模較大就要細分組件,越細越好,包括佈局的封裝,按鈕,表單,提示框,輪播等等,推薦看下Element 元件庫的程式碼,沒時間寫這麼詳細可以直接用Element 函式庫,分幾點進行最佳化

  • 元件有明確意義,只處理類似的業務。復用性越高越好,配置性越強越好。

  • 自己封裝元件還是遵循配置 props 細化的規則。

  • 元件分類,我習慣性的依照三類劃分,page、page-item 和layout,page 是路由控制的部分,page-item 屬於page 裡各個佈局區塊如banner 、side 等等,layout 裡放置多個頁面至少出現兩次的元件,如icon, scrollTop 等

vue-router 和vuex 優化

vue-router除了切換路由,用的最多的是處理權限的邏輯,關於權限的控制這裡不贅述,相關demo 和文章有許多,那麼說到優化,值得一提的就是組件懶加載

#

中午官网链接如上,例子如下

const Foo = r => require.ensure([], () => r(require('./Foo.vue')), 'group-foo')
const Bar = r => require.ensure([], () => r(require('./Bar.vue')), 'group-foo')
const Baz = r => require.ensure([], () => r(require('./Baz.vue')), 'group-foo')

这段代码将 Foo, Bar, Baz 三个组件打包进了名为 group-foo 的 chunk 文件,当然啦是 js 文件

其余部分正常写就可以,在网站加载时会自动解析需要加载哪个 chunk,虽然分别打包的总体积会变大,但是单看请求首屏速度的话,快了好多。

vuex 面临的问题和解决方案有几点

  • 当网站足够大时,一个状态树下,根的部分字段繁多,解决这个问题就要模块化 vuex,官网提供了模块化方案,允许我们在初始化 vuex 的时候配置 modules。每一个 module 里面又分别包含 state 、action 等,看似是多个状态树,其实还是基于 rootState 的子树。细分后整个 state 结构就清晰了,管理起来也方便许多。

  • 由于 vuex 的灵活性,带来了编码不统一的情况,完整的闭环是 store.dispatch('action') -> action -> commit -> mutation -> getter -> computed,实际上中间的环节有的可以省略,因为 API 文档提供了以下几个方法 mapState、mapGetters、mapActions、mapMutations,然后在组件里可以直接调取任何一步,还是项目小想怎么调用都可以,项目大的时候,就要考虑 vuex 使用的统一性,我的建议是不论多简单的流程都跑完整个闭环,形成代码的统一,方便后期管理,在我的组件里只允许出现 dispatch 和 mapGetters,其余的流程都在名为 store 的 vuex 文件夹里进行。

  • 基于上面一条,说下每个过程里面要做什么,前后端数据一定会有不一致的地方,或是数据结构,或是字段命名,那么究竟应该在哪一步处理数据转换的逻辑呢?有人会说其实哪一步都可以实现,其实不然,我的建议如下

  1. 在发 dispatch 之前就处理好组件内需要传的参数的数据结构和字段名

  2. 到了 action 允许我们做的事情很多,因为这部支持异步,支持 state, rootState, commit, dispatch, getters,由此可见责任重大,首先如果后端需要部分其他 module 里面的数据,要通过 rootState 取值再整合到原有数据上,下一步发出请求,建议(async await + axios),拿到数据后进行筛选转换,再发送 commit 到 mutation

  3. 这一步是将转换后的数据更新到 state 里,可能会有数据分发的过程(传进一个 object 改变多个 state 中 key 的 value),可以转换数据结构,但是尽量不做字段转换,在上一步做

  4. 此时的 store 已经更新,使用 getter 方法来取值,token: state => state.token,单单的取值,尽量不要做数据转换,需要转换的点在于多个地方用相同的字段,但是结构不同的情况(很少出现)。

  5. 在组件里用 mapGetters 拿到对应的 getter 值。

打包优化

上面说了代码方面的规范和优化,下面说下重点的打包优化,前段时间打包的 vender bundle 足足 1.4M,app bundle 也有 270K,app bundle 可以通过组件懒加载解决,vender 包该怎么解决?

有人会质疑是不是没压缩或依赖包没去重,其实都做了就是看到的 1.4M。

解决方法很简单,打包 vender 时不打包 vue、vuex、vue-router、axios 等,换用国内的 bootcdn 直接引入到根目录的 index.html 中。

例如:

<script></script>
<script></script>
<script></script>
<script></script>

在 webpack 里有个 externals,可以忽略不需要打包的库

externals: {  
    'vue': 'Vue',  
    'vue-router': 'VueRouter',  
    'vuex': 'Vuex',  
    'axios': 'axios'
}

此时的 vender 包会非常小,如果不够小还可以拆分其他的库,此时增加了请求的数量,但是远比加载一个 1.4M 的 bundle 快的多。

以上是怎樣優化Vue項目的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python vs. JavaScript:您應該學到哪種語言?Python vs. JavaScript:您應該學到哪種語言?May 03, 2025 am 12:10 AM

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。

JavaScript框架:為現代網絡開發提供動力JavaScript框架:為現代網絡開發提供動力May 02, 2025 am 12:04 AM

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

JavaScript,C和瀏覽器之間的關係JavaScript,C和瀏覽器之間的關係May 01, 2025 am 12:06 AM

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr

node.js流帶打字稿node.js流帶打字稿Apr 30, 2025 am 08:22 AM

Node.js擅長於高效I/O,這在很大程度上要歸功於流。 流媒體匯總處理數據,避免內存過載 - 大型文件,網絡任務和實時應用程序的理想。將流與打字稿的類型安全結合起來創建POWE

Python vs. JavaScript:性能和效率注意事項Python vs. JavaScript:性能和效率注意事項Apr 30, 2025 am 12:08 AM

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

JavaScript的起源:探索其實施語言JavaScript的起源:探索其實施語言Apr 29, 2025 am 12:51 AM

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。

幕後:什麼語言能力JavaScript?幕後:什麼語言能力JavaScript?Apr 28, 2025 am 12:01 AM

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來:趨勢和預測Python和JavaScript的未來:趨勢和預測Apr 27, 2025 am 12:21 AM

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器