成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Vue.js應(yīng)用性能優(yōu)化:第三部分-延遲加載Vuex模塊

charles_paul / 1627人閱讀

摘要:靜態(tài)模塊不能被取消注冊也不能延遲注冊,并且在初始化后不能更改靜態(tài)模塊的結(jié)構(gòu)不是狀態(tài)。為此,我們將在路由對應(yīng)的組件中加載模塊,而不是在中導(dǎo)入并注冊它。能代碼分割模塊是一個強(qiáng)大的工具。

在前一部分,我們學(xué)習(xí)了足夠強(qiáng)大的模式,可以顯著提高應(yīng)用程序的性能 - 按每個路由分割代碼。雖然按路由分割代碼非常有用,但是在用戶訪問我們的站點后,仍然有很多代碼是不需要的。在本系列的這一部分中,我們將重點關(guān)注分離我們的狀態(tài)管理(state management?) - Vuex模塊。
本系列文章基于對 Vue Storefront 性能優(yōu)化過程的學(xué)習(xí)。通過使用下面的技術(shù),我們能夠?qū)⒊跏嘉募拇笮p少70%,并在眨眼間使其加載。

Part 1?—?Introduction to performance optimization and lazy loading.

Part 2?—?Lazy loading routes and vendor bundle anti-pattern.

Part 3?—?Lazy loading Vuex modules

Part 4?—?Delivering good waiting experience and lazy loading individual components?—?soon

Part 5?—?Lazy loading libs and finding smaller equivalents?—?soon

Part 6?—?Performance-friendly usage of UI libraries

Part 7?—?Making use of Service Worker cache?—?soon

Part 8?—?Prefetching

兩種類型的Vuex模塊

在我們進(jìn)一步了解如何延遲加載 Vuex 模塊 之前,您需要注意一件重要的事情,了解注冊 Vuex 模塊的方法,以及它們的優(yōu)缺點。

靜態(tài) Vuex 模塊(Static Vuex modules) 是在 Store 初始化期間聲明注冊。 以下是顯式創(chuàng)建的靜態(tài)模塊的示例:

// store.js
import { userAccountModule } from "./modules/userAccount"
const store = new Vuex.Store({
  modules: {
    user: userAccountModule
  }
})

上面的代碼將創(chuàng)建一個帶有靜態(tài)模塊 userAccountModule 新的 Vuex 實例。靜態(tài)模塊不能被取消注冊(也不能延遲注冊),并且在 Store 初始化后不能更改靜態(tài)模塊的結(jié)構(gòu)(不是狀態(tài)(not state))。

雖然這種限制對大多數(shù)模塊來說都不是問題,而且將所有模塊聲明在一個地方,確實有助于將所有與數(shù)據(jù)相關(guān)的內(nèi)容保存在一起,但是這種方法也有一些缺點。

假設(shè)我們的應(yīng)用程序中有一個專用的 Vuex 模塊的 admin 面板。

// store.js
import { userAccountModule } from "./modules/userAccount"
import { adminModule } from "./modules/admin"
const store = new Vuex.Store({
  modules: {
    user: userAccountModule, 
    admin: adminModule
  }
})

你可以想象這樣的模塊可能會非常的龐大。盡管 admin 面板可能只會被一小部分用戶使用,并且只能在特定的路由下使用(一個特殊的 /admin 路徑),但由于這些靜態(tài)模塊都是被集中注冊的,最終這些代碼都會被打包到主文件中。


我們所有的模塊都打包在一個文件中

這當(dāng)然不是我們想要的結(jié)果。我們需要一種方法只在訪問 /admin 路由時才加載。您可能已經(jīng)猜到靜態(tài)模塊不能滿足我們的需要。所有靜態(tài)模塊都需要在 Vuex Store 創(chuàng)建時進(jìn)行注冊。

這就是動態(tài)模塊可以幫助我們的地方!

動態(tài)模塊相比靜態(tài)模塊來說,可以在 Vuex Store 創(chuàng)建后再進(jìn)行注冊。這種簡潔的功能意味著我們不需要在應(yīng)用程序初始化時下載動態(tài)模塊,而是可以將其打包在不同的代碼塊中,或者在需要時延遲加載。

首先,讓我們看看前面的 admin 模塊用動態(tài)注冊是什么樣子的:

// store.js
import { userAccountModule } from "./modules/userAccount"
import { adminModule } from "./modules/admin"
const store = new Vuex.Store({
  modules: {
    user: userAccountModule, 
  }
})
store.registerModule("admin", adminModule)

我們沒有直接將 adminModule 模塊寫在 modules 屬性中,而是在 Vuex.Store 創(chuàng)建之后使用 registerModule 方法注冊這個模塊。

