亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

charles_paul / 1719人閱讀

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

在前一部分,我們學習了足夠強大的模式,可以顯著提高應用程序的性能 - 按每個路由分割代碼。雖然按路由分割代碼非常有用,但是在用戶訪問我們的站點后,仍然有很多代碼是不需要的。在本系列的這一部分中,我們將重點關注分離我們的狀態(tài)管理(state management?) - Vuex模塊。
本系列文章基于對 Vue Storefront 性能優(yōu)化過程的學習。通過使用下面的技術,我們能夠?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模塊

在我們進一步了解如何延遲加載 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)模塊的結構(不是狀態(tài)(not state))。

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

假設我們的應用程序中有一個專用的 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)模塊都是被集中注冊的,最終這些代碼都會被打包到主文件中。


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

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

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

動態(tài)模塊相比靜態(tài)模塊來說,可以在 Vuex Store 創(chuà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)注冊不需要對模塊本身進行任何更改,因此可以靜態(tài)或動態(tài)注冊任何 Vuex 模塊。

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

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

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

// 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)導入的。

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

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

// 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 () {
    // 當組件被銷毀時,取消注冊
   this.$store.unregisterModule("admin")
  }
}

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

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

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

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

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

延遲加載Vuex模塊

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

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

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

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

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

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

總結

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

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

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

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

在本系列的下一部分中,我們將學習如何延遲加載各個組件,更重要的是,應該延遲加載哪些組件。

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

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

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

相關文章

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

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

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

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

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

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

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

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

    yearsj 評論0 收藏0

發(fā)表評論

0條評論

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