详细总结Webpack5的配置和使用

打包工具

使用框架(React、Vue),ES6 模块化语法,Less/Sass 等 CSS预处理器等语法进行开发的代码要想在浏览器运行必须经过编译成浏览器能识别的 JS、CSS 等语法,才能运行。
所以需要打包工具帮我们做完这些事。除此之外,打包工具还能压缩代码、做兼容性处理、提升代码性能等。

有哪些打包工具?
Grunt、Gulp、Parcel、Webpack、Rollup、Vite

webpack是什么

webpack是一种前端静态资源打包工具。在webpack看来,前端的所有资源文件(js/json/css/img/less/…)都会作为模块处理。以一个或多个文件作为打包的入口,将我们整个项目所有文件编译组合成一个或多个文件输出出去。输出的文件就是编译好的文件,就可以在浏览器段运行了。它将根据模块的依赖关系进行静态分析,打包生成对应的静态资源(bundle)。
在这里插入图片描述
Webpack 本身功能是有限的:
开发模式:仅能编译 JS 中的 ES Module 语法
生产模式:能编译 JS 中的 ES Module 语法,还能压缩 JS 代码

webpack五个核心概念

1.Entry
入口(Entry)指示webpack以哪个文件为入口起点开始打包,分析构建内部依赖图。
2.Output
输出(Output)指示webpack打包后的资源bundles输出到哪里去,以及如何命名。
3.Loader
Loader让webpack能够去处理那些非JavaScript文件(webpack自身只理解JavaScript)。
4.Plugins
插件(Plugins)可以用于执行范围更广的任务。插件的范围包括,从打包优化和压缩,一直到重新定义环境中的变量等。
5.Mode
模式(Mode)指示webpack使用相应模式的配置。
在这里插入图片描述

webpack基本使用

npm init -y 初始化一个包描述文件,运行后会生成package.json
启用 Webpack(开发模式):npx webpack ./src/main.js --mode=development,后续写了配置文件每次就直接npx webpack
成功标志:
在这里插入图片描述
默认 Webpack 会将文件打包输出到 dist 目录下。

webpack基本配置

在项目根目录下新建配置文件:webpack.config.js

// Node.js的核心模块,专门用来处理文件路径
const path = require("path");module.exports = {// 入口// 相对路径和绝对路径都行entry: "./src/main.js",// 输出output: {// path: 文件输出目录,必须是绝对路径// path.resolve()方法返回一个绝对路径// __dirname 当前文件的文件夹绝对路径path: path.resolve(__dirname, "dist"),// 入口文件输出路径filename: "static/js/main.js", // 将 js 文件输出到 static/js 目录中// clean: true, // 自动将上次打包目录资源清空},// 加载器module: {rules: [],},// 插件plugins: [],// 模式mode: "development", // 开发模式
};

Webpack 是基于 Node.js 运行的,所以采用 Common.js 模块化规范

处理样式资源

Webpack 本身是不能识别样式资源(Css、Less、Sass、Scss、Styl)的,所以我们需要借助 Loader 来帮助 Webpack 解析样式资源。

处理 CSS 资源

需要下载两个 loader:npm i css-loader style-loader -D
css-loader:负责将 CSS文件编译成 Webpack 能识别的模块
style-loader:会动态创建一个 Style 标签,里面放置 Webpack 中 CSS 模块内容。
用法:在webpack.config.js里的rules加入:

