Wepack

128 阅读4分钟

基础

1.webpack默认只能理解js和json格式的文件
2.打包后识别的顺序从右到左,从下到上
http-server搭设本地服务环境
浏览器不能直接读取require方法,通过引入模块require.js来进行或者使用import形式 Npx 
3.配置:
path模块 path.resolve('基于的路径',‘基于前面写的路径下的路径’) 
new HtmlWebpackPlugin 配置打包后的index.html以及相关的bundle配置 
output->clean:true 清除上次打包的历史index.html 
devtool:"inline-source-map" 将代码报错的地方定位到源代码 而不是打包后的bundle 
npx webpack --watch 时刻监听代码变化并自动打包 
babel-loader @babel-core @babel/preset-env 配套使用
url-loader比file-loader多了base64功能 name:'[hash:10].[ext]' 设定截取前10位![img]()文件扩展符号

rules

1.type:'asset/resource' 
定义generator来定义打包后的文件路径 
{ filename:'images/[contenthash](#)' }
或者在output中定义
assetModuleFilename:'images/[contenthash](#)' generator优先级比assetModuleFilename高
2.  type:'asset/inline' 图片打包出来无法在打包文件夹中看到文件
3.  type:'asset/source' 打包出来的文件无法看到
4.  type:'asset'type:'asset/resource'type:'asset/inline' 之间做自动选择 
默认8k就会创建,可以通过设置来设置对应临界值 parser:{ dataUrlCondition:{ maxSize:4*1024*1024 } }

Pulgins

1.设置模式mode:
2..rules内部可以设定outputPath决定打包文件的位置,属于中加入enforce:'pre',也
表示优先执行,在eslint使用enforce优先于babel执行loader
3.解析html
const HtmlWepackPlugin=require('html-wepack-plugin') 
plugins:[ new HtmlWepackPlugin({ template:'./src/index.html' }) ]
html-loader处理html中图片,使用common.js
url-loader使用的是es6.js
4.设置node.js中环境变量process.env.NODE_ENV=,如果不设置默认为生产环境
5.optimize插件压缩css 
6.代码规则eslint-loader 排除node_modules 
7.babel-loader基本兼容性处理 core-js高级兼容性处理,按需加载 
8.rules中设置每个loader的use是从下往上读取配置 
9.file-loader解决其他资源的配置问题

devServer

devServer 热更新等配置 devServer会把文件放在内存中,所以删除打包文件,打包后代码任然能执行 
devserver自动部署功能,改代码wepack自动部署(命令:npx wepack-dev-server)

代码分离:

1.多入口 多出口 会出现重复打包的情况 
2.多入口 但处理重复的代码 dependOn:'shared' 配置共享的文件单独打包,将共同的文件抽离成单独的chunk 
3.动态导入 新建一个单独文件,处理共享的文件

动态导入的应用

懒加载:使用的是动态导入方法 魔法注释 /*webpackChunkName:'main',* / 
预加载 魔法注释 /*webpackPrefetch:true*/ 
预获取 魔法注释 /*webpackPreload:true*/

防止浏览器缓存

output中设置 filename:‘[name].[contenthash].js//只在生产环境配置

热跟新

热更新/热模块替换/HMR: Wepack-dev-server的功能,devser 中hot设置为true

缓存第三方库

optimization->splitChunks:{ 
cacheGroups:{ 
vendor:{ 
test:/[\/]node_modules[\/]/, name:'vendors', chunks:'all' 
} } }

拆开开发和生产环境

两个环境的公共路径:output->publicpath
环境变量:module.exports可以写为函数module.exports=(env)=>{} //只在生产环境配置 
例如动态修改mode, npx webpack --env production --env goal=local 
然后可以设置mode:env.production --env goal=local 
optimization ->minimizer:[ new CssMinimizerPlugin(), // 压缩css并且可以制定压缩后的文件 
new TerserPlugin(),//压缩代码 ] 
代码压缩只会在生产环境 不会再开发环境压缩
webpack-merge 合并webpack配置 const devWebpackConfig = merge(A,B)

基础webpack流程搭建

搭建webpack环境 
1.npm init 
2.npm install webpack webpack-cli webpack-dev-server html-webpack-plugin -D 
3.创建app.js 和webpack.config.js
const HtmlWebpackPlugin=require('html-webpack-plugin') 
module.exports={ mode:'development', entry:'./app.js', plugins:[ new HtmlWebpackPlugin() ] }

性能优化

  • 针对开发环境
HMR:只打包更新的模块,而不打包所有代码 
devServer中设置hot为true 样
式可以使用HMR,style-loader内部默认使用了 
js默认不能使用HMR,通过判断module.hot来判断模块是否接受HMR, 
html默认不能使用HMR,html文件不能热更新,解决方案:修改entry
devtool:'souce-map' ,source-map调试代码错误
oneOf数组,里面loader只匹配一个loader
  • 生产环境
babel缓存cacheDirectory:true 
文件缓存 文件名后hash值,js,css用同一个hash值,导致可能改变一个地方,所有的缓存都失效了 
chunkhash缓存,如果打包来自同一个chunk,hash值就一样
还是存在同一个hash值问题,如果js中引入css,两者hash值还是一样
contenthash,不同文件生成不同的hash值
tree shaking 打包去掉了多余为运行代码,前提是ES6模块化,开启production环境,sideEffect:false ,

多入口entry多页面应用,单入口spa页面,

wepackChunkName wepackPrefetch:true 预加载
PWA 离线网络也可以访问 加载后注册serviceworker
多进程打包,针对消耗时间比较长的才多进程打包,use 
threa-loader放到某个loader后面运行,写法上在use中该loader前面
externals需要忽略的
dll对某些库单独打包
source-map性能优化
resolve alias文件别名 extension 文件扩展,省略文件路径