entry
指定打包入口
从entry入口文件, 找到依赖的文件 图片, 形成一颗依赖树
单入口 对应单页面, 多入口对应多页面应用
outPut
指定打包输出到磁盘
单入口
多入口输出, 利用占位符name
这样就会生成 app.js 和 search.js
loaders
webpack开箱只支持 js, json类型文件, 像图片 jsx vue 都需要loaders转换成 webpack支持的文件, 才能加到依赖图里面
loadders是一个函数, 参数是源文件, 返回转换结果
比较常用的loaders 有
loaders用法
plugins
插件作用在于bundle的优化, 作用在整个构建过程
常用的plugin
使用
Mode
指定当前的构建环境, production development none
默认是 production , 会开启适合在生产环境的一些参数, 比如不输出console
会开启对应的插件
解析es6 jsx
使用babel-loader 解析es6还要 在.babelrc 文件 配置 preset
-D 是 —save-dev的简称
@babel/preset-env 是转换es6的语法
如果需要 jsx的转换, 在添加 @babel/preset-react
解析css
css-loader 是用来把.css 文件转换成commonjs规范的文件
style-loader 将样式通style标签,把样式放到 head 中, 这样样式在能作用到htm
注意顺序,loader 调用顺序是从右边到左边链式调用的
解析less
解析图片
解析字体文件
url-loader, 其实也内置了 file-loader, 但它可以把图片转换成base64
如果小于10k , 使用base64
webpack对文件的监听
文件修改后,自动重新编译,打包
这种方式需要手动刷新浏览器
监听原理
轮询 文件最后编辑的时间
热更新
自动刷新浏览器
打包好的是放在内存, 所以打包速度更快
—opon 自动开启浏览器
contentBase 监听范围
另一种方式
原理
开始 1 2 a b 文件有变化 1 2 3 4
HMR Server 是服务端,用来将变化的 js 模块通过 websocket 的消息通知给浏览器端。
HMR Runtime是浏览器端,用于接受 HMR Server 传递的模块数据,浏览器端可以看到 .hot-update.json 的文件过来。
HotModuleReplacementPlugin是做什么用的?
webpack 构建出来的 bundle.js 本身是不具备热更新的能力的,HotModuleReplacementPlugin 的作用就是将 HMR runtime 注入到 bundle.js,使得bundle.js可以和HMR server建立websocket的通信连接
文件指纹 缓存 策略
index_24afb3.js
24afb3 这个就是文件指纹, 可以做版本管理, 如果没有变动的文件可以读取缓存数据
contenthash , 修改了js不会影响css的hash, 一般css文件采用contenthash
js使用 chunkhash
css 使用 contenthash, 利用MiniCssExtractPlugin, 把 style-css 的结果提取出来一个独立的文件, 而不是直接放到head中
图片的hash 也是指contentHash 没想到吧
指定配置文件
这里去掉了styleloader
js文件压缩
因为内置了 uglifyjs-webpack-plugin 所以会默认压缩js
css压缩
wp3