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

lightningcss介绍及使用

lightningcss介绍及使用

一款使用 rust 编写的 css 解析器,转换器、及压缩器。

特性

  • 特别快:可以在毫秒级别解析、压缩大量的 css 文件,而且比其他工具的打包结果更小
  • 给值添加类型:许多其他css解析器会将值解析成一个无类型的 tokens,这也就意味着每个转换器如果想要操作这些值就需要手动侵入他们,造成重复工作及不统一性。而 lightningcss 遵循 css 的语法规范,给每个值提供了一个规范的类型。
  • 基于浏览器的解析器:lightningcss 是在 cssParser 和 selectors 基础上创建的(这俩工具都是由 Mozilla 创建,被 Firefox 和 Servo 使用),基于它们提供的有效、通用的 css 解析,lightningcss 实现了全部的 css 规格及属性。
  • 压缩:lightningcss 其中一个主要功能就是压缩 css,使其变得更小,包括以下几点优化:
    • 尽可能将常规写法的属性编写简写
    • 在安全情况下将相同选择器或者声明中的规则进行合并
    • 根据提供的浏览器类型删除多余的前缀
    • 尽可能减少 calc 表达式
    • 尽可能将 colors 值转换成十六进制格式
    • 压缩 gradient 属性
    • 压缩 css grid
    • 值排序
    • 拥有许多细节优化,比如:转换成更短的单位,移除非必要的引号等
  • 浏览器前缀:跟其他 css 编译器一样支持自动添加浏览器前缀
  • 浏览器配置:支持浏览器列表配置
  • 语法降级:只能最新的css语法,并能够根据浏览器目标进行适配
    • css 嵌套
    • 常规的媒体查询
    • 逻辑值
    • Color level 5
      • color-mix() 函数
      • 相对颜色语法:lab(from purple calc(l * .8) a b)
    • Color lever 4
      • lab,lch、oklab、oklch 这些颜色格式
    • 选择器
      • :not、:lang、:dir、:is
  • css 模块:支持 css modules 的特性
  • 自定义转换器:支持通过插件的方法自定义转换器插件

安装

npm i lightningcss -D

api

不同 api 打包的结果不同。

示例结构:

  • index.css(导入 body.css)
  • body.css
/* index.css */
@import url('./body.css');a,
.link {color: red;
}
a:hover {color: blue;
}/* body.css */
body {background: rgb(157, 177, 88);
}

transform

编译一个 css 文件,可以配置压缩、语法降级、sourcemap 生成(默认不生成)等。

import * as lightningcss from "lightningcss";
import fs from "node:fs/promises";async function getCssContent() {const content = await fs.readFile("./index.css", "utf-8");return content;
}async function transform() {const file = await getCssContent();let result = await lightningcss.transform({code: Buffer.from(file),});return result;
}transform().then(res => {console.log(res)
})
// {
//  code: <Buffer 40 69 6d 70 6f 72 74 20 22 2e 2f 62 6f 64 79 2e 63 73 73 22 3b 0a 0a 61 2c 20 2e 6c 69 6e 6b 20 7b 0a 20 20 63 6f 6c 6f 72 3a 20 72 65 64 3b 0a 7d 0a ... 28 more bytes>,
//  map: null,
//  exports: null,
//  references: null,
//  dependencies: null,
//  warnings: []
// }

可以看到返回的结果中 code 也是 Buffer,需要调用 toString() 方法转换成字符串。

res.code.toString();
// @import "./body.css";// a, .link {
//   color: red;
// }// a:hover {
//   color: #00f;
// }

该方法并不会直接解析出 @import 导入的 css 文件内容,也没有任何关于导入文件信息,如果我们要分析导入文件,需要传递 analyzeDependencies: true

此时在 dependencies 字段中就会有相关的信息:

// {
//  code: <Buffer 40 69 6d 70 6f 72 74 20 22 2e 2f 62 6f 64 79 2e 63 73 73 22 3b 0a 0a 61 2c 20 2e 6c 69 6e 6b 20 7b 0a 20 20 63 6f 6c 6f 72 3a 20 72 65 64 3b 0a 7d 0a ... 28 more bytes>,
//  map: null,
//  exports: null,
//  references: null,
//  dependencies: [
//    {
//      type: 'import',
//      url: './body.css',
//      placeholder: '2PNO-q',
//      supports: null,
//      media: null,
//      loc: {
//        filePath: ''
//        start: { line: 1, column: 9 },
//        end: { line: 1, column: 20 }
//      }
//    }
//  ],
//  warnings: []
// }

