这是我参与「第四届青训营」笔记创作活动的第10天
什么是Webpack
- 背景
- 前端由各种资源文件构成
- 旧时代手动管理资源
- 手动管理资源有过程繁琐、依赖顺序麻烦、开发生产环境无法区分难以应用新特性、难接入
Less和Sass等工具、资源管理模型不一致等各种问题
- 手动管理资源有过程繁琐、依赖顺序麻烦、开发生产环境无法区分难以应用新特性、难接入
- 现在有很多工程化工具,比如
Gulprollup.jsbrowserifyVite等
- Webpack本质上是一种前端资源编译打包工具
- 把非标准JavaScript的文件编译成js的文件
- 多份资源文件打包成一个Bundle
- 支持
BabelEslintTSCoffeScriptLessSass - 实现模块化和一致性
- 支持模块化处理CSS 图片等资源文件,统一了资源文件的管理模型
- 多个文件资源合并成一个,减少http请求数
- 支持模块化开发
- 支持高级JavaScript特性
- 支持TypeScript CoffeeScript等方言
- 支持 HMR + 开发服务器
- 支持持续监听、持续构建
- 支持代码分离
- 支持
Tree-shakingSourceMap等
使用Webpack
- 示例
- npm安装
webpackwebpack-cli - 编写配置文件webpack.config.js
- 执行编译命令npx webpack
- 得到编译打包后的文件
- npm安装
- 核心流程
-
- 入口处理
- 从entry文件开始,启动编译流程
-
- 依赖解析
- 从entry文件开始,根据
require或import语句等找到依赖资源
-
- 资源解析
- 根据module配置,调用资源转移器,将CSS文件 png文件等非标准JS资源转译为JS内容
- 递归调用第二和第三步,直到所有资源处理完毕
- 4.资源合并打包
- 将转译后的资源内容合并打包成可直接在浏览器运行的JavaScript文件
-
- 使用Webpack的两类配置(官方文档)
- 流程类
- 作用于流程中的某个环节或者若干个环节,直接影响打包效果的配置项
- 对应核心流程
- 输入:
entrycontext - 模块解析:
resolveexternals - 模块转译:
module - 后处理:
optimizationmodetarget
- 输入:
- 工具类
- 在主流程之外提供更多工程化能力的配置项
- 开发效率类
watchdevtooldevServer - 性能优化类
cacheperformance - 日志类
statsinfrastructureLogging - 其他
amdbail等
- 流程类
- 示例
// webpack.config.js 示例
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
// 声明第二步的入口文件
entry: "main.js",
// 声明是生产环境(production)还是开发环境(development)
// 如果是生产环境,产物会进行压缩
mode: "development",
devtool: false,
// 声明打包后文件的名称和输出位置
output: {
filename: "bundle.js"
path: path.join(__dirname, './dist')
},
module: {
rules: [
// 处理CSS文件
{
// 过滤条件
test: /\.css$/
// 对符合过滤条件的文件用相应loader处理
use: ['style-loader', 'css-loader']
},
// 用babel处理js文件
{
test: /\.js$/
use: [{
loader: 'babel-loader',
// 传入loader的参数
options: {
// 规则集
presets: [
['@babel/preset-env']
]
}
}]
}
]
},
// 生成html
plugins: [
new HtmlWebpackPlugin()
],
devServer: {
// 开启HMR
hot: true
},
optimization: {
// 开启Tree-Shaking
usedExports: true,
},
}
- 处理CSS
- !npm add -D css-loader style-loader
- 添加module处理CSS文件
- 处理JavaScript - 接入Babel
- Babel本质上是一种代码转译工具
- 一开始是为了把ES6转译成低版本的代码,从而让不支持ES6新特性的浏览器能够运行
- 步骤
- !npm i -D @babel/core @babel/preset-env babel-loader
- 在output声明产物出口
- !npx webpack
- 生成HTML
- 自动化管理资源,省去手动管理烦恼
- 可以在插件配置html的title等
- 步骤
- !npm i -D html-webpack-plugin
- 在output声明产物出口
- !npx webpack
- 工具类
- HMR
- Hot Module Replacement 模块热替换
- 浏览器不需要刷新即可更新代码
- 步骤
devServer.hot: true- !npx webpack serve
- Tree-Shaking
- 删除无用代码
- 对Lodash等工具类库有奇效
- 步骤
- mode设置为
production optimization.usedExports: true
- mode设置为
- 缓存
- SourceMap
- 性能监控
- 日志
- 代码压缩
- 分包
- HMR