Skip to content
On this page

Rotas de Carregamento Preguiçoso

Quando estiveres a construir aplicações com um empacotador, o pacote de JavaScript pode tornar-se muito grande, e assim afetar o tempo do carregamento da página. Seria mais eficiente se pudéssemos separar cada componente de rota em pedaços separados, e somente carregá-los quando a rota for visitada.

A Vue Router suporta importações dinâmicas fora da caixa, querendo dizer que podes substituir aquelas importações estáticas pelas importações dinâmicas:

js
// substitua
// import UserDetails from './views/UserDetails'
// por
const UserDetails = () => import('./views/UserDetails.vue')

const router = createRouter({
  // ...
  routes: [{ path: '/users/:id', component: UserDetails }],
})
// substitua
// import UserDetails from './views/UserDetails'
// por
const UserDetails = () => import('./views/UserDetails.vue')

const router = createRouter({
  // ...
  routes: [{ path: '/users/:id', component: UserDetails }],
})

A opção component (e components) aceitam uma função que retorna uma promessa de um componente e a Vue Router irá apenas buscá-lo quando estiver para apresentar a página pela primeira vez, depois usa a versão armazenada para consulta imediata. O que significa que também podes ter funções mais complexas enquanto elas retornarem uma promessa:

js
const UserDetails = () =>
  Promise.resolve({
    /* definição do componente */
  })
const UserDetails = () =>
  Promise.resolve({
    /* definição do componente */
  })

Em geral, é uma boa ideia sempre usar importações dinâmicas para todas as tuas rotas.

Nota

Não usar componentes Assíncronos para as rotas. Os componentes assíncronos podem continuar a ser usados dentro dos componentes de rota mas os mesmos componentes de rota são apenas importações dinâmicas.

Quando estiveres a usar um empacotador como o Webpack, este se beneficiará automaticamente da separação de código.

Quando estiveres a usar o Babel, precisarás de adicionar a extensão syntax-dynamic-import para o Babel poder analisar a sintaxe apropriadamente.

Agrupar Componentes no Mesmo Pedaço

Com a Webpack

Algumas vezes podemos querer agrupar todos os componentes encaixados sob a mesma rota no mesmo pedaço assíncrono. Para alcançar isto precisamos usar pedaços nomeados fornecendo um nome de pedaço usando uma sintaxe especial de comentário (exige versão de webpack > 2.4):

js
const UserDetails = () =>
  import(/* webpackChunkName: "group-user" */ './UserDetails.vue')
const UserDashboard = () =>
  import(/* webpackChunkName: "group-user" */ './UserDashboard.vue')
const UserProfileEdit = () =>
  import(/* webpackChunkName: "group-user" */ './UserProfileEdit.vue')
const UserDetails = () =>
  import(/* webpackChunkName: "group-user" */ './UserDetails.vue')
const UserDashboard = () =>
  import(/* webpackChunkName: "group-user" */ './UserDashboard.vue')
const UserProfileEdit = () =>
  import(/* webpackChunkName: "group-user" */ './UserProfileEdit.vue')

O Webpack agrupará qualquer módulo assíncrono com o mesmo nome de pedaço no mesmo pedaço assíncrono.

Com a Vite

Na Vite podes definir os pedaços sob a rollupOptions:

js
// vite.config.js
export default defineConfig({
  build: {
    rollupOptions: {
      // https://rollupjs.org/guide/en/#outputmanualchunks
      output: {
        manualChunks: {
          'group-user': [
            './src/UserDetails',
            './src/UserDashboard',
            './src/UserProfileEdit',
          ],
        },
    },
  },
})
// vite.config.js
export default defineConfig({
  build: {
    rollupOptions: {
      // https://rollupjs.org/guide/en/#outputmanualchunks
      output: {
        manualChunks: {
          'group-user': [
            './src/UserDetails',
            './src/UserDashboard',
            './src/UserProfileEdit',
          ],
        },
    },
  },
})

Lançado sob a licença MIT.