webpack 4 学习笔记 #64
zhangyu1818
announced in
zh-cn
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
这段时间一来,一直有用 webpack,从之前不知道是干什么用的到现在略知一二,还是有所进步,再对 webpack 的学习做一些知识总结
webpack 是什么
webpack 是一个基于 Node.js 环境的静态资源打包器,能识别 es module、amd、cmd 的引入规则的 js 文件,再配合 loader 可以实现各种类型的文件打包
loader
文件
file-loaderimport avatar from "./avatar.png"url-loader样式
css-loaderoptions-importLoaders:2- 如果 A.scss 引入了 B.scss,那么很有可能 B.scss 不会走 sass-loader 和 postcss-loader 了,那么这个属性可以让引入的文件再走 2 个 loader,loader 的运行顺序是数组倒序 -modules:true- 开启 css 的模块化打包,css modulesstyle-loadersass-loaderpostcss-loaderpostcss.config.js文件 -autoprefixer- 自动给 css 代码加上兼容性前缀mini-css-extract-plugin生产环境适用,因为不能 HMR
如果配置了
Tree Shaking需要修改sideEffects配置
splitChunks将多个 css 打包在一个 css 文件中文档
style-loader同时使用 - 配置optimize-css-assets-webpack-plugin,css 合并和压缩JS
babel-loader- webpack setup -presets-@babel/polyfill将转换 ES6,如果使用@babel/polyfill,会注入全局,污染全局对象 -useBuiltIns配置如何@babel/preset-env处理 polyfill -usage只引入使用的 -target运行环境 -plugins-@babel/plugin-transform-runtime适合做类库的时候使用,会使用闭包的方式进行处理,不会污染全局 -options{ "corejs": 2, // npm install --save @babel/runtime-corejs2 "helpers": true, "regenerator": true, "useESModules": false }plugins
html-webpack-pluginoptions-template- 指定模版生成 html,如 pugclean-webpack-pluginoutput
filename- 文件名,使用占位符,可配置[contenthash]来解决浏览器缓存问题chunkFileName- 代码分割打包的文件的名字path- 打包路径publicPath: - 引入 js 的前缀,如 js 上传到 cdn 就可以加上 cdn 的域名devtool
官方文档
source-map- 打包出的文件和 src 目录下的源文件的映射关系,会创建单独的 map 文件,如打包后出错,对应错误会指向 src 下的源文件,而不会指向打包后的 jsinline-source-map- 打包后不创建 map 文件而是通过 base64 的字符串写入打包后的 js 里inline-cheap-source-mao- 打包后的错误只精确到行,而不精确到第几个字符出的错cheap-module-source-map- 打包后的错误提示不仅仅来源于源文件,也包含第三方模块和 loadereval- 使用 eval 方法执行代码的同时映射 source mapeval、source-map、cheap、module、inline是可以任意组合的development-cheap-module-eval-source-map-production-none或者cheap-module-source-map,来分位置,以;来分行,每个位置有 5 位 - 例如:mappings:"AAAAA,BBBBB;CCCCC"- 表示转换后的源码分成两行,第一行有两个位置,第二行有一个位置。 - 阮一峰 - Source Mapwebpack-dev-server
配置
contentBase- 静态资源文件路径,可以有多个port- 启动的端口proxy- 代理open- 浏览器自动打开hotonly- 不会主动刷新页面Hot Module Replacement
热模块更新
new webpack.HotModuleReplacementPlugin()module.hot.accept- css 不需要手写更新逻辑的原因是css-loader已经配置了Tree Shaking
import "./index.css",那么 Tree Shaking 在检察到模块并没有导出使用,那么就不会打包,这个时候需要配置sideEffects{ // ... "sideEffects": false // 如["@babel-polyfill"]、["*.css"] }Code Splitting
optimization.splitChunks- 同步 - 会自动将引入的第三方库文件单独打包 - 异步 - 异步请求的代码单独拆分 - 需要安装@babel/plugin-syntax-dynamic-import- 打包文件名使用 Magic Comment 修改,如import(/*webpackChunksName:"lodash"*/ lodash)- 默认配置Prefetching/Preloading
在 chrome 浏览器中,可以打开 show coverage 来检测文件的代码覆盖率
如点击事件触发的代码,在点击时才会执行,那么在页面首屏加载的时候,其实不需要加载这些代码的,所以可以使用 code splitting 来做代码分割,异步加载点击后触发的代码,但是响应时间慢会对用户体验不好,可以使用Prefetching/Preloading
prefetchingparent chunk 加载完成后加载,并且不会执行preload和 parent chunk 并行加载,并会执行Shimming
Shimming GlobalsBundle Analysis 打包分析
Bundle Analysis
package.json的script添加webpack --profile --json > stats.json,打包后会生成描述的 json 文件 - 官方分析工具开发环境和生产环境区分
config.js文件,如共有配置webpack.common.js,开发环境webpack.dev.js,生产环境webpack.prod.jswebpack-merge来做配置合并Beta Was this translation helpful? Give feedback.
All reactions