webpack基础

webpack基础
cgd1. 安装
1 | npm install webpack webpack-cli -D |
webpack-cli 不是必须的,是用来加载 webpack.config.js 的配置文件,你完全可以自己创建一个 cli 来加载,例如 vue 使用的就是 vue-cli
2. 配置浏览器兼容性
2.1 默认配置
如果不配置 Browserslist 那么就会使用默认的配置( > 0.5%, last 2 versions, Firefox ESR, not dead )
- > 0.5% 为浏览器的市场占有率大于 0.5%,在https://caniuse.com/usage-table可以查询
- last 2 versions 为每个浏览器的最后 2 个版本
- not dead 为 24 个月内官方支持更新的浏览器
2.2 手动配置
1.在 package.json 配置
1 | "browserslistrc": [ |
2.在.browserslistrc 配置
1 | >1% |
3. webpack 的配置文件的使用
3.1 修改打包的入口和出口文件
webpack 打包时默认打包的是 src 下的 index.js,打包完成在 dist 文件夹生成 main.js 为打包好的文件,如果需要修改打包的入口和出口文件,则需要在 webpack.config.js 配置
1 | const path = require("path"); |
3.2 修改配置文件的名称
webpack 打包时默认寻找的是 webpack.config.js 的配置,如果需要更改配置文件的名称则需要修改执行 webpack 的命令
1 | "scripts": { |
3.3 加载 css 和 less
- 安装 css-loader
1 | npm install css-loader -D |
- 安装 style-loader
1 | npm install style-loader -D |
- 安装 less 以及 less-loader
1 | npm install less less-loader -D |
- 在配置文件中配置 loader
1 | module.exports = { |
3.4 使用 PotsCss 工具
- PostCSS 是一个通过 JavaScript 来转换样式的工具;
- 这个工具可以帮助我们进行一些 CSS 的转换和适配,比如自动添加浏览器前缀、css 样式的重置;
- 但是实现这些工具,我们需要借助于 PostCSS 对应的插件
安装 postcss 和 postcss-loader
1 | npm install postcss postcss-loader -D |
3.4.1 使用 autoprefixer 插件
- 安装 autoprefixer 来添加浏览器前缀
1 | npm install autoprefixer -D |
- 在 webapck.config.js 中配置
1 | module.exports = { |
3.4.2 使用 postcss-preset-env 插件
- postcss-preset-env 也是一个 postcss 的插件;
- 它可以帮助我们将一些现代的 CSS 特性,转成大多数浏览器认识的 CSS,并且会根据目标浏览器或者运行时环 境添加所需的 polyfill;
- 也包括会自动帮助我们添加浏览器前缀(所以相当于已经内置了 autoprefixer);
- 安装
1 | npm install postcss-preset-env -D |
- 方式一: 在 webapck.config.js 中配置
1 | module.exports = { |
方式二: 新建 postcss.config.js
1 | module.exports = { |
在 webapck.config.js 中配置
1 | module.exports = { |
==注意==: 如果在一个 css 文件中使用@import 引入另一个 css 那么引入的 css 不会通过 postcss-loader 的解析,需要添加 css-loader 的配置才行
1 | module.exports = { |
3.5 加载 img 图片
在 webapck.config.js 中配置
1 | module.exports = { |
4. Plugin 的使用
4.1 CleanWebpackPlugin
每次修改了一些配置,重新打包时,都需要手动删除 dist 文件夹
我们可以借助于一个插件来帮助我们完成,这个插件就是 CleanWebpackPlugin
1.安装
1 | npm install clean-webpack-plugin -D |
2.在 webapck.config.js 中配置
1 | const { CleanWebpackPlugin } = require("clean-webpack-plugin"); |
4.2 HtmlWebpackPlugin
- 我们的 HTML 文件是编写在根目录下的,而最终打包的 dist 文件夹中是没有 index.html 文件的。
- 在进行项目部署的时,必然也是需要有对应的入口文件 index.html;
- 所以我们也需要对 index.html 进行打包处理
- 对 HTML 进行打包处理我们可以使用另外一个插件:HtmlWebpackPlugin;
- 安装
1 | npm install html-webpack-plugin -D |
- 在 webapck.config.js 中配置
1 | const HtmlWebpackPlugin = require('html-webpack-plugin') |
3.自定义 html 模板
index.html
1 |
|
webapck.config.js
1 | const HtmlWebpackPlugin = require("html-webpack-plugin"); |
上述代码在编译过程中还会报错,因为 BASE_URL 找不到,所以需要一个插件 DefinePlugin 来定义全局的 BASE_URL。
4.3 DefinePlugin
DefinePlugin 允许在编译时创建配置的全局常量,是一个 webpack 内置的插件(不需要单独安装)
1 | const { DefinePlugin } = require("webpack"); |
这样全局就会有一个 BASE_URL 常量,但是 favicon.ico 因为没有在依赖图中,所以我们需要一个插件 CopyWebpackPlugin 将 public 中除了 index.html 之外的其他文件复制到 dist 文件夹中
4.4 CopyWebpackPlugin
- 安装
1 | npm install copy-webpack-plugin -D |
- 在 webapck.config.js 中配置
- 复制的规则在 patterns 中设置;
- from:设置从哪一个源中开始复制;
- to:复制到的位置,可以省略,会默认复制到打包的目录下;
- globOptions:设置一些额外的选项,其中可以编写需要忽略的文件
1 | const CopyWebpackPlugin = require('copy-webpack-plugin') |
5. resolve 模块
5.1extensions
1 | module.exports = { |
能够使用户在引入模块时不带后缀名
1 | import File from "../path/to/file"; |
5.2 alias
配置路径别名
1 | const path = require('path'); |
6. 搭建本地服务器
6.1 watch 模式
webpack 给我们提供了 watch 模式:
在该模式下,webpack 依赖图中的所有文件,只要有一个发生了更新,那么代码将被重新编译;
我们不需要手动去运行 npm run build 指令了
如何开启 watch 呢?两种方式:
方式一:在导出的配置中,添加 watch: true;
方式二:在启动 webpack 的命令中,添加 –watch 的标识;
方式一 webpack.config.js
1 | module.exports = { |
方式二 package.json
1 | "scripts": { |
6.2 webpack-dev-server
安装
1 | npm install webpack-dev-server -D |
在 package.json 配置
1 | "scripts": { |
6.3 HMR
什么是 HMR 呢?
- HMR 的全称是 Hot Module Replacement,翻译为模块热替换;
- 模块热替换是指在 应用程序运行过程中,替换、添加、删除模块,而无需重新刷新整个页面;
HMR 通过如下几种方式,来提高开发的速度:
不重新加载整个页面,这样可以保留某些应用程序的状态不丢失;
只更新需要变化的内容,节省开发的时间;
修改了 css、js 源代码,会立即在浏览器更新,相当于直接在浏览器的 devtools 中直接修改样式;
如何使用 HMR 呢?
- 默认情况下,webpack-dev-server 已经支持 HMR,我们只需要开启即可;
- 在不开启 HMR 的情况下,当我们修改了源代码之后,整个页面会自动刷新,使用的是 live reloading;
开启 HMR
修改 webpack 的配置:
1 | devServer: { |
在 入口文件指定哪一个模块开启 HMR
1 | if (module.hot) { |
devServer 的其他常见配置
1 | module.exports = { |