# webpack
概念 : webpack 是前端项目工程化的具体解决方案
主要功能:它提供了友好的前端模块化开发支持,以及代码压缩混淆,处理浏览器端 JavaScript 的兼容性,性能优化等强大的功能
# webpack 的基本使用
在项目根目录中,创建名为微博 pack.config.js 的 webpack 配置文件,并初始化如下的基本配置
1
2
3module.exports = {
mode: 'development' //mode 用来指定构建模式, 可选值有development production
}在 package.json 的 script 节点下,新增 dev 脚本如下
1
2
3"scripts:" {
"dev": "webpack" //script 节点下的脚本, 可以通过npm run执行 例如 npm run dev
}在终端运行 npm run dev 命令,启动 webpack 进行项目的打包
# webpack.config.js 文件的作用
webpack.config.js 是 webpack 的配置文件. webpack 在真正开始打包构建之前,会先读取这个配置文件,从而基于给定的配置,对项目进行打包
** 注意 : ** 由于 webpack 是基于 node.js 开发出来的打包工具,因此在它的配置文件中,支持使用 node.js 相关的语法和模块进行 webpack 的个性化设置
# webpack 默认约定
在 webpack 4.x 和 5.x 的版本中,有如下的默认约定
- 默认的打包入口文件为 src -> index.js
- 默认的输出文件路径为 dist -> main.js
** 注意 : ** 可以在 webpack.config.js 中修改打包的默认约定,通过 entry 节点指定打包的入口,output 节点指定打包的出口
1 | const path = require('path') |
# webpack 常用插件与扩展功能
# webpack-dev-server
每当修改了源代码,webpack 会自动进行项目的打包和构建
下载 webpack-dev-server
1
npm i webpack-dev-server -D
修改 package.json -> scripts 的 dev 命令如下 :
1
2
3"scripts": {
"dev": "webpack serve"
}再次运行 npm run dev 命令,重新进行项目的打包
在浏览器中访问 http://localhost:8080 地址,查看自动打包效果
** 注意 : **webpack-dev-server 会启动一个实时打包的 http 服务器
这个插件是不会把新打包的文件写入文件中的,而是储存在内存中,通过一个 http 服务展示出来,script 标签里面应该写服务地址,类似于 :
1 | <script scr="http://localhost:8080/main.js"></script> |
# html-webpack-plugin
webpack 中的 HTML 插件 (类似于一个模板引擎插件)
下载 html-webpack-plugin
1
npm i html-webpack-plugin -D
修改 webpack.config.js 文件
1
2
3
4
5
6
7
8
9
10const HtmlPlugin = require('html-webpack-plugin')
const htmlPlugin = new HtmlPlugin({
template: "./src/index.html",
filename: "./index"
})
module.exports = {
plugins: [htmlPlugin] //通过plugins节点, 使htmlPlugin生效
}
- 通过 HTML 插件复制到项目根目录中的 index.html 页面,也被放到了内存中
- HTML 插件在生成的 index.html 页面,自动注入打包的 js 文件
# devServer 节点
webpack.config.js 配置文件中,可以通过 devServer 节点对 webpack-dev-server 插件进行更多的设置
1 | devServer { |
# loader
在实际开发过程中,webpack 默认只能打包处理以.js 后缀结尾的模块。其他非.js 后缀结尾的模块 webpack 默认处理不了,需要调用 loader 加载器才可以正常打包,否则会报错
loader 加载器的作用 : 协助 webpack 打包处理特定的文件模块
- css-loader 可以打包处理.css 相关的文件
- less-loader 可以打包处理.less 相关的文件
- babel-loader 可以打包处理 webpack 无法处理的高级 js 语法
# 打包处理 css 文件
运行 npn i style-loader css-loader -D, 安装处理 css 文件的 loader
在 webpack.config.js 的 module -> rules 数组中,添加 loader 规则如下 :
1
2
3
4
5
6
7module.exports = {
module: {
rules: [
{test: /\.css$/, use: ['style-loader', 'css-loader']}
]
}
}其中 test 表示匹配的文件类型,use 表示对应要调用的 loader
** 注意 : **
- use 数组中指定的 loader 顺序是固定的
- 多个 loader 的调用顺序是 : 从右往前调用
- webpack 默认只能打包处理.js 结尾的文件,处理不了其它后缀的文件
- 由于代码中包含了 index.css 这个文件,因此 webpack 默认处理不了
- 当 webpack 发现某个文件处理不了的时候,会查找 webpack.config.js 这个配置文件,看 module.rules 数组中,是否配置了对应的 loader 加载器
- webpack 把 index.css 这个文件,先转交给一个 loader 进行处理 (先转交给 css-loader)
- 当 css-loader 处理完毕后,会把处理的结果,转交给下一个 loader (style-loader)
- 当 style-loader 处理完毕后,发现没有下一个 loader 了,于是就把处理的结果转交给 webpack
- webpack 把 style-loader 处理的结果,合并到 /dist/main.js 中,最终生成打包好的文件
# 打包处理 less 文件
运行 npm i less-loader less -D 命令
在 webpack.config.js 的 module -> rules 数组中,添加 loader 规则如下
1
2
3
4
5
6
7module.exports = {
module: {
rules: [
{test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader']}
]
}
}
# 打包处理样式表中与 url 路径相关的文件
运行 npm i url-loader file-loader -D 命令
在 webpack.config.js 的 module -> rules 数组中,添加 loader 规则如下 :
1
2
3
4
5
6
7module.exports = {
module: {
rules: [
{test: /\.jpg|png|gif$/, use: ['url-loader?limit=22229']}
]
}
}
其中?之后的是 loader 的参数项 :
- limit 用来指定图片的大小,单位是字节 (byte)
- 只有 <= limit 大小的图片,才会被转为 base64 格式的图片
# 打包处理 js 文件中的高级语法
webpack 只能打包处理一部分高级的 JavaScript 语法。对于那些 webpack 无法处理的高级 JS 语法,需要借助于 babel-loader 进行打包处理。例如 webpack 无法处理下面的 JavaScript 代码
1 | // 1. 定义了名为info的装饰器 |
在项目根目录下,创建名为 babel.config.js 的配置文件,定义 Babel 的配置如下 :
1 | module.exports = { |
# 配置 webpack 的打包发布
在 webpack.json 文件的 script 节点下,新增 build 命令如下 :
1 | "scripts": { |
—model 是一个参数项,用来指定 webpack 的运行模式. production 代表生产环境,会对打包生成的文件进行代码压缩和性能优化
** 注意 : ** 通过–model 指定的参数想,会覆盖 webpack.config.js 中的 mode 选项
# Source Map
Source Map 就是一个信息文件,里面储存着位置信息。也就是说,Source Map 文件中存储着压缩混淆后的代码,所对应的转换前的位置
有了它,出错的时候,除错工具将直接显示原始代码,而不是转换后的代码,能够极大的方便后期调试
1 | module.exports = { |
在生产环境中,如果只想定位报错的具体行数,且不想暴露源码。此时可以将 devtool 的值设置为 nosources-source-map
- 开发环境下 :
- 建议把 devtool 的值设置为 eval-source-map
- 好处:可以精准定位到具体的错误行
- 生产环境下 :
- 建议关闭 Source Map 或将 devtool 的值设置为 nosources-source-map
- 好处:防止源码泄露,提高网站的安全性