動態(tài)注冊不需要對模塊本身進(jìn)行任何更改,因此可以靜態(tài)或動態(tài)注冊任何 Vuex 模塊。

當(dāng)然,在目前來看,這個動態(tài)注冊的模塊并沒有給我們?nèi)魏魏锰帯?/p> 適當(dāng)?shù)姆指頥uex模塊

讓我們回到我們的問題上來,既然我們知道了如何動態(tài)注冊 admin 模塊,我們當(dāng)然可以嘗試將其代碼放入 /admin 路由文件中。

讓我們暫時停下來,簡要了解一下我們正在使用的應(yīng)用程序:

// router.js
import VueRouter from "vue-router"
const Home = () => import("./Home.vue")
const Admin = () => import("./Admin.vue")
const routes = [
  { path: "/", component: Home },
  { path: "/admin", component: Admin }
]
export const router = new VueRouter({ routes }) 

router.js 中,我們有兩個路由做了代碼分割,它們被延遲加載。使用我們在上面看到的代碼,我們的 admin 模塊仍然會打包到主文件 app.js 中,因為它在 store.js 中是靜態(tài)導(dǎo)入的。

讓我們修復(fù)這個問題,并將此模塊僅給訪問 /admin 路由的用戶使用,這樣其他人就不會下載冗余的代碼。

為此,我們將在 /admin 路由對應(yīng)的組件中加載 admin 模塊,而不是在 store.js 中導(dǎo)入并注冊它。

// store.js
import { userAccountModule } from "./modules/userAccount"
export const store = new Vuex.Store({
  modules: {
    user: userAccountModule, 
  }
})
// Admin.vue
import adminModule from "./admin.js"
export default { 
  // other component logic
  mounted () { 
    // 在這里動態(tài)注冊模塊
    this.$store.registerModule("admin", adminModule)
  },
  beforeDestroy () {
    // 當(dāng)組件被銷毀時,取消注冊
   this.$store.unregisterModule("admin")
  }
}

讓我們看看發(fā)生了什么!

我們在 /admin 路由對應(yīng)的 Admin.vue 組件中導(dǎo)入了 admin 模塊,并在組件掛載(mounted)之后注冊到了 Store 中。一旦用戶退出 damin 面板,銷毀該組件,我們就會取消注冊該模塊,以防止同一模塊被多次注冊。

現(xiàn)在因為 admin 模塊是在 Admin.vue 導(dǎo)入的,而不是在 store.js 中導(dǎo)入的,所以它將與代碼分割的 admin.vue 打包在一個文件中!

重要提示:如果使用SSR模式,請確保在 mounted 鉤子中 注冊模塊。否則,它可能導(dǎo)致內(nèi)存泄漏,因為beforeDestroy鉤子在服務(wù)器端不能執(zhí)行。

現(xiàn)在我們知道了如何使用動態(tài)注冊 Vuex 模塊,并適當(dāng)?shù)姆峙涞教囟酚傻奈募小W屛覀兛匆幌律晕?fù)雜一點的用例。

延遲加載Vuex模塊

假如說,我們的 home.vue 上有一個客戶評價的部分,我們希望用戶可以對我們的服務(wù)有積極的建議。這樣的評價部分有很多,我們不想在用戶進(jìn)入我們的網(wǎng)站后立即顯示它們, 只有在用戶需要時才能顯示它們。我們可以添加“Show Testimonials”按鈕,點擊后才加載并顯示客戶評價的部分。

為了存儲客戶評價數(shù)據(jù),我們還需要一個Vuex模塊。我們稱它為 testimonials 吧。該模塊將負(fù)責(zé)顯示以前添加的評價和添加的新評價。我們不需要知道實現(xiàn)細(xì)節(jié)。

我們希望只有用戶點擊按鈕才下載 testimonials 模塊,在此之前是不需要它的。讓我們看看如何利用動態(tài)模塊注冊和動態(tài)導(dǎo)入來實現(xiàn)此功能,Testimonials.vue 是被 Home.vue 使用的一個組件。

讓我們快速回顧一下代碼。當(dāng)用戶單擊 "Show Testimonials" 按鈕時,將調(diào)用 getTestimonials() 方法,它負(fù)責(zé)調(diào)用 getTestimonialsModule() 來獲取 testimonials.js。一旦 promise 為成功狀態(tài)(resolved)(這意味著模塊已被加載),我們就會動態(tài)注冊它并觸發(fā) action 獲取客戶評價。

多虧了動態(tài)導(dǎo)入,testmonials.js 內(nèi)容被打包到一個多帶帶的文件中,只有在調(diào)用 gettestmonialsModule 方法時才下載該文件。

