从0开始搭建一套工具函数库,发布npm,支持commonjs模块es模块和script引入使用
文章目录
- 文章目标
- 技术选型
- 工程搭建
- 1. 初始化项目
- 2. 安装开发依赖
- 3. 项目结构
- 4. 配置文件
- tsconfig.json
- .eslintrc.js
- eslint.config
- .prettierrc.js
- rollup.config.cjs
- 创建 .gitignore文件
- 设置 Git 钩子
- 创建示例工具函数
- 8. 版本管理和发布
- 9 工具函数测试方案
- 1. 安装测试依赖
- 2. 配置 Jest
- 更新 tsconfig.json
- 4. 编写测试用例
- 最后的package.json
- 最后工程目录
- 构建结果目录
- 发布npm
- 1.注册npm账号
- 2.登录npm
- 3.构建生产版本
- 4.模拟发布测试
- 6. 实际发布
- 7.发布403错误
- 8.发布成功验证
- npm包地址
- 总结
文章目标
- 从0开始。搭建一套自己的工具函数库,工程打包后支持commonjs模块的引入,es模块的引入。还支持script的形式引入。还支持工程化项目的unplugin-auto-import插件。并将打包结果发布到npm。这套模板也可以用于封装一些个性化的js库,不单单限于工具函数库的一套工程化模板。
技术选型
- 构建工具:rollup
- 语言:typescript
- 代码规范:eslint阿里规范
- 工程模块:es模块
工程搭建
1. 初始化项目
首先创建项目目录并初始化 npm:
mkdir cm-utils
cd my-utils
npm init -y
2. 安装开发依赖
安装所有必要的开发依赖:
npm install -D typescript rollup @rollup/plugin-node-resolve @rollup/plugin-commonjs @rollup/plugin-typescript @rollup/plugin-terser rollup-plugin-dts rimrafnpm install -D eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin eslint-config-ali prettier eslint-config-prettier eslint-plugin-prettiernpm install -D husky lint-staged
3. 项目结构
创建以下目录结构:
my-utils/
├── src/
│ ├── index.ts # 主入口文件
│ ├── utils/ # 工具函数目录
│ │ ├── debounce.ts
│ │ ├── throttle.ts
│ │ └── ... # 其他工具函数
├── test/ # 测试目录
├── .eslintrc.js # ESLint 配置
├── .prettierrc.js # Prettier 配置
├── tsconfig.json # TypeScript 配置
├── rollup.config.js # Rollup 配置
└── package.json
4. 配置文件
tsconfig.json
{"compilerOptions": {"target": "es6","module": "esnext","strict": true,"moduleResolution": "node","esModuleInterop": true,"skipLibCheck": true,"forceConsistentCasingInFileNames": true,"baseUrl": ".","paths": {"@/*": ["src/*"]},"lib": ["es6", "dom"],"outDir": "dist/ts_temp"},"include": ["src/**/*"],"exclude": ["node_modules", "dist", "**/*.test.ts"],"types": ["jest", "node"]
}
.eslintrc.js
module.exports = {settings: {'import/resolver': {node: {extensions: ['.js', '.jsx', '.ts', '.tsx'],},},},fixOnSave: true,extends: ['ali','plugin:@typescript-eslint/recommended','prettier','plugin:prettier/recommended',],parser: '@typescript-eslint/parser',plugins: ['@typescript-eslint'],root: true,env: {node: true,jest: true,},ignorePatterns: ['.eslintrc.js'],rules: {'@typescript-eslint/interface-name-prefix': 'off','@typescript-eslint/explicit-function-return-type': 'off','@typescript-eslint/explicit-module-boundary-types': 'off','@typescript-eslint/no-explicit-any': 'off','no-explicit-any': 'off',},
};
eslint.config
- 在项目根目录下执行如下命令
npx eslint --init
# 根据命令行提示进行安装
.prettierrc.js
module.exports = {semi: true,trailingComma: 'all',singleQuote: true,printWidth: 100,tabWidth: 2,arrowParens: 'avoid',
};
rollup.config.cjs
const resolve = require('@rollup/plugin-node-resolve');
const commonjs = require('@rollup/plugin-commonjs');
const typescript = require('@rollup/plugin-typescript');
const terser = require('@rollup/plugin-terser');
const dts = require('rollup-plugin-dts').default;
const path = require('path');
const fs = require('fs');// 彻底清理目录
const cleanDist = () => {if (fs.existsSync('dist')) {fs.rmSync('dist', { recursive: true, force: true });}fs.mkdirSync('dist', { recursive: true });
};cleanDist();const packageJson = require('./package.json');// 每个构建目标独立配置
const builds = [// 1. 先单独生成类型声明{input: 'src/index.ts',output: {file: 'dist/types/index.d.ts',format: 'esm',},plugins: [typescript({tsconfig: './tsconfig.json',declaration: true,declarationDir: 'dist/types',emitDeclarationOnly: true, // 只生成声明outDir: 'dist/types', // 必须与declarationDir相同}),],},// 2. ESM构建{input: 'src/index.ts',output: {file: packageJson.module,format: 'esm',sourcemap: true,},plugins: [resolve(),commonjs(),typescript({tsconfig: './tsconfig.json',outDir: path.dirname(packageJson.module),declaration: false, // 禁用声明生成}),],},// 3. CJS构建{input: 'src/index.ts',output: {file: packageJson.main,format: 'cjs',sourcemap: true,},plugins: [resolve(),commonjs(),typescript({tsconfig: './tsconfig.json',outDir: path.dirname(packageJson.main),declaration: false,}),],},// 4. UMD构建{input: 'src/index.ts',output: {file: 'dist/cm-utils.umd.js',format: 'umd',name: 'MyUtils',sourcemap: true,},plugins: [resolve(),commonjs(),typescript({tsconfig: './tsconfig.json',outDir: 'dist',declaration: false,}),],},// 5. UMD压缩版{input: 'src/index.ts',output: {file: 'dist/cm-utils.umd.min.js',format: 'umd',name: 'MyUtils',sourcemap: true,},plugins: [resolve(),commonjs(),typescript({tsconfig: './tsconfig.json',outDir: 'dist',declaration: false,}),terser(),],},// 6. 最终类型声明处理{input: 'dist/types/index.d.ts',output: {file: 'dist/index.d.ts',format: 'esm',},plugins: [dts()],external: [/\.(css|less|scss)$/],},
];// 只导出非空配置
module.exports = builds.filter(Boolean);
创建 .gitignore文件
node_modules
设置 Git 钩子
初始化 husky 并设置 pre-commit 钩子:
npx husky install
npx husky add .husky/pre-commit "npx lint-staged"
创建 .lintstagedrc.json 文件:
{"src/**/*.ts": ["eslint --fix","prettier --write"]
}
创建示例工具函数
在 src/utils/debounce.ts 中
type DebounceFunction<T extends (...args: any[]) => any> = (...args: Parameters<T>
) => void;export function debounce<T extends (...args: any[]) => any>(func: T,wait: number,immediate?: boolean
): DebounceFunction<T> {let timeout: ReturnType<typeof setTimeout> | null;return function (this: any, ...args: Parameters<T>) {const context = this;const later = () => {timeout = null;if (!immediate) func.apply(context, args);};const callNow = immediate && !timeout;if (timeout) clearTimeout(timeout);timeout = setTimeout(later, wait);if (callNow) func.apply(context, args);};
}
在 src/index.ts 中:
export * from './utils/debounce';
// 导出其他工具函数...
8. 版本管理和发布
安装 standard-version 用于版本管理:
npm install -D standard-version
更新 package.json 的 scripts:
{"scripts": {"release": "standard-version && npm publish"}
}
9 工具函数测试方案
为了确保你的工具函数库质量,我会为你提供一套完整的测试方案。我们将使用 Jest 测试框架来测试 TypeScript 编写的工具函数。
1. 安装测试依赖
npm install -D jest @types/jest ts-jest @jest/globals
2. 配置 Jest
创建 jest.config.js
module.exports = {preset: 'ts-jest',testEnvironment: 'node',moduleFileExtensions: ['ts', 'js', 'json'],rootDir: '.',testRegex: '.*\\.test\\.ts$',transform: {'^.+\\.(t|j)s$': 'ts-jest',},collectCoverageFrom: ['src/**/*.(t|j)s'],coverageDirectory: './coverage',coverageReporters: ['text', 'html'],coverageThreshold: {global: {branches: 80,functions: 80,lines: 80,statements: 80,},},
};
更新 tsconfig.json
确保 TypeScript 配置支持测试类型:
{"compilerOptions": {// ...其他配置保持不变"types": ["jest", "node"]}
}
4. 编写测试用例
示例:测试 debounce 函数
在 test/utils/debounce.test.ts 中:
import { debounce } from '../../src/utils/debounce';
import { jest } from '@jest/globals';describe('debounce', () => {jest.useFakeTimers();it('should delay the function call', () => {const mockFn = jest.fn();const debounced = debounce(mockFn, 1000);debounced();expect(mockFn).not.toHaveBeenCalled();// 快进时间jest.advanceTimersByTime(500);expect(mockFn).not.toHaveBeenCalled();// 快进剩余时间jest.advanceTimersByTime(500);expect(mockFn).toHaveBeenCalledTimes(1);});it('should call function immediately if immediate is true', () => {const mockFn = jest.fn();const debounced = debounce(mockFn, 1000, true);debounced();expect(mockFn).toHaveBeenCalledTimes(1);// 快进时间不应再次调用jest.advanceTimersByTime(1000);expect(mockFn).toHaveBeenCalledTimes(1);});it('should cancel previous call when called multiple times', () => {const mockFn = jest.fn();const debounced = debounce(mockFn, 1000);debounced();jest.advanceTimersByTime(500);debounced(); // 取消前一个调用jest.advanceTimersByTime(500);expect(mockFn).not.toHaveBeenCalled();jest.advanceTimersByTime(500);expect(mockFn).toHaveBeenCalledTimes(1);});it('should pass arguments correctly', () => {const mockFn = jest.fn();const debounced = debounce(mockFn, 1000);debounced('arg1', 'arg2');jest.runAllTimers();expect(mockFn).toHaveBeenCalledWith('arg1', 'arg2');});
});
最后的package.json
{"name": "@renjinming/xm-utils","version": "1.0.0","description": "A collection of utility functions","main": "dist/cjs/index.js","module": "dist/esm/index.js","types": "dist/index.d.ts","files": ["dist"],"type": "commonjs","scripts": {"clean": "rimraf dist","build:pwd": "npm run clean && rollup -c --bundleConfigAsCjs","build": "rollup -c --bundleConfigAsCjs","prepublishOnly": "npm run build","lint": "eslint src --ext .ts","format": "prettier --write \"src/**/*.ts\"","prepare": "husky install","release": "standard-version && npm publish","test": "jest","test:watch": "jest --watch","test:coverage": "jest --coverage","test:ci": "jest --ci --coverage"},"keywords": ["utils","utilities","tools","functions"],"author": "Your Name","license": "MIT","devDependencies": {"@eslint/js": "^9.25.0","@eslint/json": "^0.12.0","@jest/globals": "^29.7.0","@rollup/plugin-commonjs": "^28.0.3","@rollup/plugin-node-resolve": "^16.0.1","@rollup/plugin-terser": "^0.4.4","@rollup/plugin-typescript": "^12.1.2","@types/jest": "^29.5.14","@typescript-eslint/eslint-plugin": "^8.30.1","@typescript-eslint/parser": "^8.30.1","eslint": "^9.25.0","eslint-config-ali": "^16.1.1","eslint-config-prettier": "^10.1.2","eslint-plugin-prettier": "^5.2.6","globals": "^16.0.0","husky": "^9.1.7","jest": "^29.7.0","lint-staged": "^15.5.1","prettier": "^3.5.3","rimraf": "^5.0.10","rollup": "^4.40.0","rollup-plugin-dts": "^6.2.1","standard-version": "^9.5.0","ts-jest": "^29.3.2","typescript": "^5.8.3","typescript-eslint": "^8.30.1"},"lint-staged": {"*.{js,ts,jsx,tsx}": ["eslint --fix","prettier --write"]},"publishConfig": {"access": "public"}
}
最后工程目录
构建结果目录
发布npm
1.注册npm账号
https://www.npmjs.com/signup
2.登录npm
- 需要注意一点的是,大家的npm镜像地址可能设置的都是淘宝镜像,需要先切换为npm官方镜像地址
npm config set registry https://registry.npmjs.org/
然后在登录
npm login
3.构建生产版本
npm run build
版本号管理(可选)
手动修改:直接编辑 package.json 中的 version 字段。
自动升级(推荐):
npx standard-version
会根据 Git 提交记录自动升级版本号(major/minor/patch)。
4.模拟发布测试
npm pack --dry-run
➔ 检查输出的文件列表是否仅包含 dist/ 和必要的配置文件。
6. 实际发布
npm publish
- 如果是修改提交必须要修改版本信息,不然提交会403 执行上面的升级命令在进行发布
➔ 若包名冲突或无权限,会报错。
7.发布403错误
如果发布403可能是包名已经存在。可以用下面的命令试试看有没有,如果存在可以修改package.json的name重新定义包名
npm view @renjinming/xm-utils # 检查包名占用
8.发布成功验证
- 查询包在npm上的所有版本
npm view @renjinming/xm-utils versions
- 安装使用,我这里为了方便就用node环境简单演示一下
npm i @renjinming/xm-utils
const { getObjType } = require("@renjinming/xm-utils");
const type = getObjType("123");
console.log(type); // "string"const type2 = getObjType(123);
console.log(type2); // "number"const type3 = getObjType({ name: "renjinming" });
console.log(type3); // "object"const type4 = getObjType([1, 2, 3]);
console.log(type4); // "array"const type5 = getObjType(null);
console.log(type5); // "null"const type6 = getObjType(undefined);
console.log(type6); // "undefined"
const type7 = getObjType(function () {});
console.log(type7); // "function"const type8 = getObjType(new Date());
console.log(type8); // "date"
const type9 = getObjType(/a/);
console.log(type9); // "regexp"
npm包地址
https://www.npmjs.com/package/@renjinming/xm-utils
总结
- 文档是后面整理的,可能会少了有些内容,项目已上传git,可以直接clone,https://gitee.com/public_12/xm-utlis-templet
- 遗留的问题。由于个人对jest测试框架不是很熟悉,测试用例也没写完整,还有就是在commit代码时,没有自动校验代码,不晓得问题在哪里,阁下要是有解决方案,或者是对项目有更好的改进。欢迎留言或者提交 PR,我个人也会持续的改进。
- 整理不易,如果对你有所帮助 记得点个赞喔,
相关文章:
从0开始搭建一套工具函数库,发布npm,支持commonjs模块es模块和script引入使用
文章目录 文章目标技术选型工程搭建1. 初始化项目2. 安装开发依赖3. 项目结构4. 配置文件tsconfig.json.eslintrc.jseslint.config.prettierrc.jsrollup.config.cjs创建 .gitignore文件 设置 Git 钩子创建示例工具函数8. 版本管理和发布9 工具函数测试方案1. 安装测试依赖2. 配…...
精通 Spring Cache + Redis:避坑指南与最佳实践
Spring Cache 以其优雅的注解方式,极大地简化了 Java 应用中缓存逻辑的实现。结合高性能的内存数据库 Redis,我们可以轻松构建出响应迅速、扩展性强的应用程序。然而,在享受便捷的同时,一些常见的“坑”和被忽视的最佳实践可能会悄…...
DSP28335入门学习——第一节:工程项目创建
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.20 DSP28335开发板学习——第一节:工程项目创建 前言开发板说明引用解答…...
Docker Registry(镜像仓库)
官方架构 Docker 使用客户端 - 服务器 (C/S) 架构模式,使用远程 API 来管理和创建 Docker 容器。Docker 容器通过 Docker 镜像来创建。 Docker 仓库(Registry):Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hu…...
通过Dify快速搭建本地AI智能体开发平台
1. 安装Docker Desktop 访问 Docker官网 点击Download Docker Desktop,直接按照官方要求来就可以。 # 这串命令就像魔法咒语,在黑色窗口(命令提示符)里输入就能检查安装是否成功 docker --version2.安装dify 3.运行 Ollama 大…...
计算机视觉与深度学习 | Transformer原理,公式,代码,应用
Transformer 详解 Transformer 是 Google 在 2017 年提出的基于自注意力机制的深度学习模型,彻底改变了序列建模的范式,解决了 RNN 和 LSTM 在长距离依赖和并行计算上的局限性。以下是其原理、公式、代码和应用的详细解析。 一、原理 核心架构 Transformer 由 编码器(Encod…...
skywalking agent 关联docker镜像
Apache SkyWalking 提供了多种方式来部署和使用 SkyWalking Agent,包括在 Docker 容器中运行的应用。虽然 SkyWalking Agent 本身不是一个独立的 Docker 镜像,但你可以通过几种方式将 SkyWalking Agent 集成到你的 Docker 应用中。 方式一:手…...
【中间件】nginx将请求负载均衡转发给网关,网关再将请求转发给对应服务
一、场景 前端将请求发送给nginx,nginx将请求再转发给网关,网关再将请求转发至对应服务。由于网关会部署在多台服务器上,因此nginx需要负载均衡给网关发请求。nginx所有配置均参照官方文档nginx开发文档,可参考负载均衡板块内容 二…...
Milvus(1):什么是 Milvus
Milvus 由 Zilliz 开发,并很快捐赠给了 Linux 基金会下的 LF AI & Data 基金会,现已成为世界领先的开源向量数据库项目之一。它采用 Apache 2.0 许可发布,大多数贡献者都是高性能计算(HPC)领域的专家,擅…...
第十六节:高频开放题-React与Vue设计哲学差异
响应式原理(Proxy vs 虚拟DOM) 组合式API vs Hooks React 与 Vue 设计哲学差异深度解析 一、响应式原理的底层实现差异 1. Vue 的响应式模型(Proxy/数据劫持) Vue 的响应式系统通过 数据劫持 实现自动依赖追踪: • …...
【Hot100】 240. 搜索二维矩阵 II
目录 引言搜索二维矩阵 II我的解题贪心求解解题思路详解搜索策略(以从右上角开始为例)为什么这种方法有效? 完整代码实现复杂度分析示例演示 🙋♂️ 作者:海码007📜 专栏:算法专栏Ὂ…...
每日面试实录·携程·社招·JAVA
📍面试公司:携程 👜面试岗位:后端开发工程师(社招) 🕐面试时长:约 50 分钟 🔄面试轮次:第 1 轮技术面 ✨面试整体节奏: 这场携程的社招 Java 一面…...
Oracle--用户管理
前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 用户管理在 Oracle 数据库中至关重要。一个服务器通常只运行一个 Oracle 实例,而一个 Oracle 用户代表一个用户群,他们通过该用…...
20.3 使用技巧5
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的 20.3.8 CellContentClick事件 当增加新按钮列或者超链接列后,按钮或者超链接,会发现,按钮或者超链…...
Kubernetes相关的名词解释Metrics Server组件(7)
什么是Metrics Server? Metrics Server 是 Kubernetes 集群中的一个关键组件,主要用于资源监控和自动扩缩容。 kubernetes 从1.8版本开始不再集成cadvisor,也废弃了heapster,使用metrics server来提供metrics。那么...... 什么…...
17.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--SonarQube部署与配置
在将孢子记账系统从单体架构转向微服务架构的过程中,代码质量的管理变得尤为重要。随着项目规模的扩大和团队协作的深入,我们需要一个强大的工具来帮助我们持续监控和改进代码质量。我们首选SonarQube,它能够帮助我们识别代码中的潜在问题、技…...
计算机是如何看待数据的?
一、计算机如何“看待”数据? 物理层本质: 计算机的所有数据最终以二进制(0和1)在电路中表示(高电平1,低电平0)。 无论你用何种进制描述数据(如十六进制 0xA1 或十进制 161…...
25.4.20学习总结
如何使用listView组件来做聊天界面 1. 什么是CellFactory? 在JavaFX中,控件(比如ListView、TableView等)用Cell来显示每一条数据。 Cell:代表这个单元格(即每个列表项)中显示的内容和样式。 …...
SpringBoot3集成ES8.15实现余额监控
1. gradle依赖新增 implementation org.springframework.boot:spring-boot-starter-data-elasticsearch implementation co.elastic.clients:elasticsearch-java:8.15.02. application.yml配置 spring:elasticsearch:uris: http://localhost:9200username: elasticpassword: …...
STM32基础教程——串口收发
目录 前言 字长设置 编辑 停止位 起始位侦测 波特率 1. UART波特率的基本原理 2. 为什么需要先除以分频因子(USARTDIV)? (1)PCLK频率太高 (2)分频因子的作用 3. 为什么还需要再除以…...
Matlab 步进电机传递函数模糊pid
1、内容简介 Matlab 210-步进电机传递函数模糊pid 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
unordered_map、unordered_set详解
深入理解C中的 unordered_map 和 unordered_set 在C标准库中,unordered_map 和 unordered_set 是两个基于哈希表(Hash Table)实现的高效容器。它们以O(1)的平均时间复杂度实现快速查找、插入和删除操作,特别适合需要高频…...
详解trl中的GRPOTrainer和GRPOConfig
引言 在大型语言模型(LLM)的强化学习微调领域, Group Relative Policy Optimization (GRPO) 算法因其高效性和资源友好性受到广泛关注。Hugging Face的 TRL (Transformer Reinforcement Learning) 库通过GRPOTrainer和GRPOConfig提供了该算法的开箱即用实现。本文将深入解析…...
【C++】多态 - 从虚函数到动态绑定的核心原理
📌 个人主页: 孙同学_ 🔧 文章专栏:C 💡 关注我,分享经验,助你少走弯路 文章目录 1. 多态的概念2. 多态的定义及实现2.1 多态的构成条件2.1.1实现多态还有两个必须重要条件:2.1.2 虚…...
项目预期管理:超越甘特图,实现客户价值交付
引言 在项目管理实践中,许多项目经理习惯于将注意力集中在甘特图的进度条上,关注任务是否按时完成、里程碑是否达成。然而,这种以计划管理为中心的方法往往忽略了项目管理的核心目标:满足客户预期,交付真正的价值。项…...
FISCO 2.0 安装部署WeBASE与区块链浏览器(环境搭建)
FISCO BCOS 2.0 安装部署WeBASE与区块链浏览器-对应的官网地址: WeBASE平台:https://webasedoc.readthedocs.io/zh-cn/latest/docs/WeBASE/install.html 区块链浏览器:https://fisco-bcos-documentation.readthedocs.io/zh-cn/latest/docs/br…...
xss学习3之服务端session
一、服务端的Session 1. cookie和session 1)cookie和session对比 cookie: 保存在客户端,包含所有key-value信息,浏览器访问多个网站时会积累大量cookie,占用存储空间,并在每次请求时携带所有cookie,增加…...
23种设计模式-结构型模式之适配器模式(Java版本)
Java 适配器模式(Adapter Pattern)详解 🔌 什么是适配器模式? 适配器模式用于将一个类的接口转换成客户端所期望的另一种接口,让原本接口不兼容的类可以协同工作。 📦 就像插头转换器,让不同…...
【2025计算机网络-面试常问】http和https区别是什么,http的内容有哪些,https用的是对称加密还是非对称加密,流程是怎么样的
HTTP与HTTPS全面对比及HTTPS加密流程详解 一、HTTP与HTTPS核心区别 特性HTTPHTTPS协议基础明文传输HTTP SSL/TLS加密层默认端口80443加密方式无加密混合加密(非对称对称)证书要求不需要需要CA颁发的数字证书安全性易被窃听、篡改、冒充防窃听、防篡改…...
使用安全继电器的急停电路设计
使用安全继电器的急停电路设计 一,急停回路的设计1,如何将急停接到线路当中?2,急停开关 如何接到安全继电器中 一,急停回路的设计 急停是每一个设备必不可少的部分,因为关乎安全,所以说所以说他…...
SpringCloud概述和环境搭建
SpringCloud概述和环境搭建 一.微服务的引入1.单体架构2.集群和分布式架构3.集群和分布式4.微服务架构4.微服务的优缺点 二.微服务解决方案-SpringCloud1.Spring Cloud简介2.Spring Cloud版本3.Spring Cloud实现方案4.Spring Cloud Alibaba 三.环境搭建1.安装JDK172.Ubantu上下…...
System.out 详解
System.out 详解 System.out 是 Java 提供的标准输出流(PrintStream 类型),默认关联控制台(Console),用于向终端打印文本信息。它是 Java 中最常用的输出方式之一,尤其在调试和命令行程序开发中。 1. 核心知识点 (1)System.out 的本质 类型:PrintStream(字节流,但…...
每天学一个 Linux 命令(28):ln
可访问网站查看,视觉品味拉满: http://www.616vip.cn/28/index.html ln 是 Linux 中用于创建文件或目录链接的命令,主要生成硬链接(Hard Link)和符号链接(Symbolic Link,软链接)。链接常用于文件共享、快捷访问或版本管理。 命令格式 ln [选项] 源文件 目标链接链…...
【微知】服务器如何获取服务器的SN序列号信息?(dmidecode -t 1)
文章目录 背景命令dmidecode -t的数字代表的字段 背景 各种场景都需要获取服务器的SN(Serial Number),比如问题定位,文件命名,该部分信息在dmi中是标准信息,不同服务器,不同os都能用相同方式获…...
4.20刷题记录(单调栈)
第一部分:简单介绍 单调栈我的理解是在栈中存储数字出现的位置,然后通过遍历比较当前栈顶元素与当前元素的大小关系,从而确定逻辑相关顺序。 第二部分:真题讲解 (1)739. 每日温度 - 力扣(Lee…...
Opencv图像处理:模板匹配对象
文章目录 一、模板匹配1、什么是模板匹配?2、原理 二、单模板匹配(代码实现)1、预处理2、 开始模板匹配并绘制匹配位置的外接矩形 三、多模板匹配(代码实现)1、读取图片和模板2、模板匹配3、设置阈值1)阈值…...
Web3.0热门领域NFT项目实战课程
课程大小:3.8G 课程下载:https://download.csdn.net/download/m0_66047725/90616383 更多资源下载:关注我 深度掌握Solidity合约开发,助力成为抢手的Web3.0开发工程师 深入Web3.0技术的人才,一将难求。本课程由We…...
DAY 50 leetcode 1047--栈和队列.删除字符串中的所有相邻重复项
题号1047 给出由小写字母组成的字符串 s,重复项删除操作会选择两个相邻且相同的字母,并删除它们。 在 s 上反复执行重复项删除操作,直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 import java.util.Ar…...
单例模式与消费者生产者模型,以及线程池的基本认识与模拟实现
前言 今天我们就来讲讲什么是单例模式与线程池的相关知识,这两个内容也是我们多线程中比较重要的内容。其次单例模式也是我们常见设计模式。 单例模式 那么什么是单例模式呢?上面说到的设计模式又是什么? 其实单例模式就是设计模式的一种。…...
微信小程序通过mqtt控制esp32
目录 1.注册巴法云 2.设备连接mqtt 3.微信小程序 备注 本文esp32用的是MicroPython固件,MQTT服务用的是巴法云。 本文参考巴法云官方教程:https://bemfa.blog.csdn.net/article/details/115282152 1.注册巴法云 注册登陆并新建一个topicÿ…...
QML、Qt Quick 、Qt Quick Controls 2
一、概念 基本关系 QML 是声明式语言,用于描述用户界面。声明式语法(类似JSON+JavaScript),定义UI结构和行为。 Qt Quick 是 QML 的标准库,提供基本类型和功能。提供QML语言运行时的基础能力,相当于QML的"标准模板库(STL)"。 Quick Controls 2 是基于 Qt Quic…...
基于maven-jar-plugin打造一款自动识别主类的maven打包插件
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
利用 HEMT 和 PHEMT 改善无线通信电路中的增益、速度和噪声
本文要点 高电子迁移率晶体管 (High electron mobility transistors ,HEMTs) 和应变式异质接面高迁移率晶体管(pseudomorphic high electron mobility transistors ,PHEMTs) 因其独特的、可提高性能的特点而…...
探秘C#用户定义类型:突破预定义的边界
在C#的编程世界里,除了系统提供的16种预定义类型,开发者还拥有强大的自主能力——创建自己的用户定义类型。这大大拓展了编程的灵活性和可扩展性,让开发者能根据具体需求定制数据结构和功能。 六种用户定义类型 类类型(class&am…...
idea中导入从GitHub上克隆下来的springboot项目解决找不到主类的问题
第一步:删除目录下的.idea和target,然后用idea打开 第二步:如果有需要,idea更换jdk版本 原文链接:https://blog.csdn.net/m0_74036731/article/details/146779040 解决方法(idea中解决)&#…...
北理工宫某的瓜ppt下载地址
关于“北理工宫某瓜”PPT下载地址相关技术探讨 摘要:本文围绕“北理工宫某瓜”事件中PPT下载地址相关情况展开分析,探讨了网络资源传播的技术机制、涉及的网络安全问题以及围绕此类资源分享应遵循的规范和注意事项,旨在从技术角度对这类网络…...
[论文阅读]Making Retrieval-Augmented Language Models Robust to Irrelevant Context
Making Retrieval-Augmented Language Models Robust to Irrelevant Context [2310.01558v2] Making Retrieval-Augmented Language Models Robust to Irrelevant Context 检索增强语言模型(RALMs),它包含一个检索机制,以减少将…...
论文阅读:2023 arxiv A Survey of Reinforcement Learning from Human Feedback
A Survey of Reinforcement Learning from Human Feedback https://arxiv.org/pdf/2312.14925 https://www.doubao.com/chat/3506943124865538 速览 这篇论文是关于“从人类反馈中进行强化学习(RLHF)”的综述,核心是讲如何让AI通过人类反…...
【图像处理基石】什么是去马赛克算法?
RAW数据的Demosaic算法(去马赛克算法)是图像处理中的关键技术,主要用于将图像传感器(如数码相机、手机摄像头)采集的原始马赛克数据恢复为完整的RGB三通道图像。 1. RAW数据的特性 马赛克结构:图像传感器…...
transformer注意力机制
单头注意力机制 import torch import torch.nn.functional as Fdef scaled_dot_product_attention(Q, K, V):# Q: (batch_size, seq_len, d_k)# K: (batch_size, seq_len, d_k)# V: (batch_size, seq_len, d_v)batch_size: 一次输入的句子数。 seq_len: 每个句子的词数。 d_mo…...