1. O que é divisão de código?
Ao usar o Webpack no início, todos os arquivos js foram empacotados em um build.js
arquivo (o nome do arquivo depende do webpack.config.js
arquivo output.filename
), mas em projetos grandes, ele build.js
pode ser muito grande, resultando em um tempo de carregamento de página muito longo. é necessário code splitting
, code splitting
é dividir o arquivo em blocos (chunk)
, podemos definir o ponto de divisão (split point)
, o arquivo é dividido em blocos de acordo com o ponto de divisão, e conseguir o carregamento sob demanda.
2. O que a divisão de código faz?
- A biblioteca de classes de terceiros é empacotada separadamente:
como o conteúdo da biblioteca de classes de terceiros basicamente não muda, ela pode ser separada do código de negócios, de modo que o mecanismo de cache do navegador pode ser maximizado para reduzir as solicitações. - Carregamento sob demanda: o
Webpack suporta a definição de pontos de divisão por meiorequire.ensure
de carregamento sob demanda.
3. Como realizar a divisão de código?
O código a seguir é um documento de apresentação gerada com base vue-cli
no webpack-simple
template
//cmd
vue init webpack-simple code_spliting_demo
(1) A biblioteca de terceiros é embalada separadamente
Presumimos que a jquery.js
soma é introduzida no projeto respond.js
, então podemos webpack.config.js
configurar várias entradas nele para empacotar essas duas bibliotecas de terceiros separadamente.
-
Em
webpack.config.js
configurar//webpack.config.js //在entry中添加相应第三方类库 entry: { bundle: './src/main.js', vendor: ['./src/lib/jquery-1.10.2.min.js', './src/lib/respond.min.js'] } //在plugins中添加CommonChunkPlugin plugins:[ new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', filename: 'vendor.bundle.js' }) ]
-
Execute
npm run build
, neste momento,dist
dois arquivos são gerados no diretório, a saberbuild.js
evendor.bundle.js
Arquivos gerados após npm executar compilação
-
index.html
Introduzido em, Nota: Antesvendor.bundle.js
dabuild.js
introdução//index.html <script src="/dist/vendor.bundle.js"></script> <script src="/dist/build.js"></script>
(2) Carregar sob demanda
Podemos router
configurá-lo para implementar o carregamento sob demanda de componentes. Quando alguns arquivos de um único componente são grandes, use o carregamento sob demanda para reduzir build.js
o volume e otimizar a velocidade de carregamento (se o tamanho do componente for pequeno, usar o carregamento sob demanda Adicionar extra http请求
, pelo contrário, aumenta o tempo de carregamento)
-
Aqui, acrescentamos três componentes, ou seja
A.vue
,B.vue
,C.vue
//A.vue <template> <h1>这里是A.vue组件</h1> </template> //B.vue <template> <h1>这里是B.vue组件</h1> </template> //C.vue <template> <h1>这里是C.vue组件</h1> </template>
-
Configure no roteiro (nota: aqui é por conveniência, é
app.js
o roteiro adicionado, no projeto real, o roteiro deve ser extraído separadamente)//app.js import Vue from 'vue' import App from './App.vue' import VueRouter from 'vue-router' Vue.use(VueRouter) //AMD规范的异步载入 const ComA = resolve => require(['./components/A.vue' ], resolve); const ComB = resolve => require(['./components/B.vue' ], resolve); const ComC = resolve => require(['./components/C.vue' ], resolve); const router = new VueRouter({ routes: [ { name: 'component-A', path: '/a', component: ComA }, { name: 'component-B', path: '/b', component: ComB }, { name: 'component-C', path: '/c', component: ComC } ] }) new Vue({ el: '#app', router: router, render: h => h(App) })
-
Na
webpack.config.js
configuração deoutput.chunkFilename
,
//webpack.config.js
output: {
path: path.resolve(__dirname, './dist'),
publicPath: '/dist/',
filename: 'build.js',
//添加chundkFilename
chunkFilename: '[name].[chunkhash:5].chunk.js'
}
-
Execução
npm run build
, desta vezdist
o arquivo de diretório criado sob a cinco, o extra três arquivos que correspondem aoA.vue
,B.vue
,C.vue
estes três componentesArquivos gerados após o npm executar a compilação
Carregamento assíncrono da especificação CMD
Apenas quando o roteamento foi introduzido usando AMD规范
carregamento assíncrono. webpack
Fornece require.ensure()
o método para atingir o CMD规范
carregamento assíncrono. Esta também é webpack
a maneira recomendada de carregar. Quer saber mais ensure
, clique em "webpack garantir separação parecia ainda não entendo o código ,Você me acertou"
- O código a seguir é para usar o
require.ensure()
método para configurar o roteamento
//app.js
import Vue from 'vue'
import App from './App.vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
//AMD风格的异步加载
// const ComA = resolve => require(['./components/A.vue' ], resolve);
// const ComB = resolve => require(['./components/B.vue' ], resolve);
// const ComC = resolve => require(['./components/C.vue' ], resolve);
//CMD风格的异步加载
const ComA = resolve => require.ensure([], () => resolve(require('./components/A.vue')));
const ComB = resolve => require.ensure([], () => resolve(require('./components/B.vue')));
const ComC = resolve => require.ensure([], () => resolve(require('./components/C.vue')));
const router = new VueRouter({
routes: [
{
name: 'component-A',
path: '/a',
component: ComA
},
{
name: 'component-B',
path: '/b',
component: ComB
},
{
name: 'component-C',
path: '/c',
component: ComC
}
]
})
new Vue({
el: '#app',
router: router,
render: h => h(App)
})
- Após a execução
npm run build
,dist
5 arquivos também são gerados no diretórioArquivos gerados após o npm executar a compilação
- Carregando demonstração de efeito sob demanda:
Carregar demonstração de efeito sob demanda
Autor: Tong Li Hui
link: https: //www.jianshu.com/p/b3b8fb8a2336
Fonte: Os livros de Jane
são de propriedade do autor. Para reimpressões comerciais, entre em contato com o autor para autorização. Para reimpressões não comerciais, indique a fonte.