Ако търсите начин да подобрите производителността на времето за зареждане на страницата, разделянето на код е лесен, но ефективен начин за това. Има няколко случая на употреба, при които можете да използвате ефективно разделяне на код, но аз ще се съсредоточа върху използването му с рутер от страна на клиента, по-специално с vue.js и vue-router.
Ако имате голямо приложение с една страница, вероятно ще трябва да имате някакъв вид маршрутизиране от страна на клиента, за да организирате приложението си по смислен начин с директни връзки към определени състояния на приложението. С това потребителят може да преминава от страница на страница, без да кликва през куп стъпки.
Казано по-просто, маршрутизирането от страна на клиента взема URL адрес и условно изобразява определен компонент, деклариран в конфигурацията за маршрутизиране.
Въпреки това, в едностранично приложение, всички страници се обединяват в един голям пакет, който се обслужва независимо от страницата, която се разглежда в момента. В малки приложения това няма да има голям ефект, но с нарастването на приложението по-големият пакет започва да оказва влияние върху първоначалното време за зареждане.
За да се борим с това, можем да използваме разделяне на код, за да заредим условно конкретни части от пакета (или, в нашия случай, конкретни страници) въз основа на URL адреса. И добри новини! Vue-router с функцията за динамично импортиране на webpack се справя с всичко вместо нас. Всичко, което трябва да направим, е да актуализираме нашите импортирания на компоненти, за да използваме функцията за динамично импортиране: import(‘…’).
По-долу е даден файл router.js и как обикновено импортирате компоненти и ги присвоявате на конкретен маршрут.
import Vue from 'vue'; import Router from 'vue-router'; // Typical ES6 imports import RpPublishers from './containers/Publishers.vue'; import RpPublisher from './containers/Publisher.vue'; Vue.use(Router); const basePath = '/publishers'; export default new Router({ mode: 'history', routes: [ { path: `${basePath}/:id/edit`, component: RpPublisher }, { path: `${basePath}/new`, component: RpPublisher }, { path: `${basePath}`, component: RpPublishers } ] });
Доста ясно, нищо ново тук. Или Publisher.vue, или Publishers.vue се рендират въз основа на пътя на маршрута. Когато това се компилира, двата файла ще бъдат групирани и обслужвани заедно.
Това обаче не е идеално, тъй като искаме страницата да зарежда само необходимите компоненти. За да направите това, просто използвайте функцията за импортиране вместо командата за импортиране на импортираните компоненти.
import Vue from 'vue'; import Router from 'vue-router'; // Replace the standard import with a function returning the // results from the import function const RpPublishers = () => import('./containers/Publishers.vue'); const RpPublisher = () => import('./containers/Publisher.vue'); Vue.use(Router); const basePath = '/publishers'; export default new Router({ mode: 'history', routes: [ { path: `${basePath}/:id/edit`, component: RpPublisher }, { path: `${basePath}/new`, component: RpPublisher }, { path: `${basePath}`, component: RpPublishers } ] });
Нека разбием какво се случва. Когато приложението се компилира, webpack вижда, че функцията за импортиране се извиква по пътя на файла и създава „част“, която е отделна от основния пакет. Парчетата се инжектират чрез тагове на скрипт, когато са поискани, и по време на изпълнение, когато рутерът попадне на път, съответстващ на маршрутите, vue-router ще открие, че това е асинхронно зареден компонент и ще забави изобразяването на компонента, докато частта на компонента приключи зареждането.
Ето го – асинхронно рендиране на компоненти въз основа на маршрути. Толкова лесно и толкова просто за изпълнение! Vue + VueRouter = ❤.