webpack 的官方定义是个模块打包机,静态模块打包工具(编译成静态资源)。
- 代码转换:ES6 或 TypeScript 编译成 JavaScript、SCSS 编译成 CSS 等。
- 文件优化:压缩 JavaScript、CSS、HTML 代码,压缩合并图片等。
- 代码分割:提取多个页面的公共代码、提取首屏不需要执行部分的代码让其异步加载。
- 模块合并:在采用模块化的项目里会有很多个模块和文件,需要构建功能把模块分类合并成一个文件。
- 自动刷新:监听本地源代码的变化,自动重新构建、刷新浏览器。
- 代码校验:在代码被提交到仓库前需要校验代码是否符合规范,以及单元测试是否通过。
- 自动发布:更新完代码后,自动构建出线上发布代码并传输给发布系统。
- copy-webpack-plugin,拷贝静态文件
- HtmlWebpackPlugin
- WebpackMerge
合并 webpack 配置
- HardSourcePlugin
- babel
- "@babel/runtime"
- "@babel/preset-typescript"
- "@babel/preset-react"
- "@babel/preset-env"
- "@babel/plugin-transform-runtime"
- "@babel/plugin-proposal-decorators"
- @babel/plugin-proposal-class-properties
- @babel/core
- postcss-loader
- webpack 默认以生产模式,src/index.tsx 作为入口,编译至 dist/main.js
- 默认 mode 为开发
development
模式和生产production
模式。 - 通常 webpack 需要自定义配置,在项目根目录下建
webpakc.config.js
,webpack 会自动识别和读取。 - module 可以接收
String,Array,Object
三种类型写法
https://segmentfault.com/a/1190000021952886
purgecss-webpack-plugin
使用
image-webpack-loader
插件压缩图片大小
add-asset-html-cdn-webpack-plugin
webpack4 中已自带
Tree-shaking
,在生产模式中将自动开启,要注意副作用的影响,可以手动指定在 package.json 中sideEffects
。同时 CSS 样式要使用 require()语法,或者在 sideEffects 中指定文件。
在开发环境中,相当于把公共部门抽离出来避免重复打包,通用
manifest.json
代理的形式,先查找缓存。
将生成的 manifest.json 文件映射到 html 中
使用 import()语法
webpack-bundle-analyzer
不解释指定模块
解析分包
speed-measure-webpack-plugin
-
DLLPlugin 动态链接库
-
生产环境分享静态库
-
hot module replacement
-
利用 happypack 调用多进程打包
-
使用 purgecss-webpack-plugin 去除未引用的 CSS 样式
- purgecss-webpack-plugin
webpack output is served from /
,默认 webpack-dev-server 执行后会在项目根目录下建立文件。- 需要同时安装 webpack, webpack-cli,
npm i webpack webpack-cli -D
与npm i webpack webpack-cli -g
- webpack 配置文件默认叫
webpack.config.js或webpack.file.js
,但常用前者。 - 依赖前面带@符表示为作用域,比如
@babel
- loader 顺序,是从右到左
- css 文件中引 scss,需要设置 css-loader 参数 options
- compiler
- optimization 优化项
- 默认生产模式会压缩 js 文件,但配置 optimization 使用 css 相关压缩插件后,JS 也需引入对应插件
- babel 包与 typescript
- webpack.config 配置报错不会指出具体项,只能提供基本提示。
.browserslist
文件 babel 与 postcss 通用
- Error: EINVAL: invalid argument, read
- core-js 版本号问题
- preset-typescript 与 ts-loader 之间是何关系?
- webpack-typescript-module-hot-does-not-exist
- Vue 项目中引入 purgecss-webpack-plugin 无效