当前位置: 首页 > news >正文

webpack5基础(上篇)

一、基本配置

在开始使用 webpack 之前,我们需要对 webpack 的配置有一定的认识

1、5大核心概念

1)entry (入口)

指示 webpack 从哪个文件开始打包

2)output(输出)

制视 webpack 打包完的文件输出到那里去,如何命名等

3)loader(加载器)

webpack 本身只能处理 js、json 等资源,其他资源需要借助 loader webpack 才能解析

4)plugins(插件)

扩展 webpack 的功能

5)mode(模式)

主要有两种模式:
开发模式:development
生产环境:production

2、配置文件

项目中添加 文件,命名为 webpack.config.js

const path = require("path")module.exports = {// 入口entry: "./main.js",// 相对路径// 输出output: {// __dirname 是 nodejs 的遍历,代表当前文件的文件夹目录path: path.resolve(__dirname, "dist"),// 绝对路径filename: "main.js"},// 加载器module: {rules: [// loader 的配置]},// 插件plugins: [],// 模式mode: "development", // 开发模式
}

二、开发模式介绍

开发模式顾名思义就是我们开发代码时使用的模式。
这个模式下我们主要做两件事情:

1、编译代码,使浏览器能够识别运行

开发时我们有样式资源、字体图标、图片压缩、html资源等,webpack 默认都不能处理这些资源,所以我们要加载配置来编译这些资源

2、代码质量检查,树立代码规范

提前检查代码的一些隐患,让代码运行时能更加健壮
提前检查代码规范和格式,统一团队编码风格,让代码更优雅美观

三、处理样式资源

css,less,sass,scss styl 等样式资源

SCSS/SASS 相对于 CSS 的优势:

变量支持

// 定义变量
$primary-color: #3498db;
$font-size: 16px;// 使用变量
body {font-size: $font-size;color: $primary-color;
}

更好的样式嵌套

.nav {ul {list-style: none;}li {display: inline-block;a {color: $primary-color;}}
}

可复用的混合宏(Mixins)

@mixin border-radius($radius) {-webkit-border-radius: $radius;-moz-border-radius: $radius;border-radius: $radius;
}.box { @include border-radius(10px); 
}

样式继承

.btn {padding: 10px;background-color: $primary-color;
}
.btn-primary {@extend .btn;
}

条件语句和循环

$theme: light;
body {@if $theme == light {background-color: white;} @else {background-color: black;}
}
// 循环生成多个类
@for $i from 1 to 5 {.item-#{$i} {width: 100px * $i;}
}

样式模块化(Partials)

// _variables.scss
$primary-color: #3498db;//index.scss
@import 'variables';

数学运算

.container {width: 100% - 20px;margin: 10px * 2;
}

更强的性能优化能力:
SCSS/SASS 在编译时会压缩和优化代码,移除多余的空格、注释等,从而减少最终生成的 CSS 文件的大小,提高页面加载性能。

CSS 需要手动进行优化,或者依赖外部工具进行压缩。

支持模块系统(@use 和 @forward)

// _colors.scss
$primary-color: #3498db;
// main.scss
@use 'colors';
body {color: colors.$primary-color;
}

1、介绍

webpack 本身是不能识别样式资源的,所以我们需要借助 Loader 来帮助 webpack 解析样式资源
我们找 Loader 都应该去官方文档中查找使用
官方文档:https://webpack.docschina.org/concepts/#loaders

2、处理 css 资源

1)下载包

npm i css-loader style-loader -D
注意:需要下载两个 loader

2)功能介绍

css-loader: 负责将 css 文件编译成 webpack 能识别的模块

style-loader:会动态创建一个 style 标签,里面放置webpack 中 css 模块内容

此时样式就会以 style 标签的形式在页面上生效

3)配置

module.exports = {module: {rules: [{test: /\.css$/i,use: ['style-loader', 'css-loader'],},],},
};
const path = require("path")module.exports = {// 入口entry: "./main.js",// 相对路径// 输出output: {// __dirname 是 nodejs 的遍历,代表当前文件的文件夹目录path: path.resolve(__dirname, "dist"),// 绝对路径filename: "main.js"},// 加载器module: {rules: [// loader 的配置{test: /\.css$/i,// 正则检测哪些文件// use 的执行顺序 从右往左(从下到上), use: ['style-loader', // 通过创建style 标签添加到html 文件中生效'css-loader' // 将css 资源编译成 commonjs的模块到 js 中],},]},// 插件plugins: [],// 模式mode: "development", // 开发模式
}

3、处理 less 资源

1)安装