當(dāng)我們需要退出 admin 面板時,我們在 beforeDestroy 生命周期鉤子中取消注冊已注冊過的模塊,如果我們再次進(jìn)入這個路由,就不會出現(xiàn)重復(fù)注冊的情況。

總結(jié)

盡管靜態(tài) Vuex 模塊注冊對于大多數(shù)用例來說已經(jīng)足夠了,但是在某些特定的情況下,我們可能需要使用動態(tài)注冊。

如果模塊只在特定的路由上需要,那么我們可以在適當(dāng)?shù)穆酚山M件中動態(tài)注冊它,這樣它就不會打包在主文件中。

如果模塊只有在一些交互之后才需要,那么我們需要將動態(tài)模塊注冊與動態(tài)導(dǎo)入結(jié)合起來,并以適當(dāng)?shù)姆椒ㄑ舆t加載模塊。

能代碼分割Vuex模塊是一個強(qiáng)大的工具。您在應(yīng)用程序中處理的與數(shù)據(jù)相關(guān)的操作越多,就可以從文件大小方面節(jié)省的越多。

在本系列的下一部分中,我們將學(xué)習(xí)如何延遲加載各個組件,更重要的是,應(yīng)該延遲加載哪些組件。

如果對你有幫助,請關(guān)注【前端技能解鎖】:

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/109635.html

相關(guān)文章

  • Vue.js應(yīng)用性能優(yōu)化:第一部分---介紹性能優(yōu)化和懶加載

    摘要:我的目標(biāo)是使本系列成為關(guān)于應(yīng)用程序性能的完整指南。代碼分割就是將應(yīng)用程序分割成這些延遲加載的塊??偨Y(jié)延遲加載是提高應(yīng)用程序性能并減少其大小的最佳方法之一。在本系列的下一部分中,我將向您展示如何使用和路由來分割應(yīng)用程序代碼。 當(dāng)移動優(yōu)先(mobile-first)的方式逐漸成為一種標(biāo)準(zhǔn),而不確定的網(wǎng)絡(luò)環(huán)境因素應(yīng)該始終是我們考慮的一點,因此保持讓應(yīng)用程序快速加載變得越來越困難。在本系列文章...

    ZweiZhao 評論0 收藏0
  • Vue.js應(yīng)用性能優(yōu)化:第二部分---路由懶加載和 Vendor bundle 反模式

    摘要:現(xiàn)在,我們將更深入地研究,并學(xué)習(xí)用于分割應(yīng)用程序最實用的模式。本系列文章基于對性能優(yōu)化過程的學(xué)習(xí)。路徑時才被下載。為了便于理解,文件名稱并不是由生成的真實名稱。接下來,我們將學(xué)習(xí)其他部分和單獨(dú)的組件也能夠從主文件分割出來并延遲加載。 在前一篇文章中,我們學(xué)習(xí)了什么是代碼分割,它是如何與 Webpack 一起工作的,以及如何在Vue應(yīng)用程序中使用延遲加載?,F(xiàn)在,我們將更深入地研究,并學(xué)習(xí)...

    0x584a 評論0 收藏0
  • vue-music(1)音樂播發(fā)器 項目開發(fā)記錄

    摘要:在中新建組件許文瑞正在吃屎。。。。在中添加如下代碼三歌手組件開發(fā)歌手首頁開發(fā)數(shù)據(jù)獲取數(shù)據(jù)獲取依舊從音樂官網(wǎng)獲取歌手接口創(chuàng)建我們和以前一樣,利用我們封裝的等發(fā)放,來請求我們的接口,返回給。 Vue-Music 跟學(xué)一個網(wǎng)課老師做的仿原生音樂APP跟學(xué)的筆記,記錄點滴,也希望對學(xué)習(xí)vue初學(xué)小伙伴有點幫助 showImg(https://segmentfault.com/img/remot...

    happen 評論0 收藏0
  • 淺談NUXT - 基于vue.js的服務(wù)端渲染框架

    摘要:是一款基于的服務(wù)端渲染框架,跟的異曲同工。該配置項用于定義應(yīng)用客戶端和服務(wù)端的環(huán)境變量。 Vue因其簡單易懂的API、高效的數(shù)據(jù)綁定和靈活的組件系統(tǒng),受到很多前端開發(fā)人員的青睞。國內(nèi)很多公司都在使用vue進(jìn)行項目開發(fā),我們正在使用的簡書,便是基于Vue來構(gòu)建的。 我們知道,SPA前端渲染存在兩大痛點:(1)SEO。搜索引擎爬蟲難以抓取客戶端渲染的頁面meta信息和其他SEO相關(guān)信息,使...

    yearsj 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<