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

Rollup配置实战:多产物与多入口的完美结合 (2)

常用配置

多产物配置

我们可以将 output 改造成一个数组,对外暴露出不同格式的产物供他人使用,不仅包括 ESM,也需要包括诸如CommonJSUMD等格式,保证良好的兼容性

import { defineConfig } from 'rollup'export default defineConfig({input: 'src/index.js',output: [{file: 'dist/bundle-iife.js',format: 'iife'},{file: 'dist/bundle-esm.js',format: 'esm'},{file: 'dist/bundle-cjs.js',format: 'cjs'},{file: 'dist/bundle-umd.js',format: 'umd',name: 'bundle'}],
})

多入口配置

除了多产物配置,Rollup 中也支持多入口配置

main.js

// src/main.js
import util from "./util.js";
const r = util.getRandomNum(1, 10)
console.log("🚀 ~ r:", r)const obj = {a: 1,b: {c: 3}
}
const cloneObj = util.deepClone(obj)
cloneObj.b.c = 4;
console.log("🚀 ~ obj:", obj)
console.log("🚀 ~ cloneObj:", cloneObj)

rollup.config.js

import { defineConfig } from 'rollup'export default defineConfig({input: ['src/index.js','src/main.js'],output: [{dir: 'dist',format: 'cjs'}],
})

通常情况下多产物和多入口两者会被结合起来使用

import { defineConfig } from 'rollup'
export default defineConfig({input: ['src/index.js','src/main.js'],output: [{dir: 'cjs',format: 'cjs'},{dir: 'esm',format: 'esm'}],
})

当然,上面这样的写的话,生成的产物会把两个入口一起进行构建,我们可能的想法是一个入口一种构建方式:

import { defineConfig } from 'rollup'
/*** @type {import('rollup').RollupOptions}*/
const buildIndexOptions = {input: 'src/index.js',output: {dir: 'dist/umd/',format: 'umd',name: 'bundle'}
}/*** @type {import('rollup').RollupOptions}*/
const buildMainOptions = {input: 'src/main.js',output: {dir: 'dist/esm/',format: 'esm',}
}
export default [buildIndexOptions, buildMainOptions];

动态导入与默认代码分割

使用路由来说明懒加载是大家喜闻乐见的方式,估计大多数同学对于懒加载都只是停留在路由的懒加载,其实,任何时候,我们都可以使用import动态懒加载的方式。重新编辑一下main.js入口:

// src/main.js
function run() { // 如果不清楚import动态导入返回的是什么,可以先打印一下下面结果// import("./util.js").then(chunk => console.log("🚀 ~ chunk:", chunk));import("./util.js").then(({ default: foo }) => { const r = foo.getRandomNum(1, 10);console.log("🚀 ~ r:", r) })
}
run();

重新运行可以看到dist目录形成了下面的结构:

.
├── dist
│   ├── esm
│   │   ├── main.js
│   │   └── util-371e3ef9.js
│   └── umd
│       └── index.js
└── ...

Rollup 将使用动态导入创建一个仅在需要时加载的单独块。所以你可以看到这里多了一个util-371e3ef9.js的文件

注意:为了让 Rollup 知道在哪里放置第二个块,我们不使用 --file 选项,而是使用 --dir 选项设置一个输出文件夹

其中,util-371e3ef9.js是自动生成的chunk-[hash].js的名字,[hash] 是基于内容的哈希字符串。你可以通过指定 output.chunkFileNames (chunk文件)和 output.entryFileNames (打包入口文件)选项来提供自己的命名模式。

/*** @type {import('rollup').RollupOptions}*/
const buildMainOptions = {input: 'src/main.js',output: {dir: 'dist/esm/',entryFileNames: '[name].js',chunkFileNames: 'chunk-[name]-[hash].js',format: 'esm',}
}

而且,很智能的是,如果这个时候,我定义了又多个入口点都调用了util.js文件,会自动的引入分割出来的文件

/*** @type {import('rollup').RollupOptions}*/
const buildMainOptions = {input: ['src/main.js', 'src/main2.js'],output: {dir: 'dist/esm/',entryFileNames: '[name].js',chunkFileNames: 'chunk-[name]-[hash].js',format: 'esm',}
}

