Webpack
tip
目标:学会使用 Webpack 进行前端项目的打包和优化。
关键结果:
- 完成 Webpack 的基础学习,包括 Webpack 的安装、配置和使用方法。
- 能够使用 Webpack 进行前端项目的打包和优化,包括代码分割、压缩、模块化等。
- 实践使用 Webpack 进行前端项目的开发,包括搭建开发环境、打包发布等。
- 学习 Webpack 的高级特性,包括插件开发、性能优化等。
- 完成一个基于 Webpack 的前端项目,包括开发、打包、发布等环节。
- splitChunksPlugin、mini-css-extract-plugin、html-webpack-plugin
- Tree shaking
- Dll
- css extract
简介
- 官网:https://webpack.js.org,进入文档从 Guides 模块的 Getting Started 开始看
- 中文文档
webpack 是一个构建工具
构建工具能解决什么问题?
- 混淆代码,提高保密性
- 提高代码兼容性
- 模块整合,减少 http 请求
- 压缩代码体积,提高性能
pnpm add -D webpack webpack-cli
基本概念:
- entry: 使用哪个模块来作为构建的起始入口
- output: 打包后的文件放在哪里、如何命名这些文件
- loader: 处理文件的转换器,用于对模块源码进行转换。
- webpack 自身只能识别 js、json 文件,像 css 、ts 、jsx 等文件都需要通过 loader 解析
- plugin: 扩展 webpack 的功能。比如打包优化、资源管理、注入环境变量等
- mode: 对于不同的环境选择不同的配置
- 开发模式:development
- 生产模式:production
// webpack.config.js
module.exports = {
entry: '',
output: {},
module: {
rules: []
},
plugins: [],
mode: ''
};
mode
对于不同的环境选择不同的配置
- 开发模式:development
- 生产模式:production
- none
开 发模式
这个模式下主要做两件事:
1、编译代码,使浏览器能识别运行
webpack 默认不能处理样式、字体、图像、html 等资源,所以要加载配置来编译这些资源
2、代码质量检查,检查代码规范和格式,统一团队编码风格
生产模式
- 优化代码运行性能
- 优化代码打包速度
环境配置
pnpm add -D webpack webpack-cli webpack-dev-server webpack-merge
- webpack 、webpack-cli:打包必备
- webpack-dev-server:一个提供热更新的开发服务器
- webpack-merge:合并配置文件
在根目录新建 scripts 目录,在里面创建三个配置文件:
webpack.base.js
,公用配置webpack.dev.js
,开发环境配置webpack.prod.js
,生产环境配置
获取环境变量:
pnpm add cross-env -D
配置脚本:
{
"scripts": {
"dev": "cross-env NODE_ENV=development webpack serve -c scripts/webpack.dev.js",
"build": "cross-env NODE_ENV=production webpack -c scripts/webpack.prod.js"
}
}
// webpack.base.js
const path = require('path');
module.exports = {
entry: path.resolve(__dirname, '../src/index.tsx'),
output: {
path: path.resolve(__dirname, '../dist'),
filename: '[name].[hash:8].js'
}
};
// webpack.dev.js
const { merge } = require('webpack-merge');
const base = require('./webpack.base.js');
module.exports = merge(base, {
mode: 'development',
devServer: {
open: true,
port: 8080
}
});
// webpack.prod.js
const { merge } = require('webpack-merge');
const base = require('./webpack.base.js');
module.exports = merge(base, {
mode: 'production'
});
Output
const path = require('path');
module.exports = {
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'assets/js/main.js', // 将 js 文件输出到 assets/js 目录中
clean: true // 自动将上次打包目录资源清空
}
};
Loader
Loader 本质上是一个转换器,将匹配到的文件 中的源码通过转换,使其变成另一种形态。
例如,浏览器不认识 TypeScript 语法,但是可以通过 ts-loader 对其进行转换。从原理上来看,Loader 就是一个函数,参数为需要转换的源代码,返回转换后的新代码。
示例:假如我想在代码里用中文定义变量,浏览器肯定不认识,这时可以写个 loader 去转换,设定的语法格式:变量 name = 'zgh'
function chineseLoader(originCode) {
return originCode.replace(/变量/g, 'let');
}
这里的chineseLoader
就是一个极简单的 Loader。
可以通过传入多个 Loader 以达到链式调用的效果,loader 会从右到左被应用。
Plugin
Loader 和 Plugin 的区别
不同的作⽤:
- Loader 直译为「加载器」。Webpack 将⼀切⽂件视为模块,但是 webpack 原 ⽣是只能解析 js ⽂件,如果想将其他⽂件也打包的话,就会⽤到 loader 。 所以 Loader 的作⽤是让 webpack 拥有了加载和解析⾮ JavaScript ⽂件的能⼒。
- Plugin 直译为"插件"。Plugin 可以扩展 webpack 的功能,让 webpack 具有更多的灵活性。 在 Webpack 运⾏的⽣命周期中会⼴播出许多事件,Plugin 可以监听这些事件,在合适的时机通过 Webpack 提供的 API 改变输出结果。
不同的⽤法:
- Loader 在
module.rules
中配置,作为模块的解析规则⽽存在。类型为数组,每⼀项都是⼀个 Object ,⾥⾯描述了对于什么类型的⽂件( test ),使⽤什么加载( loader )和使⽤的参数( options ) - Plugin 在 plugins 中单独配置。类型为数组,每⼀项是⼀个 plugin 的实例,参数都通过构造函数传⼊。
webpack-dev-server
webpack-dev-server,一个提供热更新的开发服务器
pnpm add -D webpack-dev-server
// webpack.config.js
module.exports = {
mode: 'development',
devServer: {
open: true, // 自动打开浏览器
// host: "localhost", // 服务器域名
port: 8080 // 服务器端口号
}
};
运行指令:
npx webpack serve
在使用开发服务器时,所有代码都在内存中编译打包,并不会输出到 dist 目录下