npm install less less-loader --save-dev
将 less 文件编译成 css 文件

2)配置(webpack.config.js):

module.exports = {module: {rules: [{test: /\.less$/i,use: [// compiles Less to CSS'style-loader','css-loader','less-loader',],},],},
};

4、处理 scss/sass 资源

1)安装

npm install sass-loader sass webpack --save-dev

2)配置

module.exports = {module: {rules: [{test: /\.s[ac]ss$/i,//匹配 sass/scss 两种文件use: [// 将 JS 字符串生成为 style 节点'style-loader',// 将 CSS 转化成 CommonJS 模块'css-loader',// 将 Sass 编译成 CSS'sass-loader',],},],},
};

5、处理 Styl 资源

1)安装

npm i stylus-loader -D

2)配置

module.exports = {module: {rules: [{test: /\.styl$/i,//匹配 sass/scss 两种文件use: [// 将 JS 字符串生成为 style 节点'style-loader',// 将 CSS 转化成 CommonJS 模块'css-loader',// 将 Sass 编译成 CSS'stylus-loader',],},],},
};

四、处理图片资源

过去在 webpack4 时,我们处理图片资源通过 file-loader 和 url-loader 进行处理

现在 webpack5 已经将两个 Loader 功能内置到 webpack 里了,我们只需要简单配置即可处理图片资源

1、配置

const path = require("path")
module.exports = {entry: './main.js',output: {path: path.resolve(__dirname, "dist"),filename: 'main.js'},module: {rules: [{test: /\.(png|jpg|webp|svg|jpeg|gif)/,type: 'asset',parser: {dataUrlCondition: {// 小于 10kb 的图片转换成 base64.maxSize: 10 * 1024 }}}]}
}

图片转成 base64 的优势是 减少请求数量,缺点是体积会变大。
一般小图片会考虑转成 base64, 大图还是请求(如果也转换 base64 的话就导致页面加载缓慢)

有转换的时候,图片在打包后的文件夹里会少一些

2、修改不同资源的输出目录,比如图片到 image, css 到 css 文件夹

const path = require("path")
module.exports = {entry: './main.js',output: {path: path.resolve(__dirname, "dist"),filename: 'static/js/main.js'// 入口的文件打包以后输出到 js 中},module: {rules: [{test: /\.(png|jpg|webp|svg|jpeg|gif)/,type: 'asset',parser: {dataUrlCondition: {// 小于 10kb 的图片转换成 base64.maxSize: 10 * 1024 }},generator: {//hash 值, ext 扩展名 query 一些其他的参数 ; hash:10表示hash值取前10位,不写就是全部filename: 'static/image/[hash:10][ext][query]'}}]}
}

3、自动清空上次打包的内容

webpack4 需要 clearwebpackplugin 的插件来处理,webpack5 加一个 clean 参数即可

const path = require("path")
module.exports = {entry: './main.js',output: {path: path.resolve(__dirname, "dist"),filename: 'static/js/main.js',// 入口的文件打包以后输出到 js 中clean: true // 原理:到抱歉将path 整个目录内容清空},module: {rules: [{test: /\.(png|jpg|webp|svg|jpeg|gif)/,type: 'asset',parser: {dataUrlCondition: {// 小于 10kb 的图片转换成 base64.maxSize: 10 * 1024 }},generator: {//hash 值, ext 扩展名 query 一些其他的参数 ; hash:10表示hash值取前10位,不写就是全部filename: 'static/image/[hash:10][ext][query]'}}]}
}

五、处理字体图标资源

1、下载字体图标并引入到 main.js 中

iconfont,可以在阿里巴巴的矢量图中下载。

const path = require("path");
module.exports = {entry: './main.js',output: {path: path.resolve(__dirname, "dist"),filename: 'static/js/main.js',// 入口的文件打包以后输出到 js 中clean: true // 原理:到抱歉将path 整个目录内容清空},module: {rules: [{test: /\.(png|jpg|webp|svg|jpeg|gif)/,type: 'asset', // 会转成base64parser: {dataUrlCondition: {// 小于 10kb 的图片转换成 base64.maxSize: 10 * 1024 }},generator: {//hash 值, ext 扩展名 query 一些其他的参数 ; hash:10表示hash值取前10位,不写就是全部filename: 'static/image/[hash:10][ext][query]'}},{test: /\.(ttf|woff2?)/,type: 'asset/resource', // 原样输出,不再转换parser: {dataUrlCondition: {// 小于 10kb 的图片转换成 base64.maxSize: 10 * 1024 }},generator: {//hash 值, ext 扩展名 query 一些其他的参数 ; hash:10表示hash值取前10位,不写就是全部filename: 'static/fonts/[hash:10][ext][query]'}}]}
}

六、处理 js 资源

为什么还需要处理 js资源?
原因是 webpack 对 js 处理是有限的,只能编译 js 中 ES 模块化语法,不能编译其他语法,导致 js 不能在 IE 等浏览器运行,所以还需要做一些兼容性处理

1、Eslint

可组装的 JavaScript 和 JSX 检查工具。

这句话意思就是:它用来检测 js 和 jsx 的工具,可以配置各项功能

1.1 配置文件

配置文件有很多写法

  • eslintrc.* 新建文件,位于项目根目录
    .eslintrc
    .eslintrc.js
    .eslintrc.json
    区别在于配置格式不一样

ESlint会查找和自动读取他们,所以以上配置文件只需要存在一个即可

1.2 具体配置

.eslintrc.js 配置文件为例

module.exports = {// 解析选项parserOptions: {ecamVersion: 6,// ES 语法版本sourceType: 'module',// ES 模块化ecmaFeatures: {// ES 其他特性jsx: true, // 如果是 React 项目,就需要开启 jsx 语法}},// 具体检查规则rules: {//  "off" 或 0:关闭规则// "warn" 或 1:开启规则,使用警告级别的错误,warn 不会导致程序退出// “error”或2:开启规则,使用错误级别的错误:error 当被触发的时候,程序会退出semi: "error", // 禁止使用分号'array-callback-return': 'warn',// 强制数组方法的回调函数中有 return 语句,否则警告'default-case': ['warn',{commonentPattern: '^no default$'} // 允许在最后注释 no default ,就不会有警告了],eqeqeq: ['warn', // 强制使用 === 和 !== ,否则警告'smart']},// 继承其他规则,直接使用 网站上别人写好的规则或者是官方写好的规则extends: []
}

相关文章:

webpack5基础(上篇)

一、基本配置 在开始使用 webpack 之前,我们需要对 webpack 的配置有一定的认识 1、5大核心概念 1)entry (入口) 指示 webpack 从哪个文件开始打包 2)output(输出) 制视 webpack 打包完的…...

快速理解MIMO技术

引言 在无线通信领域,MIMO(Multiple-Input Multiple-Output,多输入多输出)技术是一项革命性的进步,它通过在发射端和接收端同时使用多个天线,极大地提高了通信系统的容量、可靠性和覆盖范围。本文简要阐释其…...

【RTD MCAL 篇3】 K312 MCU时钟系统配置

【RTD MCAL 篇3】 K312 MCU时钟系统配置 一,文档简介二, 时钟系统理论与配置2.1 K312 时钟系统2.1.1 PLL2.1.2 MUX_0系统2.1.3 MUX_6 时钟输出2.1.4 option B推荐方案 2.2 EB 配置2.2.1 General 配置2.2.2 McuClockSettingConfig配置2.2.2.1 McuFIRC配置…...

探索Docker Compose:轻松管理多容器应用

探索Docker Compose:轻松管理多容器应用 在现代软件开发中,容器化已经成为构建、部署和扩展应用的主流方式。而Docker Compose作为Docker生态系统的重要组成部分,可以简化多容器应用的管理。本文将深入探讨Docker Compose的核心功能及应用场…...

计算机网络 (18)使用广播信道的数据链路层

一、广播信道的基本概念 广播信道是一种允许一个发送者向多个接收者发送数据的通信信道。在计算机网络中,广播信道通常用于局域网(LAN)内部的主机之间的通信。这种通信方式的主要优点是可以节省线路,实现资源共享。 二、广播信道数…...

【vLLM 学习】欢迎来到 vLLM!

vLLM 是一款专为大语言模型推理加速而设计的框架,实现了 KV 缓存内存几乎零浪费,解决了内存管理瓶颈问题。 更多 vLLM 中文文档及教程可访问 →https://vllm.hyper.ai/ vLLM 是一个快速且易于使用的库,专为大型语言模型 (LLM) 的推理和部署…...

现代网络基础设施中的 TCP 握手之下

TCP 3 次握手 在最简单的形式中,TCP 三次握手很容易理解,并且有 大量在线材料都在讨论这个问题。(如果你能读懂 Chinease,你可以看看我之前的一篇文章。 然而,在实际中理解、练习和解决 TCP 问题 世界是另一回事。随…...

GRAPE——RLAIF微调VLA模型:通过偏好对齐提升机器人策略的泛化能力(含24年具身模型汇总)

前言 24年具身前沿模型大汇总 过去的这两年,工作之余,我狂写大模型与具身的文章,加之具身大火,每周都有各种朋友通过CSDN私我及我司「七月在线」寻求帮助/指导(当然,也欢迎各大开发团队与我司合作共同交付&#xff09…...

NeurIPS 2024 | 像素级LLM实现图像视频理解、生成、分割和编辑大统一(昆仑万维等)

Accepted by NeurIPS 2024 文章链接:https://arxiv.org/pdf/2412.19806 项目链接:https://vitron-llm.github.io/ Github链接:https://github.com/SkyworkAI/Vitron 亮点直击 首次提出了一种通用的视觉多模态大语言模型(MLLM&…...

中药和西药的区别

中药和西药的区别 一、定义与来源 (一)中药 中药主要是在中国传统医学理论指导下用于预防、诊断、治疗疾病或调节人体机能的药物。它的来源广泛,包括植物药、动物药、矿物药等。植物药是中药的主要组成部分,例如人参&#xff0…...

Spring Security(maven项目) 3.0.2.4版本

前言: 通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往…...

【Ubuntu】安装华为的MindSpore

目录 1 安装Anaconda 2 更换国内源 3 安装MindSpore 1 安装Anaconda 2 更换国内源 具体方法如下: 打开命令行 cmd 工具,输入以下命令。 ① Conda 换源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ c…...

【模型】Qwen2-VL 服务端UI

1. 前言 最近在测试VLM模型,发现官方的网页demo,代码中视频与图片分辨率可能由于高并发设置的很小,导致达不到预期效果,于是自己研究了一下,搞了一个简单的前端部署,自己在服务器部署了下UI界面&#xff0…...

计算机网络•自顶向下方法:网络层介绍、路由器的组成

网络层介绍 网络层服务:网络层为传输层提供主机到主机的通信服务 每一台主机和路由器都运行网络层协议 发送终端:将传输层报文段封装到网络层分组中,发送给边缘路由器路由器:将分组从输入链路转发到输出链路接收终端&#xff1…...

安卓11 SysteUI添加按钮以及下拉状态栏的色温调节按钮

最近客户想要做一个台灯产品,需要实现 串口调节台灯功能 ,其中包括 亮度调节 色温调节 开关 三个功能 话不多说,贴代码 diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml old mode 100644 new …...

多个线程处理不同的数据,等线程都完成后再进行下一步操作

现在有三个任务,三个任务之间没有关联关系,但是第四个任务要等前三个完成之后才能进行,于是使用多线程完成前三个任务节省时间 示例代码: public void saveDataByOnlineTimeNew(LocalDateTime startTime, LocalDateTime endTime) {Objects.requireNonNull(startTime, "开…...

聆听音乐 1.5.9 | 畅听全网音乐,支持无损音质下载

聆听音乐手机版是面向广大音乐爱好者的移动应用程序,用户可以随时随地通过手机享受丰富的音乐资源。它提供了多种魅力功能,让用户在手机上畅享更舒适的音乐体验,每位用户都能享受精彩纷呈的收听体验。此外,软件还支持无损音质音乐…...

Rust 基础入门指南

Rust 基础入门指南 1. Rust 语言概述 Rust 的历史与设计理念 Rust 是由 Mozilla 研究院的 Graydon Hoare 于2010年开始创建的系统编程语言。其设计目标是创建一种安全、并发、实用的编程语言,特别关注内存安全和并发性。 Rust 的核心设计理念包括: …...

青少年编程与数学 02-006 前端开发框架VUE 03课题、编写APP组件

青少年编程与数学 02-006 前端开发框架VUE 03课题、编写APP组件 一、组件二、VUE中的组件三、APP组件四、应用示例1. App.vue - 根组件2. HelloWorld.vue - 子组件3. main.js - 应用入口文件4. router/index.js - 路由配置文件5. index.html - HTML入口文件6. package.json - 项…...

基于Java的银行排号系统的设计与实现【源码+文档+部署讲解】

目 录 内容提要 1. 引言 2. 系统分析 2.1 系统初步调查 2.2 系统可行性分析 2.2.1 经济可行性 2.2.2 操作可行性 2.2.3 技术可行性 2.3 系统开发环境概述 2.3.1 硬件环境 2.3.2 软件环境 2.4 系统需求分析 2.4.1 业务流程分析 2.4.2 系统体系结构设计 2.4.3 系统逻辑模型 2.5 …...

微信小程序之bind和catch

这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

【机器视觉】单目测距——运动结构恢复

ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛&#xf…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...

反射获取方法和属性

Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则&#xf…...