Recentemente, estou trabalhando em algumas obras de otimização de sites e começo a usar a divisão de código no webpack usando a instrução import como esta:
import(/* webpackChunkName: 'pageB-chunk' */ './pageB')
Que criar corretamente os PAGEB-chunk.js , agora vamos dizer que eu quero prefetch este pedaço em pageA, eu posso fazer isso por adicionar essa declaração em pageA:
import(/* webpackChunkName: 'pageB-chunk' */ /* webpackPrefetch: true */ './pageB')
O que resultará em uma
<link rel="prefetch" href="pageB-chunk.js">
sendo anexado à cabeça do HTML, o navegador irá buscá-lo até o momento.
O problema é a instrução de importação que eu uso aqui, não apenas pré-busca o arquivo js, mas também avalia o arquivo js, significa que o código desse arquivo js é analisado e compilado com bytecodes, o código de nível superior desse JS é executado.
Esta é uma operação muito demorada em um dispositivo móvel e eu quero otimizá-la, quero apenas a parte de pré - busca , não quero a parte de avaliar e executar , porque mais tarde, quando ocorrerem algumas interações do usuário, acionarei a análise e me avaliar
↑↑↑↑↑↑↑↑ Só quero acionar os dois primeiros passos, as imagens são de https://calendar.perfplanet.com/2011/lazy-evaluation-of-commonjs-modules/ ↑↑↑↑↑↑↑ ↑↑
Claro que posso fazer isso adicionando o link de pré-busca, mas isso significa que eu preciso saber qual URL devo colocar no link de pré-busca. O webpack definitivamente conhece esse URL, como posso obtê-lo no webpack?
O webpack tem alguma maneira fácil de conseguir isso?
fonte
if (false) import(…)
- Duvido que o webpack faça análise de código morto?import
código dinâmico deve ir.Respostas:
ATUALIZAR
Você pode usar o preload-webpack-plugin com o html-webpack-plugin, ele permitirá definir o que pré-carregar na configuração e inserir tags automaticamente para pré-carregar seu bloco
note que se você estiver usando o webpack v4 a partir de agora, precisará instalar este plugin usando
preload-webpack-plugin@next
exemplo
ATUALIZAÇÃO 2
se você não quiser pré-carregar todos os trechos assíncronos, mas apenas específico quando puder fazer isso também
você pode usar o plugin babel do migcoder ou com o
preload-webpack-plugin
seguinteprimeiro você terá que nomear esse pedaço assíncrono com ajuda do
webpack magic comment
exemploe, em seguida, na configuração do plugin, use esse nome como
Primeiro de tudo, vamos ver o comportamento do navegador quando especificamos
script
tag oulink
tag para carregar o scriptscript
tag, ele será carregado, analisado e executado imediatamenteasync
edefer
marcar somente até oDOMContentLoaded
eventolink
)Agora, existem outras maneiras não recomendadas de hackey: você envia todo o script e
string
oucomment
(porque o tempo de avaliação do comentário ou da string é quase insignificante) e quando você precisa executar, pode usarFunction() constructor
oueval
ambos não são recomendadosOutros trabalhadores do serviço de abordagem : (isso preservará seu evento de cache após o recarregamento da página ou o usuário ficará offline após o carregamento do cache)
No navegador moderno, você pode usar
service worker
para buscar e armazenar em cache um recurso (JavaScript, imagem, css, qualquer coisa) e, quando o thread principal solicita esse recurso, você pode interceptar esse pedido e retornar o recurso do cache dessa maneira, para não analisar e avaliar o script quando você está carregando no cache, leia mais sobre profissionais de serviço aquiexemplo
como você pode ver, isso não é uma coisa dependente do webpack , isso está fora do escopo do webpack; no entanto, com a ajuda do webpack, você pode dividir seu pacote, o que ajudará a utilizar melhor o trabalhador do serviço
fonte
Atualizações: eu incluo todas as coisas em um pacote npm, confira! https://www.npmjs.com/package/webpack-prefetcher
Após alguns dias de pesquisa, acabei escrevendo um plug-in babel customizado ...
Em suma, o plugin funciona assim:
Prefetcher é uma classe auxiliar que contém o manifesto da saída do webpack e pode nos ajudar a inserir o link de pré-busca:
Um exemplo de uso:
Os detalhes deste plugin podem ser encontrados aqui:
Pré-busca - Assuma o controle do webpack
Novamente, essa é uma maneira realmente hacky e eu não gosto, se você quiser que a equipe do webpack implemente isso, vote aqui:
Funcionalidade: pré-buscar importação dinâmica sob demanda
fonte
Supondo que eu entenda o que você está tentando alcançar, você deseja analisar e executar um módulo após um determinado evento (por exemplo, clique em um botão). Você pode simplesmente colocar a declaração de importação dentro desse evento:
fonte