Skip to content

Latest commit

 

History

History
47 lines (32 loc) · 3.52 KB

lazy-loading.md

File metadata and controls

47 lines (32 loc) · 3.52 KB

Ленивая загрузка путей

При использовании модульного сборщика, результирующая JavaScript-сборка может оказаться довольно большой, что негативно сказывается на времени загрузки страницы. В некоторых случаях было бы эффективнее разделить компоненты каждого пути на отдельные минисборки, и загружать их только при переходе к соответствующему пути.

Совместное использование асинхронной загрузки компонентов Vue и разделения кода Webpack делает реализацию ленивой загрузки компонентов в зависимости от путей тривиальной.

Во-первых, асинхронный компонент можно определить как функцию-фабрику, которая возвращает Promise (который должен разрешиться самим компонентом):

const Foo = () => Promise.resolve({ /* определение компонента */ })

Во-вторых, в Webpack 2 мы можем использовать синтаксис динамических импортов для указания точек разделения кода:

import('./Foo.vue') // возвращает Promise

Примечание: если вы используете Babel, то нужно будет добавить плагин syntax-dynamic-import, чтобы Babel смог корректно обработать синтаксис.

Эти два пункта — всё необходимое, чтобы определить асинхронный компонент, который Webpack автоматически вынесет в отдельный чанк:

const Foo = () => import('./Foo.vue')

В конфигурации путей ничего менять не нужно, просто используйте Foo как обычно:

const router = new VueRouter({
  routes: [
    { path: '/foo', component: Foo }
  ]
})

Объединение компонентов в единую минисборку

Иногда может понадобиться объединить в единую минисборку все компоненты, расположенные по определённому пути. Для достижения этой цели можно использовать именованные минисборки Webpack, указывая имя используя специальный синтаксис комментариев (в версиях Webpack > 2.4):

const Foo = () => import(/* webpackChunkName: "group-foo" */ './Foo.vue')
const Bar = () => import(/* webpackChunkName: "group-foo" */ './Bar.vue')
const Baz = () => import(/* webpackChunkName: "group-foo" */ './Baz.vue')

Webpack сгруппирует все одноимённые асинхронные модули в единую минисборку.