需要注意以下上面 dependencies 中的 placeholder 字段,它是一个占位符,可以通过这个占位符将生成的文件名进行更改:

transformStyleAttribute

编译单个文件,比如说 html 中的内联 css。使用这个 api 时能不能携带 @import

async function transform() {const file = await getCssContent();let result = await lightningcss.transformStyleAttribute({code: Buffer.from(file),});return result;
}transform().then((res) => {console.log(res.code.toString());
});
// SyntaxError: Unknown at rule: @import

由于 index.css 中携带了 @import url(‘./body.css’),会导致报错,把这行注释掉就可以运行了。

bundle、bundleAsync

bundle 同步打包 css 及对应的依赖(@import 导入的文件);bundleAsync 异步打包 css 及对应的依赖(@import 导入的文件)。

async function transform() {let result = await lightningcss.bundleAsync({filename: "./index.css",// analyzeDependencies: true,});return result;
}transform().then((res) => {console.log(res);
});
// {
//  code: <Buffer 40 69 6d 70 6f 72 74 20 22 2e 2f 62 6f 64 79 2e 63 73 73 22 3b 0a 0a 61 2c 20 2e 6c 69 6e 6b 20 7b 0a 20 20 63 6f 6c 6f 72 3a 20 72 65 64 3b 0a 7d 0a ... 28 more bytes>,
//  map: null,
//  exports: null,
//  references: null,
//  dependencies: null,
//  warnings: []
// }

与 transform 方法返回的结果类似,不同的是 bundle、bundleAsync 会把 @import 导入的文件也输出在 code 字段中:

res.code.toString();
// body {
//   background: #9db158;
// }// a, .link {
//   color: red;
// }// a:hover {
//   color: #00f;
// }

此时即使添加了 analyzeDependencies: true 配置,也不会打印出任何依赖相关信息。

composeVisitors

将多个 visitor 对象合并成一个。

visitor 对象

自定义转换是通过将 visitor 对象传递给 lightningcss 来实现的。visitor 对象包含一个或多个函数,这些函数是针对特定值类型(如规则、属性或长度)调用的。一般来说,我们应该尽可能具体地说明要处理的值的类型。这样,lightningcss 需要尽可能少地调用JS,使用尽可能小的对象,从而提高性能。

async function transform() {let result = await lightningcss.transform({code: Buffer.from(`.foo {width: 12px;}`),visitor: {Length(length) {return {unit: length.unit,value: length.value * 2,};},},});return result;
}transform().then((res) => {console.log(res.code.toString());
});
// .foo {
//    width: 24px;
// }
let environmentVisitor = {EnvironmentVariable: {"--branding-padding": () => ({type: "length",value: {unit: "px",value: 20,},}),},
};let doubleFunctionVisitor = {FunctionExit: {double(f) {if (f.arguments[0].type === "length") {return {type: "length",value: {unit: f.arguments[0].value.unit,value: f.arguments[0].value.value * 2,},};}},},
};async function transform() {let result = await lightningcss.transform({code: Buffer.from(`.foo {padding: double(env(--branding-padding));}`),visitor: lightningcss.composeVisitors([environmentVisitor,doubleFunctionVisitor,]),});return result;
}transform().then((res) => {console.log(res.code.toString());
});
// .foo {
//    padding: 40px;
// }

browserslistToTargets

将一个浏览器列表转换成可以被 lightningcss 识别的目标。

通过使用 browserslist 结合一起使用:

lightningcss.browserslistToTargets(browserslist(">= 0.25%"))

在 target 字段中进行配置:

{filename: "./index.css",targets: lightningcss.browserslistToTargets(browserslist("IE 8")),
}
browserslist

browserslist 是一个轻量级但功能强大的工具,它为前端开发者提供了一种标准化的方法来选择需要支持的浏览器列表。这个项目旨在解决一个问题:在多如牛毛的浏览器版本中,如何决定我们的代码应该兼容哪些?它的存在使得我们可以通过简洁的语句定义我们的目标浏览器,从而自动化处理兼容性问题。

Browserslist 的核心是一个解析和处理查询字符串的引擎。开发者可以以 YAML、JSON 或直接在代码中定义支持的浏览器范围,例如 “last 2 versions” 或 “> 5%, not IE 11”。这些查询基于caniuse的数据,实时更新,确保了我们的项目始终与市场现状相符。

配置方式:

在工程中使用 Browserslist 有两种常见方式:在 package.json 相应字段中增加;独立的 browserslistrc 文件

在 package.json 中声明

"browserslist": ["> 1%","last 2 versions","not ie <= 8"
]

通过 browserslistrc 配置

# Browsers that we support
> 1%
last 2 versions
not ie <= 8

两种方式没有差异,大家根据自己习惯或者各自团队规范进行管理即可。

如何配置?

通过上述方式,我们可以圈定我们也支持哪些浏览器及版本,接下来就是如果通过 browserslist 进行配置?

可以通过 https://browsersl.ist/ 这个网站来查看,我们配置的内容具体支持的浏览器情况
可以选择在全球、某个地区或某个国家/地区拥有超过或低于一定规模观众的版本

  • 5% 全世界使用率大于5%
  • = 5% in US 美国使用率大于等于5%

选择最近的浏览器版本

  • last 2 versions 所有浏览器最新的2个版本
  • last 2 Chrome versions chrome 浏览器最新2个版本

特定浏览器版本

  • Chrome > 100 chrome 浏览器版本大于100
  • not Firefox ESR 排除 Firefox ESR

选择支持特定功能的浏览器版本

  • supports es6-module 支持 es6-module 的浏览器
  • supports css-grid 支持 css-grid 的浏览器

以上条件可以组合

  • 0.5%, last 2 versions 使用率大于0.5% 或者 所有浏览器最新2个版本(等价于 > 0.5% or last 2 versions)
  • 0.5% and last 2 versions 使用率大于0.5% 的浏览器最新2个版本
  • defaults 等价于 > 0.5%, last 2 versions, Firefox ESR, not dead

了解了上述配置语法,配置完成后,我们可以上述提到的 https://browsersl.ist/ 进行实时查看。除此,你也可以通过下述工具,来检测配置是否正确和支撑的具体浏览器版本。

配置

  • filename:在 transform、transformStyleAttribute 这两个 api 中是可选的,仅用于在错误或者 sourcemap 中提示文件名,而在 bundle、bundleAsync 中是必传的,以这个文件名作为入口文件进行处理。
  • code:在 transform、transformStyleAttribute 这两个 api 中是必传的,要进行处理的 css 内容,与其他css处理器不同的是,它只支持 Uint8Array 格式,传入 string 格式会报错,在 node 中可以使用 buffer.from(string) 进行转换后传递,在浏览器中使用 new TextEncoder().encode(string) 进行转换后传递,在 bundle、bundleAsync 中这个配置无效。
  • minify:可选,是否要压缩
  • target:可选,浏览器目标
  • analyzeDependencies:可选,是否要分析 url() 导入的依赖,默认 false,设置成true 的话返回的结果会携带相关依赖信息。在 bundle、bundleAsync 中无效,因为会被打包在一个文件中,不会有任何的 dependence。
  • errorRecovery:可选,默认 false,是否要忽略无效的规则或者声明而不是直接报错。设置成 true 的话不会无效的规则、声明,照样打包,但是会提供警告。
  • visitor:可选,可以用于自定义转换器或者分析 lightningcss 的转换结果。

与工具集成

在 deno 或者浏览器中直接使用

需要导入 lightningcss-wasm 才能使用,在浏览器中使用的话需要支持 WebAssembly 特性,同时因为 lightningcss 不支持使用 string 的格式传递要转换成 css 代码,需要使用 TextEncoder 进行转换后传递,最后使用 TextDecoder 对结果进行处理:

import init, { transform } from 'https://esm.run/lightningcss-wasm';await init();let {code, map} = transform({filename: 'style.css',code: new TextEncoder().encode('.foo { color: red }'),minify: true,
});console.log(new TextDecoder().decode(code));

bundle 及 composeVisitors 暂时不支持在浏览器中使用。

在 webpack 中使用

需要安装 lightningcss、css-minimizer-webpack-plugin、browserslist 这三个依赖,之后在 webpack.config.js 文件中进行配置:

// webpack.config.js
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
const lightningcss = require('lightningcss');
const browserslist = require('browserslist');module.exports = {optimization: {minimize: true,minimizer: [new CssMinimizerPlugin({minify: CssMinimizerPlugin.lightningCssMinify,minimizerOptions: {targets: lightningcss.browserslistToTargets(browserslist('>= 0.25%'))},}),],},
};

在 vite 中使用

vite 是默认支持 lightningcss 的,但是也要先安装 lightningcss:

import {browserslistToTargets} from 'lightningcss';export default {css: {transformer: 'lightningcss',lightningcss: {targets: browserslistToTargets(browserslist('>= 0.25%'))}},build: {cssMinify: 'lightningcss'}
};

可配置字段可以查阅Lightning CSS 仓库

cli

lightningcss 提供了一个独立的 cli 工具,可以用于编译、压缩、打包 css 文件。它只针对于css的编译,如果我们需要代码分割或者支持其他类型的css文件这些更强大的功能,就不能使用这个 cli 工具了。

安装 cli:

npm install --save-dev lightningcss-cli
{"scripts": {"build": "lightningcss --minify --bundle --targets '>= 0.25%' input.css -o output.css"}
}

相关文章:

lightningcss介绍及使用

lightningcss介绍及使用 一款使用 rust 编写的 css 解析器&#xff0c;转换器、及压缩器。 特性 特别快&#xff1a;可以在毫秒级别解析、压缩大量的 css 文件&#xff0c;而且比其他工具的打包结果更小给值添加类型&#xff1a;许多其他css解析器会将值解析成一个无类型的 …...

HTTP服务的应用

1、编辑json请求参数&#xff1b; 2、把json发送到服务url&#xff0c;接收服务的返回参数&#xff1b; 3、解析返回参数。 procedure TfrmCustomQuery.btnFullUpdateClick(Sender: TObject); varfrm: TfrmInputQueryConditionEX;b_OK: Boolean;sBeginDate, sEndDate, sJSON…...

uni-app:踩坑路---scroll-view内使用fixed定位,无效的问题

前言&#xff1a; emmm&#xff0c;说起来这个问题整得还挺好笑的&#xff0c;本人在公司内&#xff0c;奋笔疾书写代码&#xff0c;愉快的提交测试的时候&#xff0c;测试跟我说&#xff0c;在苹果手机上你这个样式有bug&#xff0c;我倒是要看看&#xff0c;是什么bug。 安卓…...

MySQL4.索引及视图

1.建库 create database mydb15_indexstu; use mydb15_indexstu;2.建表 2.1 student表学&#xff08;sno&#xff09;号为主键&#xff0c;姓名&#xff08;sname&#xff09;不能重名&#xff0c;性别&#xff08;ssex&#xff09;仅能输入男或女&#xff0c;默认所在系别&a…...

MongoDB - 聚合阶段 $match、$sort、$limit

文章目录 1. $match 聚合阶段1. 构造测试数据2. $match 示例3. $match 示例 2. $sort 聚合阶段1. 排序一致性问题2. $sort 示例 3. $limit 聚合阶段 1. $match 聚合阶段 $match 接受一个指定查询条件的文档。 $match 阶段语法&#xff1a; { $match: { <query> } }$ma…...

ModuleNotFoundError: No module named ‘scrapy.utils.reqser‘

在scrapy中使用scrapy-rabbitmq-scheduler会出现报错 ModuleNotFoundError: No module named scrapy.utils.reqser原因是新的版本的scrapy已经摒弃了该方法,但是scrapy-rabbitmq-scheduler 没有及时的更新,所以此时有两种解决方法 方法一.将scrapy回退至旧版本,找到对应的旧版…...

vue3+ts+vite+electron+electron-packager打包成exe文件

目录 1、创建vite项目 2、添加需求文件 3、根据package.json文件安装依赖 4、打包 5、electron命令运行 6、electron-packager打包成exe文件 Build cross-platform desktop apps with JavaScript, HTML, and CSS | Electron 1、创建vite项目 npm create vitelatest 2、添…...

使用脚本搭建MySQL数据库基础环境

数据库的基本概念 数据&#xff08;Data&#xff09; 描述事物的符号记录 包括数字&#xff0c;文字&#xff0c;图形。图像&#xff0c;声音&#xff0c;档案记录等。 以记录形式按统一格式进行存储 表 将不同的记录组织在一起 用来储存具体数据 数据库 表的集合&#xff0c;是…...

Parameter index out of range (2 > number of parameters, which is 1【已解决】

文章目录 1、SysLogMapper.xml添加注释导致的2、解决方法3、总结 1、SysLogMapper.xml添加注释导致的 <!--定义一个查询方法&#xff0c;用于获取日志列表--><!--方法ID为getLogList&#xff0c;返回类型com.main.server.api.model.SysLogModel,参数类型为com.main.se…...

rk3588s 定制版 USB adb , USB2.0与USB3.0 区别,adb 由typeC 转换到USB3.0(第二部分)

硬件资源&#xff1a; rk3588s 核心板定制的地板 软件资源&#xff1a; 网盘上的 android12 源码 1 硬件上 客户只想使用 type c 接口中的 usb2.0 OTG 。在硬件上&#xff0c;甚至连 CC芯片都没有连接。 关于一些前置的知识。 1 USB2.0 与 USB3.0 的区别。 usb3.0 兼容2.0 …...

Cookie与Session 实现登录操作

Cookie Cookie 是网络编程中使用最广泛的一项技术&#xff0c;主要用于辨识用户身份。 客户端&#xff08;浏览器&#xff09;与网站服务端通讯的过程如下图所示&#xff1a; 从图中看&#xff0c;服务端既要返回 Cookie 给客户端&#xff0c;也要读取客户端提交的 Cookie。所…...

通过IEC104转MQTT网关轻松接入阿里云平台

随着智能电网和物联网技术的飞速发展&#xff0c;电力系统中的传统IEC 104协议设备正面临向现代化、智能化转型的迫切需求。阿里云作为全球领先的云计算服务提供商&#xff0c;其强大的物联网平台为IEC 104设备的接入与数据处理提供了强大的支持。本文将深入探讨钡铼网关在MQTT…...

lua 游戏架构 之 游戏 AI (五)ai_autofight_find_way

这段Lua脚本定义了一个名为 ai_autofight_find_way 的类&#xff0c;继承自 ai_base 类。 lua 游戏架构 之 游戏 AI &#xff08;一&#xff09;ai_base-CSDN博客文章浏览阅读238次。定义了一套接口和属性&#xff0c;可以基于这个基础类派生出具有特定行为的AI组件。例如&…...

vue3+openLayers点击标记事件

<template><!--地图--><div class"distributeMap" id"distributeMap"></div> </template> <script lang"ts" setup> import { onMounted, reactive } from "vue"; import { Feature, Map, View }…...

深入分析 Android ContentProvider (三)

文章目录 深入分析 Android ContentProvider (三)ContentProvider 的高级使用和性能优化1. 高级使用场景1.1. 数据分页加载示例&#xff1a;分页加载 1.2. 使用 Loader 实现异步加载示例&#xff1a;使用 CursorLoader 加载数据 1.3. ContentProvider 与权限管理示例&#xff1…...

养宠浮毛异味双困扰?性价比高的宠物空气净化器推荐

家里养了两只银渐层&#xff0c;谁懂啊&#xff01;一下班打开家门就看到家里飘满了猫浮毛雪&#xff0c;空气中还传来隐隐约约的异味。每天不是在吸毛的路上&#xff0c;就是在洗猫砂盆的路上&#xff0c;而且空气中的浮毛还很难清理干净&#xff0c;这是最让人头疼的问题。 …...

maven项目容器化运行之3-优雅的利用Jenkins和maven使用docker插件调用远程docker构建服务并在1Panel中运行

一.背景 在《maven项目容器化运行之1》中&#xff0c;我们开启了1Panel环境中docker构建服务给到了局域网。在《maven项目容器化运行之2》中&#xff0c;我们基本实现了maven工程创建、远程调用docker构建镜像、在1Panel选择镜像运行容器三大步骤。 但是&#xff0c;存在一个问…...

docker 打包orbbec

docker pull humble容器 sudo docker run -it osrf/ros:humble-desktop docker 启动容器 sudo docker run -u root --device/dev/bus/usb:/dev/bus/usb -it -v /home/wl:/share --name wl4 osrf/ros:humble-desktop /bin/bash新开一个终端 查看本地存在的容器&#xff1a;…...

无涯·问知财报解读,辅助更加明智的决策

财报解读就像是给公司做一次全面的体检&#xff0c;是理解公司内部运作机制和市场表现的一把钥匙&#xff0c;能够有效帮助投资者、分析师、管理层以及所有市场参与者判断一家公司的健康程度和发展潜力。 星环科技无涯问知的财经库内置了企业年报及财经类信息&#xff0c;并对…...

【Apache Doris】数据副本问题排查指南

【Apache Doris】数据副本问题排查指南 一、问题现象二、问题定位三、问题处理 本文主要分享Doris中数据副本异常的问题现象、问题定位以及如何处理此类问题。 一、问题现象 问题日志 查询报错 Failed to initialize storage reader, tablet{tablet_id}.xxx.xxx问题说明 查…...

【HarmonyOS】关于鸿蒙消息推送的心得体会(二)

【HarmonyOS】关于鸿蒙消息推送的心得体会&#xff08;二&#xff09; 前言 推送功能的开发与传统功能开发还是有很大区别。首先最大的区别点就在于需要多部门之间的协同&#xff0c;作为鸿蒙客户端开发&#xff0c;你需要和产品&#xff0c;运营&#xff0c;以及后台开发一起…...

零基础入门:创建一个简单的Python爬虫管理系统

摘要&#xff1a; 本文将手把手教你&#xff0c;从零开始构建一个简易的Python爬虫管理系统&#xff0c;无需编程基础&#xff0c;轻松掌握数据抓取技巧。通过实战演练&#xff0c;你将学会设置项目、编写基本爬虫代码、管理爬取任务与数据&#xff0c;为个人研究或企业需求奠…...

【Node.js基础04】node.js模块化

一&#xff1a;什么是模块化 在Node.js中&#xff0c;每个文件都可视为一个独立的模块。模块化提高了代码的复用性&#xff0c;按需加载&#xff0c;具有独立的作用域 二&#xff1a;如何实现多个文件间导入和导出 1 CommonJS标准&#xff08;默认&#xff09;-导入和导出 …...

数据库——单表查询

一、建立数据库mydb8_worker mysql> use mydb8_worker; 二、建立表 1.创建表 mysql> create table t_worker(department_id int(11) not null comment 部门号,-> worder_id int(11) primary key not null comment 职工号,-> worker_date date not null comment…...

dsa加训

refs: OI Wiki - OI Wiki (oi-wiki.org) 1. 枚举 POJ 2811 熄灯问题 refs : OpenJudge - 2811:熄灯问题 如果要枚举每个灯开或者不开的情况&#xff0c;总计2^30种情况&#xff0c;显然T。 不过我们可以发现&#xff1a;若第i行的某个灯亮了&#xff0c;那么有且仅有第i行和第…...

SpringBoot源码(1)ApplicationContext和BeanFactory

1、调用getBean方法 SpringBootApplication public class SpringBootDemoApplication {public static void main(String[] args) {ConfigurableApplicationContext applicationContext SpringApplication.run(SpringBootDemoApplication.class, args);applicationContext.get…...

CANoe编程实例--TCP/IP通信

1、简介 本实例将使用目前常用的开发工具C#来开发服务器端&#xff0c;以CANoe端作为客户端。服务器端和客户端&#xff0c;通过TCP/IP连接&#xff0c;实现数据交换。 首先在服务器端建立一个监听Socket&#xff0c;自动创建一个监听线程&#xff0c;随时监听是否有客户端的连…...

Neuron协议网关的北向应用插件开发

目录 概述 指令处理层开发​ 应用层开发​ .open​ .close​ .init​ .uninit​ .start​ .stop​ .setting​ .request​ 插件设置文件​ 适配华为的思路 概述 最近研究了一段时间的Neuron协议网关&#xff0c;前面的博文也提到它虽然能够把数据发到华为的IoT平台上…...

【BUG】已解决:You are using pip version 10.0.1, however version 21.3.1 is available.

You are using pip version 10.0.1, however version 21.3.1 is available. 目录 You are using pip version 10.0.1, however version 21.3.1 is available. 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#…...

electron-builder打包vue2项目不显示element-ui图标

1、使用版本 vue ^2.6.14element-ui ^2.15.14vue-cli-plugin-electron-builder 2.1.1 2、解决办法 1&#xff09; 如果是简单的图标可以使用图片代替&#xff08;这种对于elementui组件的图标还是不会显示&#xff09; 2&#xff09;在vue.config.js配置 const { defineCon…...

controller层-请求格式为json-请求方法为get

前置条件 get请求映射&#xff0c;内容和PostMapping一致&#xff0c;需要请求参数更换为get数据 请求过程&#xff1a;用户请求--初始化DispatcherServlet及对接和分发用户请求--controller--service 用户请求&#xff1a;http://ip:port/user/getinfo 请求方法&#xff1a;ge…...

【Linux】网络通信基础:应用层协议、HTTP、序列化与会话管理

文章目录 前言1. 应用层自定义协议与序列化1.1 什么是应用层&#xff1f;1.2 再谈 "协议"1.3 序列化 和 反序列化 2. HTTP 协议3. 认识 URL(统一资源定位符)4. urlencode和urldecode5. HTTP 协议请求与响应格式5.1 HTTP 请求5.2 HTTP 响应 6. HTTP 的方法6.1 GET 方法…...

@NotNull、@NotEmpty 和 @NotBlank 区别

NotNull、NotEmpty 和 NotBlank 是 Java Bean Validation (JSR 380) 规范中定义的注解&#xff0c;通常用于验证对象的属性是否满足特定的条件。这些注解常用于后端验证&#xff0c;确保接收到的数据符合预期。 NotNull 用途&#xff1a;验证一个对象是否不为null。 注意&#…...

大模型应用—大模型赋能网络爬虫

大模型赋能网络爬虫 简单来说,网页抓取就是从网站抓取数据和内容,然后将这些数据保存为XML、Excel或SQL格式。除了用于生成潜在客户、监控竞争对手和市场研究外,网页抓取工具还可以用于自动化你的数据收集过程。 借助AI网页抓取工具,可以解决手动或纯基于代码的抓取工具的…...

在 Qt 中获取 MouseMove 事件

在编写 Qt 程序时&#xff0c;我希望在鼠标移动时&#xff08;即使鼠标在另一个窗口上&#xff09;能够调用 mouseMoveEvent(QMouseEvent* event) 方法。目前&#xff0c;在我的 mainwindow.cpp 文件中&#xff0c;我有如下代码&#xff1a; void MainWindow::mouseMoveEvent(…...

自动驾驶系列—智能巡航辅助功能中的路口通行功能介绍

自动驾驶系列—智能巡航辅助功能中的车道中央保持功能介绍 自动驾驶系列—智能巡航辅助功能中的车道变换功能介绍 自动驾驶系列—智能巡航辅助功能中的横向避让功能介绍 自动驾驶系列—智能巡航辅助功能中的路口通行功能介绍 文章目录 2. 功能定义3. 功能原理4. 传感器架构5. 实…...

如何为WordPress网站设置多语言站点

随着全球化的发展&#xff0c;拥有一个支持多语言的站点已成为提升用户体验、扩大受众范围的重要手段。本文将详细介绍如何为WordPress网站设置多语言站点&#xff0c;提供两种最佳方案详解&#xff0c;帮助您轻松实现多语言站点的搭建与管理。无论您是选择在同一站点内发布多语…...

【RHCE】综合真机实验(shell完成)

目录 题目&#xff1a; 需求描述 实操 一、服务端&#xff08;servera&#xff09; 1.ip配置 2.更改主机名 3.创建本地仓库 4.DNS服务 1.下载软件包和防火墙允许 2.配置主配置文件 3.配置区域文件 1.named.exam 2.named.fangxiang 4.重启服务 5.验证结果&#x…...

【Python】成功解决conda创建虚拟环境时出现的CondaHTTPError: HTTP 000 CONNECTION FAILED错误

【Python】成功解决conda创建虚拟环境时出现的CondaHTTPError: HTTP 000 CONNECTION FAILED错误 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&a…...

苹果笔记本电脑如何优化系统 苹果电脑系统优化软件哪个好 cleanmymac x怎么用

随着时间的推移&#xff0c;你可能会发现你的MacBook运行速度变慢&#xff0c;甚至在执行一些基本任务时也会感觉到卡顿。这不仅影响了工作效率&#xff0c;也大大降低了使用体验。但别担心&#xff0c;优化你的Mac系统比做早餐还简单。本文将用一种轻松的风格向你介绍7种简单易…...

Vue数组操作之sort详解

在 Vue.js 中&#xff0c;sort() 方法用于对数组进行排序。它会改变原数组&#xff0c;并返回排序后的数组。默认情况下&#xff0c;sort() 方法按照字母顺序&#xff08;Unicode 编码顺序&#xff09;对数组中的元素进行排序。如果需要按照其他规则排序&#xff0c;可以传递一…...

解决 Android 应用安装错误:INSTALL_FAILED_BAD_PERMISSION_GROUP

解决 Android 应用安装错误&#xff1a;INSTALL_FAILED_BAD_PERMISSION_GROUP 在开发 Android 应用时&#xff0c;我们有时会遇到安装错误。这篇文章将讨论一种常见的错误&#xff1a;INSTALL_FAILED_BAD_PERMISSION_GROUP&#xff0c;并介绍解决方法。 问题描述 在尝试安装…...

浅谈断言之JSON断言

浅谈断言之JSON断言 JSON断言是Apache JMeter中一个非常实用的功能&#xff0c;它允许用户验证HTTP响应中的JSON数据是否符合预期。这对于API测试尤为重要&#xff0c;因为JSON&#xff08;JavaScript Object Notation&#xff09;是Web服务间通信的常用数据格式。通过精确地检…...

【学习笔记】无人机系统(UAS)的连接、识别和跟踪(四)-无人机认证与授权

引言 3GPP TS 23.256 技术规范&#xff0c;主要定义了3GPP系统对无人机&#xff08;UAV&#xff09;的连接性、身份识别、跟踪及A2X&#xff08;Aircraft-to-Everything&#xff09;服务的支持。 3GPP TS 23.256 技术规范&#xff1a; 【免费】3GPPTS23.256技术报告-无人机系…...

1万+台网络设备运维如何选择支撑工具?

针对1万台网络设备的运维管理&#xff0c;需要采取一套系统化、自动化且高效的管理方法与策略。“工欲善其事&#xff0c;必先利其器”&#xff0c;以下结合一些关键步骤探讨运维支撑软件工具的方案。 1 建立完善的设备档案 设备信息记录&#xff1a; 为每台设备建立详细的…...

Spring Boot集成Spring Batch快速入门Demo

1.什么是Spring Batch&#xff1f; Spring Batch 是一个轻量级的开源框架&#xff0c;它提供了一种简单的方式来处理大量的数据。它基于Spring框架&#xff0c;提供了一套批处理框架&#xff0c;可以处理各种类型的批处理任务&#xff0c;如ETL、数据导入/导出、报表生成等。S…...

Linux 文件系统

在 Linux 中&#xff0c;所有的文件都是从根目录开始的&#xff0c;且所有的设备都是文件。例如&#xff0c;一块硬盘是一个文件&#xff0c;这块硬盘上的分区也是一个文件&#xff0c;声卡也是一个文件。 这种表示设备的文件叫做设备文件。设备文件一般来说是保存在/dev这个目…...

47、PHP实现机器人的运动范围

题目&#xff1a; PHP 实现机器人的运动范围 描述&#xff1a; 地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动&#xff0c;每一次只能向左&#xff0c;右&#xff0c;上&#xff0c;下四个方向移动一格&#xff0c;但是不能进入行坐标和列坐标的数位之和大于k…...

Linux第四节课(指令与权限)

1、date指令(时间) 程序运行到自己的每一个关键时刻&#xff0c;都要自己打日志&#xff01; 日志包括时间、日志等级、日志具体信息、其他信息等&#xff0c;然后按照行为单位写入文件中&#xff0c;这个文件被称为日志文件&#xff01; 在日志文件中筛选信息时&#xff0c…...

扫雷-C语言

一、前言&#xff1a; 众所周知&#xff0c;扫雷是一款大众类的益智小游戏&#xff0c;它的游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子&#xff0c;同时避免踩雷&#xff0c;踩到一个雷即全盘皆输。 今天&#xff0c;我们的目的就是通过C语言来实现一个简…...