在打包后的main2.js中,可以看到这样的引用:

import util from './chunk-util-371e3ef9.js';

使用插件

到目前为止,我们已经用入口文件和通过相对路径导入的模块打了一个简单的包。随着你需要打包更复杂的代码,通常需要更灵活的配置,例如导入使用 NPM 安装的模块、使用 Babel 编译代码、处理 JSON 文件等等。

插件列表 : the Rollup Awesome List。

@rollup/plugin-node-resolve

比如我们现在引入lodash-es库

pnpm add lodash-es -D

在index.js中使用

import { chunk } from "lodash-es";
const r = chunk([1, 2, 3, 4], 2);
console.log("🚀 ~ r:", r)

现在直接打包

/*** @type {import('rollup').RollupOptions}*/
const buildIndexOptions = {input: 'src/index.js',output: {dir: 'dist/esm/',format: 'esm',}
}
export default buildIndexOptions

会出现下面的警告:

src/index.js → dist/esm/...
(!) Unresolved dependencies
https://rollupjs.org/troubleshooting/#warning-treating-module-as-external-dependency
lodash-es (imported by "src/index.js")
created dist/esm/ in 13ms

意思是,不能解析lodash-es这个依赖,报出了警告,问你是不是需要external,并提示你点击链接有这个警告的解释。当我们点击这个链接,按照提示解决这个external警告问题,很简单,就加上external,也就是把lodash-es这个库给排除出去

const buildIndexOptions = {input: 'src/index.js',output: {dir: 'dist/esm/',format: 'esm',},
+  external: ['lodash-es']
}
export default buildIndexOptions

再此打包,果然没警告了,而且我们在nodejs环境中确实也能正常运行了

到这里,问题似乎已经解决了,但我要问你一个问题:这个问题是如何解决的,依据是什么?

这里虽然看似一个很小的问题,但是却有很多基本理论点

1、rollup默认只能解析导入的相对路径,也就是/./或者../开头的路径,对于bare import,也就是import { chunk } from 'lodash-es';这种直接导入的第三方包的格式,并不支持

2、rollup相比webpack最大的优势并不是构建一个足够大的应用打包,大多是情况下,我们使用rollup用来构建工具库,因此,这里导入的lodash-es并没有报错,而仅仅报出警告,因为rollup认为lodash-es这个库并没有加入构建,那么你的意思是将来用作第三方库来使用,因此将lodash-es使用配置external排除掉就好。

3、lodash-es这个包本身就是支持ESM的

4、最后打包好的index.js文件只所以能在nodejs环境下运行,是因为nodejs可以帮我们解析bare import,我们可以试着将index.js放入到html文件中运行,你就可以看到其中的问题所在,在html环境中就会报错了:index.html:1 Uncaught TypeError: Failed to resolve module specifier "lodash-es". Relative references must start with either "/", "./", or "../".

如果希望在最后的打包中,将lodash-es内容解析打包进去,就可以使用@rollup/plugin-node-resolve

安装:

pnpm add @rollup/plugin-node-resolve --save-dev

使用:

import { nodeResolve } from '@rollup/plugin-node-resolve';
/*** @type {import('rollup').RollupOptions}*/
const buildIndexOptions = {input: 'src/index.js',output: {dir: 'dist/esm/',format: 'esm',},plugins: [nodeResolve()]// external: ['lodash-es']
}
export default buildIndexOptions

现在,再此进行打包,无论是打包时间,还是打包内容和之前都很不一样了,把lodash-es中,关于chunk()函数的内容,都打包进了index.js文件中

output.manualChunks

上面讲了对于动态加载模块,rollup帮我们自动做了代码分割,其实我们也可以手动的操作,直接在rollup配置中声明