rules: [{// 用来匹配 .css 结尾的文件test: /\.css$/,// use 数组里面 Loader 执行顺序是从右到左use: ["style-loader", "css-loader"],},
],

src/css/index.css:

.box1 {width: 100px;height: 100px;background-color: red;
}

src/main.js:

import count from "./js/count";
// 引入 Css 资源,Webpack才会对其打包
import "./css/index.css";console.log(count(2, 1));

public/index.html:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>webpack5</title></head><body><h1>Hello Webpack5</h1><!-- 准备一个使用样式的 DOM 容器 --><div class="box1"></div><!-- 引入打包后的js文件,才能看到效果 --><script src="../dist/static/js/main.js"></script></body>
</html>

运行指令:npx webpack,打开 index.html 页面查看效果。

其他(Less、Sass、Scss、Styl)一个道理,按照官网配置即可。

处理图片资源

用法:在webpack.config.js里的rules加入:

{test: /\.(png|jpe?g|gif|webp)$/,type: "asset",parser: {//对图片资源进行优化dataUrlCondition: {maxSize: 10 * 1024 // 小于10kb的图片会被base64处理}},generator: {//修改输出资源的名称和路径// 将图片文件输出到 static/imgs 目录中// 将图片文件命名 [hash:8][ext][query]// [hash:8]: hash值取8位// [ext]: 使用之前的文件扩展名// [query]: 添加之前的query参数filename: "static/imgs/[hash:8][ext][query]",},
},

对图片资源进行优化:将小于某个大小的图片转化成 data URI 形式(Base64 格式,优点:减少请求数量;缺点:体积变得更大),图片以 data URI 形式内置到 js 中了,不会输出到dist。 (注意:需要将上次打包生成的文件清空,再重新打包才有效果

Webpack 会将所有打包好的图片资源输出到 dist 目录下,样式资源经过 style-loader 的处理,打包到 main.js 里面去了,所以没有额外输出出来。

type: “asset/resource” 相当于file-loader, 将文件转化成 Webpack 能识别的资源,其他不做处理;
type: “asset” 相当于url-loader, 将文件转化成 Webpack 能识别的资源,同时小于某个大小的资源会处理成 data URI 形式。

处理js资源

Webpack 对 js 处理是有限的,只能编译 js 中 ES 模块化语法,不能编译其他语法,导致 js 不能在 IE 等浏览器运行,所以要做一些兼容性处理。其次开发中,团队对代码格式是有严格要求的,需要使用专业的工具来检测。针对 js 兼容性处理,使用 Babel 来完成;针对代码格式,使用 Eslint 来完成。

Eslint

用来检测 js 和 jsx 语法的工具,在Eslint 配置文件里面写上各种 rules 规则,将来运行 Eslint 时就会以写的规则对代码进行检查。
1.下载包:npm i eslint-webpack-plugin eslint -D

2.定义 Eslint 配置文件.eslintrc.js

module.exports = {// 继承 Eslint 规则extends: ["eslint:recommended"],env: {node: true, // 启用node中全局变量browser: true, // 启用浏览器中全局变量},parserOptions: {// 解析选项ecmaVersion: 6, // ES 语法版本sourceType: "module", // ES 模块化ecmaFeatures: { // ES 其他特性jsx: true // 如果是 React 项目,就需要开启 jsx 语法}},rules: {"no-var": 2, // 不能使用 var 定义变量},
};

rules 具体规则:
“off” 或 0 - 关闭规则
“warn” 或 1 - 开启规则,使用警告级别的错误:warn (不会导致程序退出)
“error” 或 2 - 开启规则,使用错误级别的错误:error (当被触发的时候,程序会退出)

extends 继承:开发中一点点写 rules 规则太费劲了,所以有更好的办法,继承现有的规则:
Eslint 官方的规则:eslint:recommended
Vue Cli 官方的规则:plugin:vue/essential
React Cli 官方的规则:react-app

3.修改main.js

4.配置webpack.config.js:

const ESLintWebpackPlugin = require("eslint-webpack-plugin");
……
plugins: [new ESLintWebpackPlugin({// 指定检查文件的根目录context: path.resolve(__dirname, "src"),}),
],

5.运行指令:npx webpack

VSCode有 Eslint 插件,即可不用编译就能看到错误,此时就会对项目所有文件默认进行 Eslint 检查了, dist 目录下的打包后文件就会报错。
所以只需要检查 src 下面的文件,不需要检查 dist 下面的文件,使用 Eslint 忽略文件解决。在项目根目录新建下面文件.eslintignore

# 忽略dist目录下所有文件
dist

Babel

JavaScript 编译器,主要用于将 ES6 语法编写的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中。
1.下载包:npm i babel-loader @babel/core @babel/preset-env -D

2.定义 Babel 配置文件babel.config.js

module.exports = {presets: ["@babel/preset-env"],
};

presets 预设:就是一组 Babel 插件, 扩展 Babel 功能。
@babel/preset-env: 一个智能预设,允许使用最新的 JavaScript。
@babel/preset-react:一个用来编译 React jsx 语法的预设。
@babel/preset-typescript:一个用来编译 TypeScript 语法的预设。

3.修改main.js

4.配置webpack.config.js:
在rules里增加:

{test: /\.js$/,exclude: /node_modules/, // 排除node_modules代码不编译loader: "babel-loader",
},

5.运行指令:npx webpack

处理 Html 资源

1.下载包:npm i html-webpack-plugin -D
2. 配置webpack.config.js:

const HtmlWebpackPlugin = require("html-webpack-plugin");
……
plugins: [new HtmlWebpackPlugin({// 以 public/index.html 为模板创建文件// 新的html文件有两个特点:1. 内容和源文件一致 2. 自动引入打包生成的js等资源template: path.resolve(__dirname, "public/index.html"),}),
],

3.修改 index.html:去掉引入的 js 文件,因为 HtmlWebpackPlugin 会自动引入。
4.运行指令:npx webpack

自动化

每次写完代码都需要手动输入指令才能编译代码,太麻烦了,下面使用开发服务器来自动化。
1.下载包:npm i webpack-dev-server -D
2.配置webpack.config.js:

module.exports = {// 添加开发服务器devServer: {host: "localhost", // 启动服务器域名port: "3000", // 启动服务器端口号open: true, // 是否自动打开浏览器},
};

3.运行指令:npx webpack serve
注意:当使用开发服务器时,所有代码都会在内存中编译打包,并不会输出到 dist 目录下。开发时其实只关心代码能运行有效果即可,至于代码被编译成什么样子并不需要知道。

生产模式

生产模式是开发完成代码后,我们需要得到代码将来部署上线。这个模式下主要优化代码运行性能和代码打包速度。原本的webpack.config.js变成两个了。
文件目录:

├── webpack-test (项目根目录)├── config (Webpack配置文件目录)│    ├── webpack.dev.js(开发模式配置文件)│    └── webpack.prod.js(生产模式配置文件)├── node_modules (下载包存放目录)├── src (项目源码目录,除了html其他都在src里面)│    └── 略├── public (项目html文件)│    └── index.html├── .eslintrc.js(Eslint配置文件)├── babel.config.js(Babel配置文件)└── package.json (包的依赖管理配置文件)

文件目录变了,所以所有相对路径需要回退一层目录才能找到对应的文件,需要修改修改 webpack.dev.js:

path: undefined, // 开发模式没有输出,不需要指定输出目录
// clean: true, // 开发模式没有输出,不需要清空输出结果
context: path.resolve(__dirname, "../src"),
template: path.resolve(__dirname, "../public/index.html"),

运行开发模式的指令:npx webpack serve --config ./config/webpack.dev.js

修改 webpack.prod.js:

path: path.resolve(__dirname, "../dist"), // 生产模式需要输出
mode: "production",

运行生产模式的指令:npx webpack --config ./config/webpack.prod.js

配置快捷运行指令

为了方便运行不同模式的指令,将指令定义在 package.json 中 scripts 里面:

// package.json
{// 其他省略"scripts": {"start": "npm run dev","dev": "npx webpack serve --config ./config/webpack.dev.js","build": "npx webpack --config ./config/webpack.prod.js"}
}

以后启动指令:(start不用加run,其他需要加)
开发模式:npm startnpm run dev
生产模式:npm run build

单独处理CSS

CSS文件目前被打包到 js 文件中,当 js 文件加载时,会创建一个 style 标签来生成样式,这样对于网站来说,会出现闪屏现象,用户体验不好,应该是单独的 CSS文件,通过 link 标签加载性能才好。
1.下载包:npm i mini-css-extract-plugin -D
2.配置webpack.prod.js:

const MiniCssExtractPlugin = require("mini-css-extract-plugin");
rules: [{test: /\.css$/,// 将先前的"style-loader"替换成MiniCssExtractPlugin.loaderuse: [MiniCssExtractPlugin.loader, "css-loader"],},
],
plugins: [// 提取css成单独文件new MiniCssExtractPlugin({// 定义输出文件名和目录filename: "static/css/main.css",}),
],

3.运行指令:npm run build

CSS兼容性处理

1.下载包:npm i postcss-loader postcss postcss-preset-env -D
2.配置webpack.prod.js:

rules:[{test: /\.less$/,use: [MiniCssExtractPlugin.loader,"css-loader",{loader: "postcss-loader",options: {postcssOptions: {plugins: ["postcss-preset-env", // 能解决大多数样式兼容性问题],},},},"less-loader",],},
]

当配置多了的情况下,上面的兼容性处理会略显冗余,所以可以抽象成个函数合并配置:

// 获取处理样式的Loaders
const getStyleLoaders = (preProcessor) => {return [MiniCssExtractPlugin.loader,"css-loader",{loader: "postcss-loader",options: {postcssOptions: {plugins: ["postcss-preset-env", // 能解决大多数样式兼容性问题],},},},preProcessor,].filter(Boolean);
};
……rules:[{// 用来匹配 .css 结尾的文件test: /\.css$/,// use 数组里面 Loader 执行顺序是从右到左use: getStyleLoaders(),},{test: /\.less$/,use: getStyleLoaders("less-loader"),},{test: /\.s[ac]ss$/,use: getStyleLoaders("sass-loader"),},
]

3.控制兼容性:可以在 package.json 文件中添加 browserslist 来控制样式的兼容性做到什么程度。

{// 其他省略"browserslist": ["last 2 version", "> 1%", "not dead"]
}

3.运行指令:npm run build

CSS压缩

1.下载包:npm i css-minimizer-webpack-plugin -D
2.配置webpack.prod.js:

const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
plugins: [// css压缩new CssMinimizerPlugin(),
],

3.运行指令:npm run build

默认生产模式已经开启了:html 压缩和 js 压缩,不需要额外进行配置。

参考文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/5888.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3、C# 方法构成

上一节,我们讲述了程序的基本构成。由大到小分别为”解决方案-->项目-->类-->方法“。 这一节,我们讲讲方法。 方法可以说是程序的基本构成单位。假如把方法抽象成点的话,我们可以认为程序是一个树状的结构。树根,就是我们的起点方法,也叫主方法。这一点,基本…

决策树(Decision Tree)

决策树的原理 决策树算法是一种基于树结构的分类和回归算法。它通过对数据集进行递归地分割&#xff0c;构建一个树形模型&#xff0c;用于预测目标变量的值。 决策树的构建过程基于以下原理&#xff1a; 1. 特征选择&#xff1a;选择最佳的特征来进行数据集的分割。常用的…

堆排序与直接选择排序

目录 一、直接选择排序 1.基本思想 2.直接选择排序的特性总结 3.代码实现&#xff1a; 二、堆排序 1. 概念&#xff1a; 2.图像实现&#xff1a; 3.代码实现&#xff1a; 一、直接选择排序 1.基本思想 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09…

MySQL多表连接查询练习

准备工作 创建student表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) );创建score表 CREATE TABLE score ( id INT(10) NOT …

NetSuite ERP顾问的进阶之路

目录 1.修养篇 1.1“道”是什么&#xff1f;“器”是什么&#xff1f; 1.2 读书这件事儿 1.3 十年计划的力量 1.3.1 一日三省 1.3.2 顾问损益表 1.3.3 阶段课题 2.行为篇 2.1协作 2.2交流 2.3文档管理 2.4时间管理 3.成长篇 3.1概念能力 3.1.1顾问的知识结构 …

大数据学习05-Kafka分布式集群部署

系统环境&#xff1a;centos7 软件版本&#xff1a;jdk1.8、zookeeper3.4.8、hadoop2.8.5 本次实验使用版本 kafka_2.12-3.0.0 一、安装 Kafka官网 将安装包上传至linux服务器上 解压 tar -zxvf kafka_2.12-3.0.0.tgz -C /home/local/移动目录至kafka mv kafka_2.12-3.0…

护城河理论

护城河理论 护城河理论|来自股神巴菲特&#xff0c;是指投资的企业在某一方面的核心竞争力。 模型介绍 在2000年的伯克希尔哈撒韦的年会上&#xff0c;巴菲特说&#xff1a;让我们来把护城河作为一个伟大企业的首要标准&#xff0c;保持它的宽度&#xff0c;保持它不被跨越。我…

听GPT 讲K8s源代码--pkg(五)

在 Kubernetes 中&#xff0c;kubelet 是运行在每个节点上的主要组件之一&#xff0c;它负责管理节点上的容器&#xff0c;并与 Kubernetes 控制平面交互以确保容器在集群中按照期望的方式运行。kubelet 的代码位于 Kubernetes 代码库的 pkg/kubelet 目录下。 pkg/kubelet 目录…

数学建模-分类模型 Fisher线性判别分析

论文中1. 判别分析系数 2. 分类结果 多分类问题 勾选内容和上面一样

【C++】入门 --- 命名空间

文章目录 &#x1f36a;一、前言&#x1f369;1、C简介&#x1f369;2、C关键字 &#x1f36a;二、命名冲突&#x1f36a;三、命名空间&#x1f369;1、命名空间定义&#x1f369;2、命名空间的使用 &#x1f36a;四、C输入&输出 &#x1f36a;一、前言 本篇文章是《C 初阶…

Linux笔记——管道相关命令以及shell编程

文章目录 管道相关命令 目标 准备工作 1 cut 1.1 目标 1.2 路径 1.3 实现 2 sort 2.1 目标 2.2 路径 2.3 实现 第一步: 对字符串排序 第二步&#xff1a;去重排序 第三步: 对数值排序 默认按照字符串排序 升序 -n 倒序 -r 第四步: 对成绩排序【按照列排序】 …

ffmpeg中filter_query_formats函数解析

ffmpeg中filter_query_formats主要起一个pix fmt引用指定的功能。 下下结论&#xff1a; 先看几个结构体定义&#xff1a; //删除了一些与本次分析不必要的成员 struct AVFilterLink {AVFilterContext *src; ///< source filterAVFilterPad *srcpad; ///<…

PhpStudy靶场首页管理

PhpStudy靶场首页管理 一、源码一二、源码二三、源码三四、源码四 一、源码一 index.html <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>靶场访问首页</title><style>body {background-color: #f2f2f2;colo…

JavaDemo——使用jks的https

java使用https主要就是设置下sslContext&#xff0c;sslContext初始化需要密钥管理器和信任管理器&#xff0c;密钥管理器用于管理本地证书和私钥&#xff0c;信任管理器用于验证远程服务器的证书&#xff0c;这两种管理器都需要KeyStore初始化&#xff0c;两种管理器可以按需只…

Ubuntu 网络配置指导手册

一、前言 从Ubuntu 17.10 Artful开始&#xff0c;Netplan取代ifupdown成为默认的配置实用程序&#xff0c;网络管理改成 netplan 方式处理&#xff0c;不在再采用从/etc/network/interfaces 里固定 IP 的配置 &#xff0c;配置写在 /etc/netplan/01-network-manager-all.yaml 或…

【事业单位-语言理解1】中心理解02

【事业单位-语言理解1】中心理解02 1.中心理解1.1 并列关系1.2 主题词1.3程度词&#xff0c;表示强调 二、标题填入题&#xff08;优先考虑主题词&#xff09;三、词句理解题 1.中心理解 解题思路 1.1 并列关系 涉及时间顺序 注意选项不要逻辑不当 并列关系的时候&…

行云创新 CloudOS 助力上汽乘用车企业云原生IT架构变革

近日&#xff0c;在2023架构可持续未来峰会成都制造业分会场上&#xff0c;上海汽车集团股份有限公司乘用车公司基础架构部主管茹洋带来了议题为《云原生时代上汽乘用车企业IT架构变革和实践》的精彩演讲。他从云原生对于企业IT架构的意义、企业IT架构变革的必要性入手&#xf…

C程序环境及预处理

​​​​​文章目录 一、程序的翻译环境和执行环境 1.程序编译过程 2.编译内部原理 3.执行环境 二、程序运行前的预处理 1.预定义符号归纳 2.define定义标识符 3.define定义宏 4.define替换规则 5.宏和函数的对比 三、头文件被包含的方式 四、练习&#xff1a;写一…

Vue3状态管理库Pinia——核心概念(Store、State、Getter、Action)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

Java将数据集合转换为PDF

这里写自定义目录标题 将数据集合转换为pdf引入包工具类测试代码导出效果 将数据集合转换为pdf 依赖itext7包将数据集合转换导出为PDF文件 引入包 <properties><itext.version>7.1.11</itext.version> </properties><dependency><groupId&…