webpack的特点:
一、有丰富的插件:HotModuleReplacementPlugin(模块热更新插件)、html-webpack-plugin(生成html插件)、clean-webpack-plugin(清理文件)、ProvidePlugin(自动加载模块)、DefinePlugin(定义全局变量)、compression-webpack-plugin(压缩js)、mini-css-extract-plugin(抽取css为独立的文件)
二、通过loader(可支持多种加载规范:es6、commonjs、AMD等):babel-loader(es6语法)、css-loader、style-loader(内联)less-loader、file-loader(图片等文件)、url-loader(转为base64)
三、支持热加载(局部更新)、代码分割、长缓存
代码拆分实现方式(Code Splitting):
1、手动把代码分成多个入口
2、使用插件(commonChunkPlugin)提取公共代码块
3、使用import函数动态引入模块(懒加载)
长缓存优化:
独立打包 vendor(第三方依赖:jquery、vue等)
将hash –> chunkhash(使得文件只随着内容变化,不随着编译变化,[hash]是每次编译都变化一次)
定义动态模块的chunkName
var path = require('path') var webpack = require('webpack') module.exports = { entry:{ main:'./src/foo', vendor:['vue'] //第三方JS代码 }, output:{ path: path.resolve(__dirname,'dist'), filename:'[name].[chunkhash].js' // chunkHash: 打包好的包的hash值 }, plugins:[ // 将打包的包用namequ区分而不用id new webpack.NamedChunksPlugin(), new webpack.NamedModulesPlugin(), // 提取公共代码 new webpack.optimize.CommonsChunkPlugin({ name:'vendor', minChunks:Infinity }), // 提取 webpack runtime new webpack.optimize.CommonsChunkPlugin({ name:'manifest' }) ] }
webpack如何避免发布新的版本有浏览器缓存?
使用 hash,每次构建时会有一个不同 hash 值,避免发布新版本时线上使用浏览器缓存
module.exports = { // ... output: { filename: '[name]-[hash].js'
}, }
但是有时,把打包好的index.html放到服务器里去的时候,index.html在服务器端可能是有缓存的,这需要在服务器配置不让缓存index.html
nginx 配置,让index.html不缓存
location = /index.html { add_header Cache-Control "no-cache, no-store"; } no-cache, no-store可以只设置一个 no-cache浏览器会缓存,但刷新页面或者重新打开时 会请求服务器,服务器可以响应304,如果文件有改动就会响应200 no-store浏览器不缓存,刷新页面需要重新下载页面
提升性能:
1、分离公共模块,实现长缓存。
2、代码压缩,减小体积。
3、cdn加速
4、路由和组件按需加载