webpack
什么是 webpack
模块打包器 == 构建工具
- 将程序员写完的 源代码 ,加工成浏览器可以:高效、稳定运行的,兼容性较好的代码
- webpack 中会将前端的所有资源文件(js/json/css/img/less/…)都作为模块处理
- webpack 根据模块的依赖关系进行分析,生成对应的资源
webpack 原理
五个核心概念
- 【入口(enter)】
- 指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始
- 【输出(output)】
- 在哪里输出文件,以及如何命名这些文件
- 【Loader】
- 处理那些非 JavaScript 文件(webpack 自身只能解析 JavaScript和json)
- 【插件(plugins)】
- 执行范围更广的任务,从打包到优化都可以实现
- 【模式(mode)】
- 有生产模式 production 和 开发模式 development
loader 的理解
- webpack 本身只能处理 JS、JSON 模块,如果要加载其他类型文件(模块),需要使用对应的 loader
- 它本身是一个函数,接受源文件作为参数,返回转换的结果
- loader 一般以 xxx-loader 的方式命名, xxx 代表了这个 loader 要做的转换功能,比如 css-loader
plugins 的理解
- 插件可以完成一些 loader 不能完成的功能
配置文件
- webpack.config.js:用于存储 webpack 配置信息
配置方式
- 初始化项目
- 使用 npm init 或 yarn init 生成 package.json 文件
- 安装 webpack
npm i webpack@4 webpack-cli@3 -g//全局安装作为指令使用npm i webpack@4 webpack-cli@3 -D//本地安装作为本地依赖使用
注意事项
- webpack 版本和 webpack-cli 版本永远相差一个 webpack@4 版本对应 webpack-cli@3 版本,以此类推
- 全局安装之后,最好也局部安装一下,有些错误是因为没有局部安装 webpack 引起的
基础实现
基本配置结构
1 | |
通过命令实现
webpack 入口文件路径 -o 输出文件路径 --mode=development
- –mode
- development(开发模式)
- production(生产模式)
通过配置实现
- 根目录创建 webpack.config.js 文件
- 该文件是 webpack 的配置文件,所有 webpack 的任务、用到的 loader 、plugins 都要配置在这
- 该文件要符合 CJS 模块化规范
- 文件中引入 Node 中一个内置 path 模块,专门用于解决路径问题
- 使用 CJS 模块暴露一个对象,这个对象就是 webpack 的详细配置对象
1 | |
webpack.config.js 配置文件
- 这个文件名是可以随意定义的,只不过定义为 webpack.config.js 调用 webpack命令 时,不需要指定配置文件
- 指定配置文件调用配置项
- 如果放在 config 目录下
webpack --config ./config/webpack.config.js
- 可以为生产环境单独配置一个配置文件,配置 package.json 文件的 scripts 属性定义打包命令
scripts:{build:"webpack --config ./config/webpack.pron.js"}- 调用:
npm run build
loader 配置
- npm 安装相关 loader
- 配置 webpack.config.js
module.exports={...}:暴露 webpack 配置对象module:{...}:模块配置rules:[...]:规则组{...}:规则(多个)test:"/\.css$/":文件匹配规则exclude:"\.(html|css)":排除这些其他的文件,与 test 对立use: ["xxx","yyy","zzz"]:loader (loader 调用顺序从后往前)loader:"...":使用单个 loader,与 use 对立options:{...}:配置 loader 参数
module.rules 中配置一个一个的 规则,每个规则配置需要调用的多个 loader
1 | |
css
css 解析为 js
- 入口文件引入 css 文件
import "../css/demo.css"
- 安装 loader
npm i css-loader -Dnpm i style-loader -D
- wabpack.config.js 文件配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16rules:[
{
test:"/\.css$/", //该规则要处理的文件格式
use:[
"style-loader", // 创建 style 标签,将引入的样式字符串添加到此 style 标签,将标签插入html页面
"css-loader" //将css文件变成 commonjs 模块加载到js中,里面内容是字符串
/*完整写法
{loader: "style-loader"},
{loader: "css-loader"}
*/
]
}
]
less 解析为 js
- 入口文件引入 less 文件
import "../css/demo.less"
- 安装 loader
npm i css-loader -Dnpm i style-loader -Dnpm i less-loader -Dnpm i less -D// 不是 loader 是代码中使用 less 必要的库
- wabpack.config.js 文件配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17rules:[
{
test:"/\.less$/", //该规则要处理的文件格式
use:[
"style-loader", // 创建 style 标签,将引入的样式字符串添加到此 style 标签,将标签插入html页面
"css-loader", //将css文件变成 commonjs 模块加载到js中,里面内容是字符串
"less-loader"
/*完整写法
{loader: "style-loader"},
{loader: "css-loader"}
{loader: "less-loader"}
*/
]
}
]
处理 css 兼容
- 安装 postcss-loader 和 postcss
npm i postcss-loader postcss -D
- 配置 webpack.config.js
- 配置 package.json 添加配置项
1 | |
1 | |
js
js语法检查
- 安装 eslint-loader 和 eslint
npm i eslint-loader eslint -D
- 安装检查库(配置好的规则):eslint-config-airbnb-base 和 eslint-plugin-import
npm i eslint-config-airbnb-base eslint-plugin-import -D
- 配置 webpack.config.js
- 配置 package.json 添加配置项
1 | |
1 | |
ES6 语法转换
- 安装 babel-loader 、***@babel/core、@babel/preset-env***
npm i babel-loader @babel/core @babel/preset-env -D
- 配置 webpack.config.js
1 | |
js 兼容性
- 安装 @babel/polyfill
npm i @babel/polyfill -D
- app.js 中模块引入
import "@babel/polyfill"
图片
解析css样式中图片
功能
- 指定大小的图片转为base64
- 输出图片到指定路径
- 指定加工后图片名字
用法
- 安装 url-loader
npm i url-loader -D
- webpack.config.js 配置
1
2
3
4
5
6
7
8
9
10
11
12
13module:{
rules:[
{
test:"\.(jpg|png|gif)",
loader:"url-loader",
options:{
limit: 8 * 1024, // 小于 8k 的图片会转为 base64
name:"[hash:10].[ext]", // 加工后的图片名字 hash 值的前10位
outputPath:"imgs" // 输出路径下的 imgs 中
}
}
]
}
解析html中的图片
将文件复制到指定目录
- 安装 html-loader
npm i html-loader -D
- webpack.config.js 配置
1
2
3
4
5
6rules:[
{
test:"\.html$",
loader:"html-lader"
}
]
其他资源
将文件复制到指定目录
- 安装 file-loader
npm i file-loader -D
- webpack.config.js 配置
1 | |
plugins 配置
- npm 安装相关 plugin 插件
- webpack.config.js 文件中 CJS 模块语法引入 plugin 插件模块
var xxxPlugin = require(xxx-yyy-plugin)
- 配置 webpack.config.js
module.exports={...}:暴露 webpack 配置对象plugins:[...]:插件组new xxxPlugin():实例化插件- {…} :实例化时传递配置项
plugins 中配置多个 插件对象
1 | |
html
生成html文件
- 安装 html-webpack-plugin 插件
npm i html-webpack-plugin -D
- webpack.config.js 引入插件
require("html-webpack-plugin")
- 插件组配置插件实例
1 | |
css
提取 css 为单文件
- 安装 mini-css-extract-plugin
npm i mini-css-extract-plugin -D
- webpack.config.js 引入插件
const MiniCssExtractPlugin = require("mini-css-extract-plugin")
- 配置 webpack.config.js
- 添加插件实例
- 添加插件实例的loader
1 | |
问题
- 如果定义新建css路径,使用 loader 解析的图片可能引用不到
- 解决:
- output 配置项中,添加 publicPath 属性
- 当部署到服务器,项目地址 和 资源目录地址 可能不同,所以部署到服务器时,publicPath 需要配置为 服务器地址
- 解决:
压缩 css 文件
- 安装 optimize-css-assets-webpack-plugin
npm i optimize-css-assets-webpack-plugin -D
- webpack.config.js 引入插件
const OptimizeCssAssetsPlugin = require("optimize-css-assets-webpack-plugin")
- webpack.config.js 配置插件
1 | |
webpack-dev-server
作用
- webpack 可以配置开发服务器
- 更新代码后,会自动刷新渲染页面,不需要执行命令编译
- 可以开启热模块更新功能
- 更新代码之后,只重新渲染修改部分,其他部分保持不变,不会刷新整个页面
特点
运行命令之后,没有进行打包生成本地文件,而是在 内存 创建类似文件,关闭服务器之后将清除内存中创建的文件
用法
- 下载 webpack-dev-server
- 局部安装有时不起作用,也需要进行全局安装
- 配置 webpack.config.js 文件
- 执行命令
webpack-dev-server
1 | |
常用功能
loader
plugins

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 蚂蚁图书馆!
