webpack
timeline title History of webpack 2016 : v1.14.0 2024 : v5.90.3
webpack 建议本地安装,可以在引入重大更新(breaking change)版本时,更容易分别升级项目。通常会通过运行一个或多个 npm scripts
以在本地 node_modules
目录中查找安装的 webpack。
npm v5.2.0 或更高版本,要运行 npx webapck 执行
安装 wepack
1 | npm i webpack webpack-cli webpack-dev-server --save-dev |
- webpack
webpack
的核心文件 - webpack-cli
webpack-cli
webpack 脚本架,命令行工具,用于通过命令行使用 webpack 进行构建和打包前端项目 - webpack-dev-server dev 开发环境进行项目实时预览的服务器
创建测试文件
1 | ├── src |
打包测试
Node 8.2/npm 5.2.0 及以上版本提供的 npx 命令,可以运行在最初安装的 webpack 包中的 webpack 二进制文件(即 ./node_modules/.bin/webpack)
1 | $ npx webapck main.js --mode=development |
生产环境,打包且压缩
1 | $ npx webapck main.js --mode=production |
配置 webpack
mode(模式)
1 | module.exports = { |
entry(入口)
webpack 中有多种方式定义 entry 方式
1 | // node 环境运行,module.exports 属于 commonjs 规范 |
output(输出)
告知 webpack 向硬盘写入编译文件的具体信息,只能有一个 output 配置
1 | module.exports = { |
devServer
配置本地运行环境
1 | // 开发模式下,提供虚拟服务器,用于项目开发和测试 |
HRM —— webpack 设置热更新
模块热替换(HRM - hot module replacement),在程序运行过程中,替换、添加或删除模块,无需加载整个页面。
启动模块热替换功能,在构建失败时不刷新页面作为回退。
热更新 HRM 配置方法一
- package.json 配置
1
"dev": "webpack-dev-server --mode development --hot"
- 入口文件增加
1
2
3if (module.hot) {
module.hot.accept(file)
}
热更新 HRM —— 第二种方式
1 | var webpack = require('webpack') |
热更新——第三种方式
Cannot find module 'webpack-cli/bin/config-yargs'
降低 webpack-cli@3 使用 webpack-dev-server
以上三种方式都没有办法解决,多次修改,浏览器自动刷新修改。都是需要重新启动 webpack
TS2339: Property ‘hot’ does not exist on type ‘NodeModule’. eslint 语法检测问题导致
1 | if ((module as any).hot) { |
ERROR in [eslint] 13:13 error Parsing error: Unexpected token as. eslint 语法检测问题导致
安装依赖包
1 | $ npm i @typescript-eslint/parser @typescript-eslint/eslint-plugin -D |
1 | // .eslintrc.js |
module
webpack 需要处理的模块间的依赖关系包括:
- ES2015 import 语句
- CommonJS require() 语句
- AMD define 和 require 语句
- css/sass/less 文件中的 @import 语句。
- stylesheet url(…) 或者 HTML <img src=…> 文件中的图片链接。
module.rules
创建模块时,匹配请求的规则数组。这些规则能够修改模块的创建方式。这些规则能够对模块应用 loader
注意: rule.test 值是正则,不是字符串正则
1 | module.exports = { |
loader(转换器)
通过 loader 可以使 webpack 支持多种语言和预处理器语法编写的模块
loader 向 webapck 描述了如何处理非原生模块,并将相关依赖引入到 bundles 文件中。
样式转换器
- tyle-loader 将 css 通过创建 style 标签插入 DOM
- css-loader 对 @import 和 url() 进行处理,将 css 资源编译成 commonjs 的模块到 js 中
- stylus-loader / less-loader / sass-loader 都是 css 预处理器,任选其一,scss 稍有不同,以 sass 为例Module not found: Error: Can’t resolve ‘style-loader!css-loader’
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18...
module: {
rules: [
{
test: /\.css$/,
/**
* style-loader 将 css 插入 DOM
* css-loader 对 @import 和 url() 进行处理
*/
use: ['style-loader', 'css-loader']
},
{
test: /\.s[ac]ss$/,
use: ['style-loader', 'css-loader', 'sass-loader']
}
]
}
...
加载器解析顺序从右到左,从下到上
关于 —— bable 通过 loader 实现 import 导入任何类型模块,如 .jsx/.css/.less 等
npm i @babel/core @babel/preset-env @babel/preset-react babel-loader -D
* @babel/core 是调用 babel 的 API 进行转码的包
* babel-loader 执行转义的核心包
* babel-preset-env 一个新的 preset,根据配置目标运行环境启用需要的 babel 插件
* babel-preset-react 用于转义 react 的 JSX 语法
1 | // webpack.config.js |
配置相应内容,告诉 babel-loader 使用 ES6 和 JSX 插件
1
2
3
4// .babelrc
{
"presets": ['env', 'react']
}
plugins(插件)
clean-webpack-plugin
webapck4 clean-webpack-plugin 删除 build 或 dist 下的文件,生新的文件
使用方式不同版本各有不同,建议参考文档
1 | // webpack.config.js |
注意:webpack5 不需要使用 clean-wepack-plugin 插件,只需要做如下配置即可
1 | ... |
fork-ts-checker-webpack-plugin
Webapck plugin that runs TypeScript type checker on a separate process.
独立进程上运行 TypeScript type checker 的 webpack 插件。
Optimization 优化
根据选择的 mode
执行不同的优化,所有优化必须手动配置和重写。
optimization.minimizer
通过提供一个或多个定制过的 TerserPlugin,覆盖默认压缩工具(minimizer)
Error
Cannot find module ‘webpack-cli/bin/config-yargs’
code: ‘MODULE_NOT_FOUND’
webpack-dev-server –open –mode development
“webpack-cli”: “^4.6.0”
降版本,将 webpack-cli 版本降至 3
1 | $ npm i webpack-cli@3 -D --force |
解析-resolve
配置模块如何解析
1 | // webpack.dev.config.js |
Module not found: Error: Can’t resolve ‘os’ in ‘/Users/zhangliping/Documents/Project/webpack/src’ ts 文件中获取 os 模块失败
1 | // webpack.dev.config.js |