webpack开发模式配置
开发模式
开发模式顾名思义就是开发代码时使用的模式。
这个模式下主要做两件事:
编译代码,使浏览器能识别运行
开发时有样式资源、字体图标、图片资源、html 资源等,webpack 默认都不能处理这些资源,所以要加载配置来编译这些资源
代码质量检查,树立代码规范
提前检查代码的一些隐患,让代码运行时能更加健壮。
提前检查代码规范和格式,统一团队编码风格,让代码更优雅美观。
基本配置
1 | // config/webpack.dev.js |
处理样式资源
Webpack 本身是不能识别样式资源的,所以我们需要借助 Loader 来帮助 Webpack 解析样式资源
我们找 Loader 都应该去官方文档中找到对应的 Loader,然后使用
官方文档找不到的话,可以从社区 Github 中搜索查询
处理 Css 资源
1. 下载包
1 | npm i css-loader style-loader -D |
2. 功能介绍
css-loader
:负责将 Css 文件编译成 Webpack 能识别的模块css-loader
会对@import
和url()
进行处理,就像 js 解析import/require()
一样。style-loader
:会动态创建一个 Style 标签,里面放置 Webpack 中 Css 模块内容,把 CSS 插入到 DOM 中。
此时样式就会以 Style 标签的形式在页面上生效
3. 配置
1 | module.exports = { |
处理 Less 资源
1. 下载包
1 | npm i less-loader -D |
2. 功能介绍
less-loader
:负责将 Less 文件编译成 Css 文件
3. 配置
1 | module.exports = { |
处理 Sass 和 Scss 资源
1. 下载包
1 | npm i sass-loader sass -D |
2. 功能介绍
sass-loader
:负责将 Sass 文件编译成 css 文件sass
:sass-loader
依赖sass
进行编译
3. 配置
1 | module.exports = { |
处理 Styl 资源
1. 下载包
1 | npm i stylus-loader -D |
2. 功能介绍
stylus-loader
:负责将 Styl 文件编译成 Css 文件
3. 配置
1 | module.exports = { |
处理图片资源
过去在 Webpack4 时,我们处理图片资源通过 file-loader
和 url-loader
进行处理
现在 Webpack5 已经将两个 Loader 功能内置到 Webpack 里了,我们只需要简单配置即可处理图片资源
配置
1 | module.exports = { |
对图片资源进行优化
将小于某个大小的图片转化成 data URI 形式(Base64 格式)
1 | const path = require("path"); |
- 优点:减少请求数量
- 缺点:体积变得更大
此时输出的图片文件就只有两张,有一张图片以 data URI 形式内置到 js 中了 (注意:需要将上次打包生成的文件清空,再重新打包才有效果)
处理字体图标资源
1 | module.exports = { |
type: "asset/resource"
和type: "asset"
的区别:
type: "asset/resource"
相当于file-loader
, 将文件转化成 Webpack 能识别的资源,其他不做处理type: "asset"
相当于url-loader
, 将文件转化成 Webpack 能识别的资源,同时小于某个大小的资源会处理成 data URI 形式
处理其他资源
开发中可能还存在一些其他资源,如音视频等,我们也一起处理了
1 | module.exports = { |
处理 js 资源
Webpack 对 js 处理是有限的,只能编译 js 中 ES 模块化语法,不能编译其他语法,导致 js 不能在 IE 等浏览器运行,所以我们希望做一些兼容性处理。
其次开发中,团队对代码格式是有严格要求的,我们不能由肉眼去检测代码格式,需要使用专业的工具来检测。
- 针对 js 兼容性处理,我们使用 Babel 来完成
- 针对代码格式,我们使用 Eslint 来完成
我们先完成 Eslint,检测代码格式无误后,在由 Babel 做代码兼容性处理
Eslint
可组装的 JavaScript 和 JSX 检查工具。
这句话意思就是:它是用来检测 js 和 jsx 语法的工具,可以配置各项功能
我们使用 Eslint,关键是写 Eslint 配置文件,里面写上各种 rules 规则,将来运行 Eslint 时就会以写的规则对代码进行检查
1. 配置文件
配置文件由很多种写法:
- .eslintrc.* :新建文件,位于项目根目录
.eslintrc
.eslintrc.js
.eslintrc.json
- 区别在于配置格式不一样
package.json
中eslintConfig
:不需要创建文件,在原有文件基础上写
ESLint 会查找和自动读取它们,所以以上配置文件只需要存在一个即可
2. 具体配置
以 .eslintrc.js
配置文件为例:
1 | module.exports = { |
- parserOptions 解析选项(参考)
1 | parserOptions: { |
- rules 具体规则(参考)
"off"
或0
- 关闭规则"warn"
或1
- 开启规则,使用警告级别的错误:warn
(不会导致程序退出)"error"
或2
- 开启规则,使用错误级别的错误:error
(当被触发的时候,程序会退出)
1 | rules: { |
更多规则详见:规则文档
- extends 继承
开发中一点点写 rules 规则太费劲了,所以有更好的办法,继承现有的规则。
现有以下较为有名的规则:
- Eslint 官方的规则open in new window:
eslint:recommended
- Vue Cli 官方的规则open in new window:
plugin:vue/essential
- React Cli 官方的规则open in new window:
react-app
1 | // 例如在React项目中,我们可以这样写配置 |
3. 在 Webpack 中使用
- 下载包
1 | npm i eslint-webpack-plugin eslint -D |
- 定义 Eslint 配置文件
- .eslintrc.js
1 | module.exports = { |
- 配置
- webpack.config.js
1 | const ESLintWebpackPlugin = require("eslint-webpack-plugin"); |
4. VSCode Eslint 插件
打开 VSCode,下载 Eslint 插件,即可不用编译就能看到错误,可以提前解决
但是此时就会对项目所有文件默认进行 Eslint 检查了,我们 dist 目录下的打包后文件就会报错。但是我们只需要检查 src 下面的文件,不需要检查 dist 下面的文件。
所以可以使用 Eslint 忽略文件解决。在项目根目录新建下面文件:
.eslintignore
1 | # 忽略dist目录下所有文件 |
Babel
JavaScript 编译器。
主要用于将 ES6 语法编写的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中
1. 配置文件
配置文件由很多种写法:
- babel.config.* :新建文件,位于项目根目录
babel.config.js
babel.config.json
- 区别在于配置格式不一样
- .babelrc.* :新建文件,位于项目根目录
.babelrc
.babelrc.js
.babelrc.json
- 区别在于配置格式不一样
package.json
中babel
:不需要创建文件,在原有文件基础上写
Babel 会查找和自动读取它们,所以以上配置文件只需要存在一个即可
2. 具体配置
以 babel.config.js
配置文件为例:
1 | module.exports = { |
presets 预设
简单理解:就是一组 Babel 插件, 扩展 Babel 功能
@babel/preset-env
: 一个智能预设,允许您使用最新的 JavaScript。@babel/preset-react
:一个用来编译 React jsx 语法的预设@babel/preset-typescript
:一个用来编译 TypeScript 语法的预设
3. 在 Webpack 中使用
- 下载包
1 | npm i babel-loader @babel/core @babel/preset-env -D |
- 定义 Babel 配置文件
- babel.config.js
1 | module.exports = { |
- 配置
- webpack.config.js
1 | module.exports = { |
处理 Html 资源
1. 下载包
1 | npm i html-webpack-plugin -D |
2. 配置
- webpack.config.js
1 | const HtmlWebpackPlugin = require("html-webpack-plugin"); |
开发服务器&自动化
每次写完代码都需要手动输入指令才能编译代码,太麻烦了,我们希望一切自动化
并且当你使用开发服务器时,所有代码都会在内存中编译打包,并不会输出到 dist 目录下。
开发时我们只关心代码能运行,有效果即可,至于代码被编译成什么样子,我们并不需要知道。
1. 下载包
1 | npm i webpack-dev-server -D |
2. 配置
- webpack.config.js
1 | module.exports = { |
配置完成
config/webpack.dev.js
1 | const path = require("path");// Node.js的核心模块,专门用来处理文件路径 |
.eslintignore
1 | # 忽略vscode eslint插件检查 |
.eslintrc.js
1 | module.exports = { |
babel.config.js
1 | module.exports = { |
运行开发模式的指令
1 | npx webpack serve --config ./config/webpack.dev.js |
配置运行指令
1 | // package.json |
启动开发模式
1 | npm start |