const buildIndexOptions = {input: 'src/index.js',  output: {dir: 'dist/esm/',format: 'esm',entryFileNames: '[name].js',chunkFileNames: 'chunk-[name]-[hash].js',manualChunks: {'lodash-es': ['lodash-es'],}//也可以是函数形式// manualChunks(id){//   if(id.includes('lodash-es')){//     return 'lodash-es'//   }// }},plugins: [nodeResolve()]
}

@rollup/plugin-commonjs

上面最开始导入lodash-es,没有加入externalplugins,之所以还能直接运行,还因为lodash-es本身就是支持ESM的,因为rollup默认并不支持Commonjs模块化,比如将lodash-es换位lodash,马上就能看到不一样的效果,直接打包失败

[!] RollupError: "chunk" is not exported by "node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/lodash.js", imported by "src/index.js".
https://rollupjs.org/troubleshooting/#error-name-is-not-exported-by-module

这个错误在官网上解释的很清楚了,无非就是commonjs没有这种导出,因此我们需要@rollup/plugin-commonjs帮我们处理commonjs模块化的问题

安装:

pnpm add @rollup/plugin-commonjs --save-dev

使用:

import { nodeResolve } from '@rollup/plugin-node-resolve';
+import commonjs from '@rollup/plugin-commonjs';
/*** @type {import('rollup').RollupOptions}*/
const buildIndexOptions = {input: 'src/index.js',output: {dir: 'dist/esm/',format: 'esm',},
+  plugins: [nodeResolve(), commonjs()]
}
export default buildIndexOptions

@rollup/plugin-babel

使用 Babel 来使用尚未被浏览器和 Node.js 支持的最新 JavaScript 特性。

使用 Babel 和 Rollup 最简单的方法是使用 @rollup/plugin-babel

安装:

pnpm add @rollup/plugin-babel -D

使用:

import { nodeResolve } from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
+import babel from '@rollup/plugin-babel';
/*** @type {import('rollup').RollupOptions}*/
const buildIndexOptions = {input: 'src/index.js',output: {dir: 'dist/esm/',format: 'esm',},plugins: [nodeResolve(),commonjs(),
+    babel({ babelHelpers: 'bundled' })]
}
export default buildIndexOptions

不过这么做之后,打包代码并不会有什么变化,因为我们都知道babel是需要预设的.

安装 babel-coreenv 预设

pnpm add -D @babel/core @babel/preset-env

在 Babel 实际编译代码之前,需要进行配置。在项目根目录创建一个名为 .babelrc.json 的新文件

{"presets": ["@babel/preset-env"]
}

具体的babel设置,可以参考babel文档

题外话:@babel/runtime

我们在index.js代码中加入如下的api

import { getRandomNum } from "./util.js";
const r = getRandomNum(1, 10)
console.log(r)const arr = [1, 2, 3, 4].map(item => item * item);
console.log("🚀 ~ arr:", arr)Promise.resolve(1).then(res => {console.log(res);
});

我们通过babel处理之后会发现一些问题:

@babel/preset-env 只转换了语法,也就是我们看到的箭头函数、const一类,但是对于进一步需要转换内置对象、实例方法等等API,就显得无能为力了,这些代码需要polyfill(兼容性垫片)。所以这个我需要@babel/runtime来帮我们处理。

@babel/runtime是一个核心, 一种实现方式,但是在实现polyfill垫片的过程中,可能会产生很多重复的代码,所以需要@babel/plugin-transform-runtime防止污染全局, 抽离公共的 helper function , 防止冗余,当然在处理polyfill的时候,我们还需要core-js的辅助,基于babel,我们可以使用@babel/runtime-corejs3

安装:

pnpm add @babel/plugin-transform-runtime -D
pnpm add @babel/runtime @babel/runtime-corejs3

要使用@babel/plugin-transform-runtime@rollup/plugin-babelbabelHelper处理必须改为runtime

import { nodeResolve } from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import babel from '@rollup/plugin-babel';
import typescript from '@rollup/plugin-typescript';
/*** @type {import('rollup').RollupOptions}*/
const buildIndexOptions = {input: 'src/index.js',output: {dir: 'dist/esm/',format: 'esm',},plugins: [nodeResolve(),commonjs(),babel({babelHelpers: 'runtime',include: 'src/**',exclude: 'node_modules/**',extensions:['.js', '.ts']}),typescript(),]
}
export default buildIndexOptions

.babelrc.json:

{"presets": [["@babel/preset-env",{"targets": "> 0.25%, not dead","useBuiltIns": "usage","corejs": 3}]],"plugins": [["@babel/plugin-transform-runtime",{"corejs": 3}]]
}

这个时候你再进行构建,会发现打包后的文件多出了一大堆,这其实就是polyfill中的代码。

@rollup/plugin-typescript

要使用typescript就需要依赖这个插件,当然这个插件本身还依赖了typescripttslib,因此我们需要导入3个包

pnpm add typescript tslib @rollup/plugin-typescript -D

util.ts

/*** 深拷贝* @param obj 需要深拷贝的对象* @returns 深拷贝对象*/
export const deepClone = <T>(obj: T): T => {if(typeof obj !== 'object' || obj === null) {return obj}const result:any = Array.isArray(obj) ? [] : {};for(let key in obj) {if(obj.hasOwnProperty(key)) {result[key] = deepClone(obj[key])}}return result
}export const getRandomNum = (min: number, max: number): number => {let num = Math.floor(Math.random() * (min - max) + max);return num;
}

Index.ts

import { getRandomNum,deepClone } from './util.ts';
const r = getRandomNum(1, 10);
console.log(r);const obj = { a: 1, b: { c: 3 } };
const obj2 = deepClone(obj);
obj2.b.c = 4;console.log(obj);
console.log(obj2);

当然,配置文件我们也完全可以是ts的

rollup.config.ts

import { RollupOptions } from "rollup"
import { nodeResolve } from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import babel from '@rollup/plugin-babel';
import typescript from '@rollup/plugin-typescript';const config: RollupOptions = {input: 'src/index.ts',output: {file: 'dist/umd/index.js',format: 'umd',name: 'rollupDemo',},plugins: [nodeResolve(),commonjs(),babel({babelHelpers: 'runtime',include: 'src/**',exclude: 'node_modules/**',extensions:['.js', '.ts']}),typescript(),],
}
export default config;

tsconfig.json

{"compilerOptions": {"module": "esnext","target": "es5","lib": ["esnext", "dom", "dom.iterable"],"skipLibCheck": true,"moduleResolution": "bundler","noEmit": true,"allowImportingTsExtensions":true,"resolveJsonModule": true,"isolatedModules": true,},"include": ["src/**/*","rollup.config.ts"],
}

**注意:**别忘记tsconfig.json文件中需要加入rollup.config.ts配置文件,不然要报错

{"compilerOptions": {......},
+  "include": ["src/**/*","rollup.config.ts"],
}

运行:

npx rollup -c rollup.config.ts --configPlugin typescript

相关文章:

Rollup配置实战:多产物与多入口的完美结合 (2)

常用配置 多产物配置 我们可以将 output 改造成一个数组&#xff0c;对外暴露出不同格式的产物供他人使用&#xff0c;不仅包括 ESM&#xff0c;也需要包括诸如CommonJS、UMD等格式&#xff0c;保证良好的兼容性 import { defineConfig } from rollupexport default defineC…...

iced源码分析

前言 iced是一个比较流行的UI库&#xff0c;设计思路还是挺有意思的&#xff0c;不过因为rust复杂的语法&#xff0c;这个库确实很难让一个不精通rust的开发者那么容易理解。这里记录下这几天的阅读源码心得。 正文 iced核心包括四个模块。 iced库&#xff0c;主要控制应用…...

Hadoop的MapReduce详解

文章目录 Hadoop的MapReduce详解一、引言二、MapReduce的核心概念1、Map阶段1.1、Map函数的实现 2、Reduce阶段2.1、Reduce函数的实现 三、MapReduce的执行流程四、MapReduce的使用实例Word Count示例1. Mapper类2. Reducer类3. 执行Word Count 五、总结 Hadoop的MapReduce详解…...

【Python系列】字典灵活的数据存储与操作

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

【MCU】微控制器的编程技术:ISP 与 IAP

在嵌入式领域中&#xff0c;将程序下载到内置 Flash 有两种技术 ISP (In-system programming) ISP 即在系统编程&#xff0c;是指一些可编程逻辑器件、微控制器、芯片组和其他嵌入式设备在安装到完整嵌入式系统后能够进行编程&#xff0c;而不需要在将芯片安装到系统中之前对…...

TCP/IP 协议:网络世界的基石(2/10)

一、引言 在当今数字化时代&#xff0c;互联网已经成为人们生活中不可或缺的一部分。而在互联网的背后&#xff0c;TCP/IP 协议扮演着至关重要的角色&#xff0c;堪称互联网的基石。 TCP/IP 协议是一组用于数据通信的协议集合&#xff0c;它的名字来源于其中最重要的两个协议…...

小R的二叉树探险 | 模拟

问题描述 在一个神奇的二叉树中&#xff0c;结构非常独特&#xff1a; 每层的节点值赋值方向是交替的&#xff0c;第一层从左到右&#xff0c;第二层从右到左&#xff0c;以此类推&#xff0c;且该二叉树有无穷多层。 小R对这个二叉树充满了好奇&#xff0c;她想知道&#xf…...

Redis ⽀持哪⼏种数据类型?适⽤场景,底层结构

目录 Redis 数据类型 一、String&#xff08;字符串&#xff09; 二、Hash&#xff08;哈希&#xff09; 三、List&#xff08;列表&#xff09; 四、Set&#xff08;集合&#xff09; 五、ZSet(sorted set&#xff1a;有序集合) 六、BitMap 七、HyperLogLog 八、GEO …...

十、事件类型(鼠标事件、焦点.. 、键盘.. 、文本.. 、滚动..)、事件对象、事件流(事件捕获、事件冒泡、阻止冒泡和默认行为、事件委托)

1. 事件类型 1.1 鼠标事件 1.1.1 click 鼠标点击 1.1.2 mouseenter 鼠标进入 1.1.3 mouseleave 鼠标离开 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widt…...

RabbitMQ学习-One

同步调用和异步调用 1.假设我们现在又两个服务&#xff0c;分别是修改商品服务和查询商品服务&#xff0c;每个服务都有自己的数据库&#xff1b; 2.左侧的流程假设我们总共需要耗时40ms&#xff1b; 3.因为不同服务数据库不一样&#xff0c;所以我们就要考虑修改了左边服务的…...

蓝队基础,网络七杀伤链详解

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…...

机器学习实战:银行客户是否认购定期存款

项目结构与步骤 1. 项目概述 项目名称&#xff1a;葡萄牙银行电话营销活动分析与定期存款认购预测目标&#xff1a;通过分析银行的电话营销数据&#xff0c;构建模型预测客户是否会认购定期存款。数据来源&#xff1a;葡萄牙银行营销活动数据集关键挑战&#xff1a;数据不平衡…...

【一篇搞定配置】网络分析工具WireShark的安装与入门使用

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;各种软件安装与配置_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1.…...

气膜场馆照明设计:科技与环保的完美结合—轻空间

气膜场馆的照明设计&#xff0c;选用高效节能的400瓦LED灯具&#xff0c;结合现代节能技术&#xff0c;提供强大而均匀的光照。LED灯具在光效和寿命方面优势显著&#xff0c;不仅降低运营能耗&#xff0c;还有效减少碳排放&#xff0c;为绿色场馆建设贡献力量。 科学分布&…...

C语言程序编译和链接

编译环境和运行 编译环境也可以称为翻译环境&#xff0c;是将源代码转换为机器可以识别的二进制指令&#xff1b; 运行环境也可以称为执行环境&#xff0c;用于实际执行代码&#xff1b; 翻译环境 翻译环境由编译和链接两个部分组成&#xff0c;而编译又可以分解为&#x…...

springBoot整合 Tess4J实现OCR识别文字(图片+PDF)

1. 环境准备 JDK 8 或更高版本Maven 3.6 或更高版本Spring Boot 2.4 或更高版本Tesseract OCR 引擎Tess4J 库 2. 安装 Tesseract OCR 引擎 下载地址&#xff1a; Home UB-Mannheim/tesseract Wiki GitHub linux直接安装&#xff1a;sudo apt-get install tesseract-ocr 3.…...

阿里数字人工作 Emote Portrait Alive (EMO):基于 Diffusion 直接生成视频的数字人方案

TL;DR 2024 年 ECCV 阿里智能计算研究所的数字人工作&#xff0c;基于 diffusion 方法来直接的从音频到视频合成数字人&#xff0c;避免了中间的三维模型或面部 landmark 的需求&#xff0c;效果很好。 Paper name EMO: Emote Portrait Alive - Generating Expressive Portra…...

Java将PDF保存为图片

将 PDF 文件转换为图片是常见的需求之一&#xff0c;特别是在需要将 PDF 内容以图像形式展示或处理时。其中最常用的是 Apache PDFBox。 使用 Apache PDFBox Apache PDFBox 是一个开源的 Java 库&#xff0c;可以用来处理 PDF 文档。它提供了将 PDF 页面转换为图像的功能。 …...

医药企业的终端市场营销策略

近年来&#xff0c;随着医药行业的快速发展&#xff0c;终端市场逐渐成为企业竞争的关键领域。在政策趋严、市场环境变化以及数字化转型的大背景下&#xff0c;医药企业如何在终端市场中立于不败之地&#xff1f;本文结合我们在医药数字化领域的经验&#xff0c;为大家剖析终端…...

使用EFK收集k8s日志

首先我们使用EFK收集Kubernetes集群中的日志&#xff0c;本次实验讲解的是在Kubernetes集群中启动一个Elasticsearch集群&#xff0c;如果企业内已经有了Elasticsearch集群&#xff0c;可以直接将日志输出至已有的Elasticsearch集群。 文章目录 部署elasticsearch创建Kibana创建…...

Vue3 + TypeScript 项目搭建

Vue3 TypeScript 项目搭建 环境准备 首先确保你的开发环境满足以下要求&#xff1a; # 检查 Node.js 版本 (需要 14.0 或更高版本) node -v# 检查 npm 版本 npm -v# 安装或更新 Vue CLI npm install -g vue/cli创建项目 使用 Vue CLI 创建项目&#xff1a; # 创建项目 np…...

Python操作neo4j库py2neo使用(一)

Python操作neo4j库py2neo使用&#xff08;一&#xff09; 安装&#xff08;只用于测试&#xff09; docker-compose .yml 文件 version: 3.8 services:neo4j:image: neo4j:5.6.0-enterprise #商业版镜像hostname: neo4jcontainer_name: neo4jports:- "7474:7474"-…...

(原创)Android Studio新老界面UI切换及老版本下载地址

前言 这两天下载了一个新版的Android Studio&#xff0c;发现整个界面都发生了很大改动&#xff1a; 新的界面的一些设置可参考一些博客&#xff1a; Android Studio新版UI常用设置 但是对于一些急着开发的小伙伴来说&#xff0c;没有时间去适应&#xff0c;那么怎么办呢&am…...

Linux——用户级缓存区及模拟实现fopen、fweite、fclose

linux基础io重定向-CSDN博客 文章目录 目录 文章目录 什么是缓冲区 为什么要有缓冲区 二、编写自己的fopen、fwrite、fclose 1.引入函数 2、引入FILE 3.模拟封装 1、fopen 2、fwrite 3、fclose 4、fflush 总结 前言 用快递站讲述缓冲区 收件区&#xff08;类比输…...

CKA认证 | Day2 K8s内部监控与日志

第三章 Kubernetes监控与日志 1、查看集群资源状态 在 Kubernetes 集群中&#xff0c;查看集群资源状态和组件状态是非常重要的操作。以下是一些常用的命令和解释&#xff0c;帮助你更好地管理和监控 Kubernetes 集群。 1.1 查看master组件状态 Kubernetes 的 Master 组件包…...

大模型部署,运维,测试所需掌握的知识点

python环境部署: python3 -m site --user-base 返回用户级别的Python安装基础目录 sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1 将python3的默认路径/usr/bin/python3替…...

JDBC编程---Java

目录 一、数据库编程的前置 二、Java的数据库编程----JDBC 1.概念 2.JDBC编程的优点 三.导入MySQL驱动包 四、JDBC编程的实战 1.创造数据源&#xff0c;并设置数据库所在的位置&#xff0c;三条固定写法 2.建立和数据库服务器之间的连接&#xff0c;连接好了后&#xff…...

什么是沙箱(Sandbox)技术

沙箱技术是一种重要的计算机安全机制&#xff0c;主要用于隔离程序运行环境&#xff0c;以防止恶意代码或应用程序对系统和数据造成破坏。通过限制代码的访问权限和行为&#xff0c;沙箱为程序提供了一个受控且隔离的执行环境。 核心特点 隔离性沙箱运行的程序被限制在一个受控…...

TCP socket api详解

文章目录 netstat -nltpaccept简单客户端工具 telnet 指定服务连接connect异常处理version 1 单进程版version 2 多进程版version 3 -- 多线程版本version 4 ---- 线程池版本 创建套接字socket sockaddr_in结构体 bind 之后就和UDP不一样了。 因为TCP是一个面向连接的服务器&…...

Linux——环境变量

环境变量一般指的是在操作系统重用来指定操作系统运行环境的一些参数&#xff0c;这些参数会被bash使用&#xff0c;而bash是被我们用户使用的&#xff0c;也就是说&#xff0c;这些环境变量间接的也是被我们用户使用的。环境变量通常都有某些特殊的用途&#xff0c;它在系统重…...

Windows Pycharm 远程 Spark 开发 PySpark

一、环境版本 环境版本PyCharm2024.1.2 (Professional Edition)Ubuntu Kylin16.04Hadoop3.3.5Hive3.1.3Spark2.4.0 二、Pycharm远程开发 文件-远程-开发 选择 SSH连接&#xff0c;连接虚拟机&#xff0c;选择项目目录即可远程开发...

【es6进阶】vue3中的数据劫持的最新实现方案的proxy的详解

vuejs中实现数据的劫持,v2中使用的是Object.defineProperty()来实现的&#xff0c;在大版本v3中彻底重写了这部分&#xff0c;使用了proxy这个数据代理的方式&#xff0c;来修复了v2中对数组和对象的劫持的遗留问题。 proxy是什么 Proxy 用于修改某些操作的默认行为&#xff0…...

【Isaac Sim】加载自带模型或示例时报 Isaac Sim is not responding

Isaac Sim对电脑配置要求很高&#xff0c;开机第一次打开 Isaac Sim 时&#xff0c;直接就报 Isaac Sim is not responding 卡死了&#xff0c;这是由于第一次需要加载一些资源&#xff0c;耗时会导致 Isaac Sim 无响应&#xff0c;这里等一会会自动给回复。 加载自带模型或示…...

React (三)

文章目录 项目地址十二、性能优化12.1 使用useMemo避免不必要的计算12.2 使用memo缓存组件,防止过度渲染12.3 useCallBack缓存函数12.4 useCallBack里访问之前的状态(没懂)十三、Styled-Components13.1 安装13.2给普通html元素添加样式13.3 继承和覆盖样式13.4 给react组件添…...

C0031.在Clion中使用mingw编译器来编译opencv的配置方法

mingw编译器编译opencv库的配置方法...

多目标跟踪算法

文章目录 一、传统方法1. 基于卡尔曼滤波器的方法1.1 Kalman Filter(卡尔曼滤波器) 2. 基于数据关联的方法2.1 匈牙利算法 二、深度学习方法1. 基于检测的多目标跟踪1.1 SORT算法1.2 DeepSort1.3 BoT-SORT 2. 基于特征关联和增强的方法2.1 ByteTrack 3. 基于Transformer的方法3…...

【CSS in Depth 2 精译_059】9.2 把 CSS 模块组合成更大的结构

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第九章 CSS 的模块化与作用域】 ✔️ 9.1 模块的定义 9.1.1 模块和全局样式9.1.2 一个简单的 CSS 模块9.1.3 模块的变体9.1.4 多元素模块 9.2 将模块组合为更大的结构 ✔️ 9.2.1 模块中多个职责的…...

uniapp+vue3+ts H5端使用Quill富文本插件以及解决上传图片反显的问题

uniappvue3ts H5端使用Quill富文本插件以及解决上传图片反显的问题 1.在项目中安装Quill npm i quill1.3.72.需要显示富文本的页面完整代码 <template><view><div ref"quillEditor" style"height: 65vh"></div></view> &…...

shell(二)

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…...

在使用PCA算法进行数据压缩降维时,如何确定最佳维度是一个关键问题?

一、PCA算法的基本原理 PCA算法的核心思想是通过正交变换&#xff0c;将一组可能相关的变量转换成一组线性不相关的变量&#xff0c;称为主成分。这组主成分能够以最小的信息损失来尽可能多地保留原始数据集的变异性。具体来说&#xff0c;PCA算法包括以下几个步骤&#xff1a…...

学习嵩山版《Java 开发手册》:编程规约 - 命名风格(P1 ~ P2)

概述 《Java 开发手册》是阿里巴巴集团技术团队的集体智慧结晶和经验总结&#xff0c;他旨在提升开发效率和代码质量 《Java 开发手册》是一本极具价值的 Java 开发规范指南&#xff0c;对于提升开发者的综合素质和代码质量具有重要意义 学习《Java 开发手册》是一个提升 Jav…...

#渗透测试#红蓝攻防#HW#SRC漏洞挖掘01之静态页面渗透

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…...

开源POC库推荐

声明 学习视频来自 B 站UP主泷羽sec&#xff0c;如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识&#xff0c;以下网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 ✍&#x1f3fb;作者简介&#xff1a;致…...

深度学习每周学习总结J6(ResNeXt-50 算法实战与解析 - 猴痘识别)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 0. 总结ResNeXt基本介绍 1. 设置GPU2. 导入数据及处理部分3. 划分数据集4. 模型构建部分5. 设置超参数&#xff1a;定义损失函数&…...

用vite下载的react + TS的项目,组件会调用两次

解决方案: 去掉main.tsx文件中的StrictMode...

STM32F4----DCA数字量转换成模拟量

STM32F4----DCA数字量转换成模拟量 基本原理 上一节讲诉了ADC的具体原理与程序搭建https://blog.csdn.net/qq_35970934/article/details/143999874?spm1001.2014.3001.5501。这节讲DAC的原理和程序&#xff0c;在实际应用中&#xff0c;我们经常需要调节电压的输出大小&…...

springboot3如何集成knife4j 4.x版本及如何进行API注解

1. 什么是Knife4j knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案, 取名knife4j是希望她能像一把匕首一样小巧,轻量,并且功能强悍!knife4j的前身是swagger-bootstrap-ui,swagger-bootstrap-ui自1.9.6版本后,正式更名为knife4j为了契合微服务的架构发展,由于原来…...

【Linux网络 (二)】套接字编程

Linux: 网络 一、前言二、端口号 (port)1&#xff09;port、套接字概念2&#xff09;端口号 vs 进程id3&#xff09;端口号和进程关系 三、认识TCP/Udp协议1&#xff09;连接性解释2&#xff09;可靠性解释3&#xff09;面向数据报/字节流解释 四、网络字节序五、struct sockad…...

SQL 语句执行计划中的连接方式

SQL 语句执行计划中的连接方式 join操作 join操作基本分为3大类&#xff1a;外连接&#xff08;细分为&#xff1a;左连接&#xff08;Left outer join/ left join&#xff09;、右连接&#xff08;right outer join/ right join&#xff09;、全连接&#xff08;full outer …...

3、集线器、交换机、路由器、ip的关系。

集线器、交换机、路由器三者的关系 1、集线器2、交换机&#xff08;每个交换机是不同的广播域&#xff0c;ip地址起到划分广播域的作用&#xff09;3、 路由器4、ip地址 1、集线器 一开始两台电脑通信就需要网线就可以&#xff0c;但是三台或者更多主机通信时&#xff0c;就需…...