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

【Node.js】工具链与工程化

在这里插入图片描述

个人主页:Guiat
归属专栏:node.js

在这里插入图片描述

文章目录

  • 1. Node.js 工具链概述
    • 1.1 工具链的作用
    • 1.2 Node.js 工具链全景
  • 2. 包管理与依赖管理
    • 2.1 npm (Node Package Manager)
    • 2.2 yarn
    • 2.3 pnpm
    • 2.4 锁文件与依赖管理
    • 2.5 工作空间与 Monorepo
  • 3. 构建工具与打包
    • 3.1 Webpack
    • 3.2 Rollup
    • 3.3 esbuild
    • 3.4 Babel
    • 3.5 TypeScript 配置
    • 3.6 构建工具比较
  • 4. 代码质量与规范
    • 4.1 ESLint
    • 4.2 Prettier
    • 4.3 Git Hooks 与 Husky
    • 4.4 代码风格规范工作流
    • 4.5 TypeScript 检查
  • 5. 测试框架与测试策略
    • 5.1 Jest 测试框架
    • 5.2 API 测试与 Supertest
    • 5.3 单元测试与模拟
    • 5.4 测试覆盖率与报告
    • 5.5 持续集成与测试
  • 6. 自动化与 CI/CD 流程
    • 6.1 GitHub Actions
    • 6.2 Docker 与容器化

正文

1. Node.js 工具链概述

Node.js 工具链是一系列用于开发、测试、构建和部署 Node.js 应用程序的工具集合。完善的工具链可以显著提高开发效率,确保代码质量,简化部署流程。

1.1 工具链的作用

  • 自动化开发工作流程
  • 提高代码质量和一致性
  • 简化依赖管理
  • 优化构建过程
  • 加速测试和部署
  • 提高项目可维护性

1.2 Node.js 工具链全景

Node.js工具链
包管理工具
构建工具
测试框架
代码质量工具
版本控制
CI/CD工具
文档工具
部署与监控
npm
yarn
pnpm
Webpack
Rollup
Parcel
esbuild
Vite
Jest
Mocha
Jasmine
AVA
Cypress
ESLint
Prettier
TypeScript
Husky
SonarQube
Git
GitHub/GitLab
Conventional Commits
GitHub Actions
Jenkins
CircleCI
Travis CI
JSDoc
Swagger/OpenAPI
Docusaurus
Docker
PM2
Kubernetes
Grafana/Prometheus

2. 包管理与依赖管理

2.1 npm (Node Package Manager)

npm 是 Node.js 的默认包管理器,提供了安装、更新和管理依赖的功能。

# 初始化新项目
npm init -y# 安装依赖包
npm install express# 安装开发依赖
npm install --save-dev jest# 全局安装包
npm install -g nodemon# 更新依赖
npm update# 运行脚本
npm run start

package.json 详解:

{"name": "my-node-app","version": "1.0.0","description": "A Node.js application with complete toolchain","main": "src/index.js","type": "module","scripts": {"start": "node src/index.js","dev": "nodemon src/index.js","build": "webpack --config webpack.config.js","test": "jest --coverage","lint": "eslint src/**/*.js","format": "prettier --write \"src/**/*.{js,json}\"","prepare": "husky install"},"keywords": ["node", "express", "api"],"author": "Your Name","license": "MIT","dependencies": {"express": "^4.18.2","mongoose": "^7.5.0","dotenv": "^16.3.1","jsonwebtoken": "^9.0.1"},"devDependencies": {"jest": "^29.6.4","eslint": "^8.48.0","prettier": "^3.0.3","nodemon": "^3.0.1","webpack": "^5.88.2","webpack-cli": "^5.1.4","husky": "^8.0.3","lint-staged": "^14.0.1"},"engines": {"node": ">=18.0.0"}
}

2.2 yarn

Yarn 是 Facebook 开发的包管理器,提供了更快的安装速度和更好的依赖解决方案。

# 初始化项目
yarn init -y# 安装依赖
yarn add express# 安装开发依赖
yarn add --dev jest# 全局安装
yarn global add nodemon# 更新依赖
yarn upgrade# 运行脚本
yarn start

2.3 pnpm

pnpm 是一个快速、节省磁盘空间的包管理器,采用了内容寻址存储方式。

# 安装 pnpm
npm install -g pnpm# 初始化项目
pnpm init# 安装依赖
pnpm add express# 安装开发依赖
pnpm add -D jest# 更新依赖
pnpm update# 运行脚本
pnpm start

2.4 锁文件与依赖管理

graph TDA[依赖管理] --> B[锁文件]A --> C[语义化版本]A --> D[monorepo]B --> B1[package-lock.json]B --> B2[yarn.lock]B --> B3[pnpm-lock.yaml]C --> C1[主版本.次版本.修订版本]C --> C2[^主版本.次版本.修订版本]C --> C3[~主版本.次版本.修订版本]D --> D1[Lerna]D --> D2[Nx]D --> D3[Turborepo]style A fill:#66CDAAstyle B fill:#87CEFAstyle C fill:#87CEFAstyle D fill:#87CEFA

语义化版本控制:

  • 主版本号:不兼容的 API 更改
  • 次版本号:向后兼容的功能性新增
  • 修订版本号:向后兼容的问题修正

前缀含义:

  • ^:允许升级到任何保持主版本相同的版本
  • ~:允许升级到任何保持主版本和次版本相同的版本
  • 无前缀:精确匹配版本

2.5 工作空间与 Monorepo

// package.json (workspaces 示例)
{"name": "monorepo-project","private": true,"workspaces": ["packages/*"],"scripts": {"start": "node scripts/start.js","test": "jest"}
}
// Lerna 配置文件 (lerna.json)
{"version": "independent","npmClient": "yarn","useWorkspaces": true,"packages": ["packages/*"],"command": {"publish": {"conventionalCommits": true,"message": "chore(release): publish"}}
}

3. 构建工具与打包

3.1 Webpack

Webpack 是一个静态模块打包器,可以处理 JavaScript、CSS、图像等资源。

// webpack.config.js 基本配置
const path = require('path');
const nodeExternals = require('webpack-node-externals');module.exports = {target: 'node',mode: process.env.NODE_ENV || 'development',entry: './src/index.js',output: {path: path.resolve(__dirname, 'dist'),filename: 'bundle.js',clean: true},externals: [nodeExternals()],module: {rules: [{test: /\.js$/,exclude: /node_modules/,use: {loader: 'babel-loader',options: {presets: ['@babel/preset-env']}}},{test: /\.json$/,loader: 'json-loader',type: 'javascript/auto'}]},resolve: {extensions: ['.js', '.json'],alias: {'@': path.resolve(__dirname, 'src')}},optimization: {minimize: process.env.NODE_ENV === 'production'},devtool: process.env.NODE_ENV === 'production' ? 'source-map' : 'eval-source-map'
};

3.2 Rollup

Rollup 专注于 JavaScript 库构建,特别适合生成更小、更高效的包。

// rollup.config.js 基本配置
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import babel from '@rollup/plugin-babel';
import json from '@rollup/plugin-json';
import { terser } from 'rollup-plugin-terser';export default {input: 'src/index.js',output: [{file: 'dist/bundle.cjs.js',format: 'cjs',sourcemap: true},{file: 'dist/bundle.esm.js',format: 'esm',sourcemap: true}],plugins: [resolve({preferBuiltins: true}),commonjs(),json(),babel({babelHelpers: 'bundled',exclude: 'node_modules/**'}),process.env.NODE_ENV === 'production' && terser()],external: ['express', 'mongoose', 'dotenv']
};

3.3 esbuild

esbuild 是一个极快的 JavaScript 打包器和压缩器。

// esbuild.config.js
const esbuild = require('esbuild');esbuild.build({entryPoints: ['src/index.js'],bundle: true,platform: 'node',target: ['node16'],outfile: 'dist/bundle.js',minify: process.env.NODE_ENV === 'production',sourcemap: true,external: ['express', 'mongoose', 'dotenv']
}).catch(() => process.exit(1));

3.4 Babel

Babel 是一个 JavaScript 编译器,用于将现代 JavaScript 代码转换为向后兼容的版本。

// babel.config.js
module.exports = {presets: [['@babel/preset-env', {targets: {node: '16'}}]],plugins: ['@babel/plugin-transform-runtime','@babel/plugin-proposal-optional-chaining','@babel/plugin-proposal-nullish-coalescing-operator']
};

3.5 TypeScript 配置

// tsconfig.json
{"compilerOptions": {"target": "ES2020","module": "NodeNext","moduleResolution": "NodeNext","lib": ["ES2020"],"outDir": "./dist","rootDir": "./src","strict": true,"esModuleInterop": true,"skipLibCheck": true,"forceConsistentCasingInFileNames": true,"resolveJsonModule": true,"declaration": true,"sourceMap": true,"baseUrl": ".","paths": {"@/*": ["src/*"]}},"include": ["src/**/*"],"exclude": ["node_modules", "dist", "**/*.test.ts"]
}

3.6 构建工具比较

工具优势适用场景
Webpack生态丰富,功能强大,社区支持好复杂应用,需要处理多种资源
Rollup生成体积小的包,输出多种格式库开发,需要 ESM 和 CJS 双格式
esbuild极快的构建速度开发环境快速构建,简单项目
Parcel零配置,开箱即用快速原型开发,不想编写配置
Vite快速开发服务器,模块热替换现代应用开发,优先考虑开发体验

4. 代码质量与规范

4.1 ESLint

ESLint 是一个静态代码分析工具,用于识别和报告 JavaScript 代码中的问题。

// .eslintrc.js
module.exports = {env: {node: true,es2021: true,jest: true},extends: ['eslint:recommended','plugin:node/recommended'],parserOptions: {ecmaVersion: 'latest',sourceType: 'module'},rules: {'indent': ['error', 2],'linebreak-style': ['error', 'unix'],'quotes': ['error', 'single'],'semi': ['error', 'always'],'no-unused-vars': ['warn', { 'argsIgnorePattern': '^_' }],'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off','no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off','node/no-unsupported-features/es-syntax': ['error',{ 'ignores': ['modules'] }]}
};

4.2 Prettier

Prettier 是一个代码格式化工具,确保代码风格统一。

// .prettierrc
{"semi": true,"singleQuote": true,"tabWidth": 2,"printWidth": 100,"trailingComma": "es5","arrowParens": "avoid","endOfLine": "lf"
}

与 ESLint 集成:

npm install --save-dev eslint-config-prettier eslint-plugin-prettier
// .eslintrc.js with Prettier integration
module.exports = {extends: ['eslint:recommended','plugin:node/recommended','plugin:prettier/recommended'],// other configurations...
};

4.3 Git Hooks 与 Husky

Husky 可以帮助在 Git 生命周期的关键点上运行脚本。

# 安装 Husky
npm install --save-dev husky# 启用 Git hooks
npx husky install# 添加 pre-commit hook
npx husky add .husky/pre-commit "npm run lint-staged"
// package.json
{"scripts": {"prepare": "husky install"},"lint-staged": {"*.js": ["eslint --fix","prettier --write"],"*.{json,md}": ["prettier --write"]}
}

4.4 代码风格规范工作流

失败
通过
完成
开发人员提交代码
Husky拦截
lint-staged运行
ESLint检查
显示错误
Prettier格式化
提交代码

4.5 TypeScript 检查

# 安装 TypeScript
npm install --save-dev typescript @types/node# 生成 tsconfig.json
npx tsc --init

与 ESLint 集成:

npm install --save-dev @typescript-eslint/parser @typescript-eslint/eslint-plugin
// .eslintrc.js for TypeScript
module.exports = {parser: '@typescript-eslint/parser',extends: ['eslint:recommended','plugin:@typescript-eslint/recommended','plugin:prettier/recommended'],plugins: ['@typescript-eslint'],// other configurations...
};

5. 测试框架与测试策略

5.1 Jest 测试框架

Jest 是一个零配置的 JavaScript 测试框架,适用于大多数 JavaScript 项目。

// jest.config.js
module.exports = {testEnvironment: 'node',coverageDirectory: 'coverage',collectCoverageFrom: ['src/**/*.{js,ts}','!src/**/*.d.ts','!src/**/*.test.{js,ts}','!src/**/index.{js,ts}'],coverageThreshold: {global: {branches: 80,functions: 80,lines: 80,statements: 80}},moduleNameMapper: {'^@/(.*)$': '<rootDir>/src/$1'},testMatch: ['**/__tests__/**/*.test.[jt]s?(x)','**/?(*.)+(spec|test).[jt]s?(x)'],testPathIgnorePatterns: ['/node_modules/','/dist/']
};

示例测试文件:

// src/utils/calculator.test.js
const { add, subtract, multiply, divide } = require('./calculator');describe('Calculator', () => {describe('add', () => {test('adds two positive numbers', () => {expect(add(2, 3)).toBe(5);});test('adds a positive and a negative number', () => {expect(add(2, -3)).toBe(-1);});});describe('subtract', () => {test('subtracts two positive numbers', () => {expect(subtract(5, 3)).toBe(2);});test('subtracts a negative from a positive number', () => {expect(subtract(5, -3)).toBe(8);});});describe('multiply', () => {test('multiplies two positive numbers', () => {expect(multiply(2, 3)).toBe(6);});test('multiplies a positive and a negative number', () => {expect(multiply(2, -3)).toBe(-6);});});describe('divide', () => {test('divides two positive numbers', () => {expect(divide(6, 3)).toBe(2);});test('throws an error when dividing by zero', () => {expect(() => divide(6, 0)).toThrow('Cannot divide by zero');});});
});

5.2 API 测试与 Supertest

// src/app.test.js
const request = require('supertest');
const app = require('./app');
const mongoose = require('mongoose');// 连接测试数据库
beforeAll(async () => {await mongoose.connect(process.env.MONGO_URI_TEST);
});// 断开数据库连接
afterAll(async () => {await mongoose.connection.close();
});// 清理测试数据
afterEach(async () => {await mongoose.connection.db.dropDatabase();
});describe('User API', () => {describe('POST /api/users', () => {test('should create a new user', async () => {const userData = {username: 'testuser',email: 'test@example.com',password: 'password123'};const response = await request(app).post('/api/users').send(userData);expect(response.status).toBe(201);expect(response.body).toHaveProperty('user');expect(response.body.user).toHaveProperty('id');expect(response.body.user.username).toBe(userData.username);expect(response.body.user.email).toBe(userData.email);expect(response.body.user).not.toHaveProperty('password');});test('should not create user with duplicate email', async () => {const userData = {username: 'testuser',email: 'test@example.com',password: 'password123'};// 创建第一个用户await request(app).post('/api/users').send(userData);// 尝试创建重复的用户const response = await request(app).post('/api/users').send({username: 'anotheruser',email: 'test@example.com', // 相同的邮箱password: 'password456'});expect(response.status).toBe(400);expect(response.body).toHaveProperty('error');});});
});

5.3 单元测试与模拟

// src/services/userService.test.js
const userService = require('./userService');
const User = require('../models/User');// 模拟 User 模型
jest.mock('../models/User');describe('User Service', () => {beforeEach(() => {jest.clearAllMocks();});describe('createUser', () => {test('should create and return a new user', async () => {// 准备测试数据const userData = {username: 'testuser',email: 'test@example.com',password: 'password123'};// 模拟 User.create 方法User.create.mockResolvedValue({_id: '507f1f77bcf86cd799439011',username: userData.username,email: userData.email,createdAt: new Date().toISOString()});// 调用被测试的方法const user = await userService.createUser(userData);// 断言 User.create 被正确调用expect(User.create).toHaveBeenCalledWith(expect.objectContaining({username: userData.username,email: userData.email}));// 断言返回值expect(user).toHaveProperty('_id');expect(user.username).toBe(userData.username);expect(user.email).toBe(userData.email);});test('should throw an error if user creation fails', async () => {// 准备测试数据const userData = {username: 'testuser',email: 'test@example.com',password: 'password123'};// 模拟 User.create 抛出错误const errorMessage = 'Failed to create user';User.create.mockRejectedValue(new Error(errorMessage));// 断言方法抛出错误await expect(userService.createUser(userData)).rejects.toThrow(errorMessage);});});
});

5.4 测试覆盖率与报告

# 运行测试并生成覆盖率报告
npm test -- --coverage
测试策略
单元测试
集成测试
端到端测试
性能测试
Jest
Supertest
Cypress
k6

5.5 持续集成与测试

# .github/workflows/test.yml
name: Teston:push:branches: [ main, develop ]pull_request:branches: [ main, develop ]jobs:test:runs-on: ubuntu-latestservices:mongodb:image: mongo:4.4ports:- 27017:27017strategy:matrix:node-version: [16.x, 18.x]steps:- uses: actions/checkout@v3- name: Use Node.js ${{ matrix.node-version }}uses: actions/setup-node@v3with:node-version: ${{ matrix.node-version }}cache: 'npm'- name: Install dependenciesrun: npm ci- name: Run lintingrun: npm run lint- name: Run tests with coveragerun: npm test -- --coverageenv:MONGO_URI_TEST: mongodb://localhost:27017/test-db- name: Upload coverage to Codecovuses: codecov/codecov-action@v3with:token: ${{ secrets.CODECOV_TOKEN }}

6. 自动化与 CI/CD 流程

6.1 GitHub Actions

# .github/workflows/ci.yml
name: CI/CDon:push:branches: [ main ]pull_request:branches: [ main ]jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v3- name: Use Node.jsuses: actions/setup-node@v3with:node-version: '18.x'cache: 'npm'- name: Install dependenciesrun: npm ci- name: Lintrun: npm run lint- name: Testrun: npm test- name: Buildrun: npm run build- name: Upload build artifactsuses: actions/upload-artifact@v3with:name: buildpath: distdeploy:needs: buildif: github.event_name == 'push' && github.ref == 'refs/heads/main'runs-on: ubuntu-lateststeps:- uses: actions/checkout@v3- name: Download build artifactsuses: actions/download-artifact@v3with:name: buildpath: dist- name: Set up Docker Buildxuses: docker/setup-buildx-action@v2- name: Login to Docker Hubuses: docker/login-action@v2with:username: ${{ secrets.DOCKER_HUB_USERNAME }}password: ${{ secrets.DOCKER_HUB_TOKEN }}- name: Build and push Docker imageuses: docker/build-push-action@v4with:context: .push: truetags: username/my-node-app:latest- name: Deploy to productionuses: appleboy/ssh-action@masterwith:host: ${{ secrets.SSH_HOST }}username: ${{ secrets.SSH_USERNAME }}key: ${{ secrets.SSH_PRIVATE_KEY }}script: |cd /path/to/productiondocker-compose pulldocker-compose up -d

6.2 Docker 与容器化

# Dockerfile
FROM node:18-alpine as builderWORKDIR /appCOPY package*.json ./
RUN npm ciCOPY . .
RUN npm run buildFROM node:18-alpineWORKDIR /appCOPY --from=builder /app/dist ./dist
COPY --from=builder /app/package*.json ./
COPY --from=builder /app/node_modules ./node_modulesENV NODE_ENV=production
ENV PORT=3000EXPOSE 3000
CMD ["node", "dist/index.js"]

结语
感谢您的阅读!期待您的一键三连!欢迎指正!

在这里插入图片描述

相关文章:

【Node.js】工具链与工程化

个人主页&#xff1a;Guiat 归属专栏&#xff1a;node.js 文章目录 1. Node.js 工具链概述1.1 工具链的作用1.2 Node.js 工具链全景 2. 包管理与依赖管理2.1 npm (Node Package Manager)2.2 yarn2.3 pnpm2.4 锁文件与依赖管理2.5 工作空间与 Monorepo 3. 构建工具与打包3.1 Web…...

OceanBase数据库全面指南(函数篇)函数速查表

文章目录 一、数学函数1.1 基本数学函数1.2 三角函数二、字符串函数2.1 基本字符串函数2.2 高级字符串处理函数三、日期时间函数3.1 基本日期时间函数3.2 日期时间计算函数四、聚合函数4.1 常用聚合函数4.2 分组聚合4.3 高级聚合函数五、条件判断函数5.1 基本条件函数5.2 CASE表…...

Chrome 缓存文件路径

Chrome 缓存文件路径查看方法 启动 Chrome 浏览器, 输入 Chrome://Version Google浏览器版本号以及安装路径 Windows 缓存目录 在 “运行” 中输入 %TEMP% 可打开, 一般路径是: C:\Users\Administrator\AppData\Local\Temp, 其中 Administrator 是用户名。 Windows 目录…...

Ubuntu Desktop 24.04 常用软件安装步骤

文章目录 Ubuntu Desktop 24.04 常用软件安装步骤Snipaste F1快捷截图&#xff08;超方便 | 我6台电脑每台都用&#xff09;搜狗输入法快速浏览工具 | 空格键快速预览文件壁纸工具 | varietySSH 工具 | Termius 终端分屏工具 | TmuxCaffeine | 避免息屏小工具 一些设置将启动台…...

Chrome 插件网络请求的全面指南

在 Chrome 插件开发中&#xff0c;网络请求可以在多个上下文中实现&#xff0c;而不仅限于 background.js 和 content.js。以下是完整的网络请求实现方案&#xff1a; 一、主要请求实现位置 1. Background Script (后台脚本) 特点&#xff1a; 生命周期最长适合处理敏感数据…...

SpringBoot Day_03

目录 一、数据校验 二、统一异常处理 1、局部异常处理&#xff08;少&#xff09; 2、全局异常处理&#xff08;多&#xff09; 三、定时器 四、springboot日志 五、swagger 六、springboot自动装配原理 总结 1、如何实现参数校验功能&#xff08;掌握&#xff09; …...

Ubuntu 新建用户

在 Ubuntu 22.04 中创建新用户并赋予 root 权限的步骤如下&#xff0c;综合多篇文档推荐的安全方法&#xff1a; 一、创建新用户 使用 adduser 命令创建用户 sudo adduser your_username系统会提示设置密码及填写用户信息&#xff08;全名、电话等&#xff0c;可直接回车跳过&a…...

从法律视角看湖北理元理律师事务所的债务优化实践

债务问题解决需要专业法律支持。本文将从实务角度&#xff0c;解析湖北理元理律师事务所在债务优化领域的工作方法&#xff0c;为有需要的读者提供参考。 一、法律框架下的债务重组 利率合法性审查 识别超过法定上限的利息部分 收集相关证据材料 启动协商或诉讼程序 还款…...

# JavaSE核心知识点02面向对象编程

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 JavaSE核心知识点02面向对象编程JavaSE核心知…...

从原理到实践:一文详解残差网络

在深度学习的发展历程中&#xff0c;神经网络的深度一直是提升模型性能的关键因素之一。随着网络层数的增加&#xff0c;模型理论上可以学习到更复杂、更抽象的特征表示。然而&#xff0c;在实际训练过程中&#xff0c;研究人员发现&#xff0c;当网络深度达到一定程度后&#…...

把银河装进镜头里!动态星轨素材使用实录

仰望夜空时&#xff0c;神秘的银河与闪烁繁星总令人向往。如今&#xff0c;无需复杂拍摄&#xff0c;借助素材平台就能将绝美星轨融入创作&#xff0c;今天重点安利 制片帮素材&#xff01; 动态星轨&#xff1a;宇宙的浪漫印记 星轨是地球自转时&#xff0c;星星运动留下的轨…...

C++23中std::span和std::basic_string_view可平凡复制提案解析

文章目录 一、引言二、相关概念解释2.1 平凡复制&#xff08;Trivially Copyable&#xff09;2.2 std::span2.3 std::basic_string_view 三、std::span和std::basic_string_view的应用场景3.1 std::span的应用场景3.2 std::basic_string_view的应用场景 四、P2251R1提案对std::…...

【KWDB 2025 创作者计划】_KWDB时序数据库特性及跨模查询

一、概述 数据库的类型多种多样&#xff0c;关系型数据库、时序型数据库、非关系型数据库、内存数据库、分布式数据库、图数据库等等&#xff0c;每种类型都有其特定的使用场景和优势&#xff0c;KaiwuDB 是一款面向 AIoT 场景的分布式、多模融合、支持原生 AI 的数据库…...

树 Part 9

二叉树的建立 了解了二叉树的遍历方法&#xff0c;我们如何在内存中生成一棵二叉链表的二叉树呢&#xff1f;树都没有&#xff0c;哪来遍历。所以我们还得来谈谈关于二叉树建立的问题。 如果要在内存中建立一个如左图这样的树&#xff0c;为了能让每个结点确认是否有左右孩子…...

leetcode每日一题 -- 3362. 零数组变换 III

思路 题意是要找出[最少的区间]使nums数组变为零数组,并且使用的区间可以不连续 我的第一想法是先给区间按照左边界排序(就像区间合并题的准备工作那样)这样的可以使用最大堆,每次将右区间值最大(也就是区间范围最大)的区间应用到差分数组中但是,后续如何处理还是不太会,遂看…...

PARSCALE:大语言模型的第三种扩展范式

----->更多内容&#xff0c;请移步“鲁班秘笈”&#xff01;&#xff01;<----- 随着人工智能技术的飞速发展&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为推动机器智能向通用人工智能&#xff08;AGI&#xff09;迈进的核心驱动力。然而&#xff0c;传统的…...

【 开源:跨平台网络数据传输的万能工具libcurl】

在当今这个互联互通的世界中&#xff0c;数据在各种设备和平台之间自由流动&#xff0c;而 libcurl&#xff0c;就像一把跨平台的万能工具&#xff0c;为开发者提供了处理各种网络数据传输任务所需的强大功能。它不仅是一个库&#xff0c;更是一种通用的解决方案&#xff0c;可…...

2025版 JavaScript性能优化实战指南从入门到精通

JavaScript作为现代Web应用的核心技术&#xff0c;其性能直接影响用户体验。本文将深入探讨JavaScript性能优化的各个方面&#xff0c;提供可落地的实战策略。 一、代码层面的优化 1. 减少DOM操作 DOM操作是JavaScript中最昂贵的操作之一&#xff1a; // 不好的做法&#x…...

RAGFlow知识检索原理解析:混合检索架构与工程实践

一、核心架构设计 RAGFlow构建了四阶段处理流水线,其检索系统采用双路召回+重排序的混合架构: S c o r e f i n a l = α ⋅ B M...

leetcode 148. Sort List

148. Sort List 题目描述 代码&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNod…...

C#学习11——集合

一、集合 是一组对象的容器&#xff0c;提供了高效的存储、检索和操作数据的方式。 C# 集合分为泛型集合&#xff08;推荐使用&#xff09;和非泛型集合&#xff0c;主要位于System.Collections和System.Collections.Generic命名空间中。 二、集合有哪些&#xff1f; 1&…...

paddlehub搭建ocr服务

搭建环境&#xff1a; Ubuntu20.041080Ti显卡 由于GPU硬件比较老&#xff0c;是Pascal架构&#xff0c;只能支持到paddle2.4.2版本&#xff0c;更高版本无法支持&#xff1b;同时&#xff0c;因为paddle老版本的依赖发生了变化&#xff0c;有些地方存在冲突&#xff0c;花费了…...

CSS3过渡

一、什么是CSS3过渡 CSS3 过渡&#xff08;transitions&#xff09;是一种效果&#xff0c;它允许你平滑地改变CSS属性的值&#xff0c;从一个状态过渡到另一个状态。是一种动画转换的过程&#xff0c;如渐现、渐弱、动画快慢等。过渡效果可以在用户与页面进行交互时触发&#…...

比斯特自动化|移动电源全自动点焊机:高效点焊助力移动电源制造

在移动电源市场蓬勃发展的当下&#xff0c;电池组合的点焊工艺要求愈发严格。移动电源全自动点焊机应运而生&#xff0c;成为提升生产效率与产品质量的关键设备。 工作原理与结构组成 移动电源全自动点焊机通过瞬间放电产生高温&#xff0c;使电池极耳与镍带等材料在极短时间…...

游戏引擎学习第305天:在平台层中使用内存 Arena 的方法与思路

回顾前一天内容&#xff0c;并为今天的开发工作设定方向 我们正在直播制作完整游戏&#xff0c;当前正在实现一个精灵图&#xff08;sprite graph&#xff09;的排序系统。排序的代码已经写完&#xff0c;过程并不复杂&#xff0c;虽然还没做太多优化&#xff0c;但总体思路比…...

[Java][Leetcode middle] 6. Z 字形变换

法一&#xff0c;自己想的 使用一个复合结构的 List<ArrayList<String>> 来存储每一行的字母&#xff0c;最后按序输出。 使用flag来判断到底放到哪一行上去。flag按照&#xff1a;0–1–2–1–0–1–2这样变化&#xff0c;实现躺着的Z字形。 public String conve…...

零基础设计模式——第二部分:创建型模式 - 原型模式

第二部分&#xff1a;创建型模式 - 5. 原型模式 (Prototype Pattern) 我们已经探讨了单例、工厂方法、抽象工厂和生成器模式。现在&#xff0c;我们来看创建型模式的最后一个主要成员——原型模式。这种模式关注的是通过复制现有对象来创建新对象&#xff0c;而不是通过传统的…...

完整改进RIME算法,基于修正多项式微分学习算子Rime-ice增长优化器,完整MATLAB代码获取

1 简介 为了有效地利用雾状冰生长的物理现象&#xff0c;最近开发了一种优化算法——雾状优化算法&#xff08;RIME&#xff09;。它模拟硬雾状和软雾状过程&#xff0c;构建硬雾状穿刺和软雾状搜索机制。在本研究中&#xff0c;引入了一种增强版本&#xff0c;称为修改的RIME…...

【1——Android端添加隐私协议(unity)1/3】

前言&#xff1a;这篇仅对于unity 发布Android端上架国内应用商店添加隐私协议&#xff0c;隐私协议是很重要的东西&#xff0c;没有这个东西&#xff0c;是不上了应用商店的。 对于仅仅添加隐私协议&#xff0c;我知道有三种方式,第一种和第二种基本一样 1.直接在unity里面新…...

笔记本6GB本地可跑的图生视频项目(FramePack)

文章目录 &#xff08;一&#xff09;简介&#xff08;二&#xff09;本地执行&#xff08;2.1&#xff09;下载&#xff08;2.2&#xff09;更新&#xff08;2.3&#xff09;运行&#xff08;2.4&#xff09;生成 &#xff08;三&#xff09;注意&#xff08;3.1&#xff09;效…...

Android View的事件分发机制

ViewGroup的事件分发逻辑 从Activity传递给Window&#xff0c;再传递给ViewGroup&#xff0c;ViewGroup的dispatchTouchEvent()会被调用&#xff0c;如果onInterceptTouchEvent()返回true 转交自身onTouchEvent()处理,如果返回false继续向子View传递,子View的dispatchTouchEve…...

Python字符串格式化(二): f-string的进化

文章目录 一、Python 3.6&#xff1a;重新发明字符串格式化&#xff08;2016&#xff09;1. 语法糖的诞生&#xff1a;表达式直嵌技术2. 性能与可读性的双重提升3. 奠定现代格式化的基础架构 二、Python 3.7&#xff1a;解锁异步编程新场景&#xff08;2018&#xff09;1. 异步…...

力扣HOT100之二叉树:124. 二叉树中的最大路径和

这道题是困难题&#xff0c;靠自己想还是挺难想的&#xff0c;还是去看的灵神的题解&#xff0c;感觉还是要多复习一下这道题。这道题的思路和之前做的543. 二叉树的直径很像&#xff0c;可以参考之前的这篇博客。这里我们还是用递归来做&#xff0c;定义一个lambda函数来实现递…...

【C++】位图+布隆过滤器

1.位图 概念 所谓位图&#xff0c;就是用每一位来存放某种状态&#xff0c;适用于海量数据&#xff0c;数据无重复的场景。通常是用来判断某个数据存不存在的或是否被标记。 1.二进制位表示 &#xff1a; 位图中的每一位&#xff08;bit&#xff09;代表一个元素的状态。通常&…...

Google Agent Development Kit与MCP初试

Google Agent Development Kit与MCP初试 一、背景知识二、搭建智能大脑 - Ollama服务器2.1 为什么要先搭建Ollama&#xff1f;2.2 搭建ollama服务器2.2.1 安装2.2.2 试着用curl命令"问"AI一个问题&#xff1a; 三、构建智能体工坊 - ADK环境3.1 创建容器3.2 安装核心…...

云原生+大数据

虚拟化&#xff1a; 虚拟化&#xff0c;是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机&#xff0c;每个逻辑计算机可运行不同的操作系统&#xff0c;并且应用程序都可以在相互独立的空间内运行而互不影响&#xff0c;从而显著提…...

基于cornerstone3D的dicom影像浏览器 第二十一章 显示DICOM TAGS

系列文章目录 第一章 下载源码 运行cornerstone3D example 第二章 修改示例crosshairs的图像源 第三章 vitevue3cornerstonejs项目创建 第四章 加载本地文件夹中的dicom文件并归档 第五章 dicom文件生成png&#xff0c;显示检查栏&#xff0c;序列栏 第六章 stack viewport 显…...

【记录】PPT|PPT打开开发工具并支持Quicker VBA运行

文章目录 打开开发者工具支持Quicker VBA运行 打开开发者工具 参考文章&#xff0c;微软文档&#xff1a;显示“开发工具”选项卡&#xff0c;以下直接复制&#xff0c;如侵私删。 适用对象&#xff1a;Microsoft 365 专属 Excel Microsoft 365 专属 Outlook Microsoft 365 专属…...

西门子 S1500 博途软件舞台威亚 3D 控制方案

西门子 S1500 PLC 是工业自动化领域的主流控制器&#xff0c;适合高精度、高可靠性的舞台威亚控制。下面为你提供基于博途 (TIA Portal) 软件的 3D 控制方案设计。 系统架构设计 舞台威亚 3D 控制系统通常包含以下组件&#xff1a; 硬件层&#xff1a; S1500 PLC 主机伺服驱动…...

第三十二天打卡

import pandas as pd from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier # 加载鸢尾花数据集 iris load_iris() df pd.DataFrame(iris.data, columnsiris.feature_names) …...

同步/异步电路;同步/异步复位

同步/异步电路&#xff1b;同步/异步复位 在 FPGA 设计中&#xff0c;同步电路、异步电路、同步复位和异步复位是基础且关键的概念&#xff0c;它们的特性直接影响电路的可靠性、时序性能和设计复杂度。 一、同步电路&#xff08;Synchronous Circuit&#xff09; 定义 同步电…...

spring boot 实现resp视频推流

1、搭建resp服务&#xff08;docker方式&#xff09; docker pull aler9/rtsp-simple-serverdocker run -d --restartalways \--name rtsp-server \-p 8554:8554 \aler9/rtsp-simple-server2、maven依赖 <dependency><groupId>org.bytedeco</groupId><a…...

python、R、shell兼容1

一&#xff0c;兼容方式 1&#xff0c;shell中用R、python&#xff1a; &#xff08;1&#xff09;python3、R/r&#xff08;radian&#xff09;进入 &#xff08;2&#xff09;脚本封装&#xff1a;命令行或者封装到sh脚本中 python xxx.py 自定义参数 Rscript xxx.r 自…...

Oracle 11G RAC重启系统异常

vmware安装centos7环境部署Oracle RAC (11.2.0.4) 部署时所有资源情况都是正常的&#xff0c;关机重启虚拟机后集群资源状态异常&#xff0c;请教CSDN大佬 – 部署规划 域名地址备注rac16192.168.31.16rac17192.168.31.17rac16vip192.168.31.26viprac17vip192.168.31.27vip…...

便捷的电脑自动关机辅助工具

软件介绍 本文介绍的软件是一款电脑上实用的倒计时和关机助手。 软件特性 这款关机助手十分贴心&#xff0c;它是一款无需安装的小软件&#xff0c;体积仅60KB&#xff0c;不用担心占用电脑空间&#xff0c;打开即可直接使用。 操作方法 你只需设置好对应的关机时间&#x…...

巧用 FFmpeg 命令行合并多个视频为一个视频文件教程

你是否曾经遇到过需要将多个视频片段合并成一个连续视频的情况&#xff1f;比如&#xff0c;你拍摄了一段旅行的精彩瞬间&#xff0c;想把它们合成一部短片&#xff1b;或者你在制作教学视频时&#xff0c;希望将不同的部分整合在一起。这时候&#xff0c;FFmpeg 就是你的得力助…...

平时使用电脑,如何去维护

在这个数字化的时代&#xff0c;电脑已经成为我们生活和工作中不可或缺的一部分。然而&#xff0c;你是否知道如何正确地维护它&#xff0c;让它始终保持良好的运行状态呢&#xff1f;今天&#xff0c;就让我来为大家揭晓这个谜底。定期清理电脑内部和外部的灰尘是至关重要的。…...

(视觉)分类、检测与分割在不同网络中的设计体现

分类、检测与分割在不同网络中的设计体现 概述 在计算机视觉领域&#xff0c;不同的网络结构在功能和结构上差异显著&#xff0c;同时也共享一些基础设计元素。 卷积神经网络是基石&#xff1a; 卷积层通过特定的卷积核与图像进行卷积运算提取图像中的局部特征&#xff0c;比…...

技术分享 | MySQL大事务导致数据库卡顿

本文为墨天轮数据库管理服务团队第66期技术分享&#xff0c;内容原创&#xff0c;作者为技术顾问孙文龙&#xff0c;如需转载请联系小墨&#xff08;VX&#xff1a;modb666&#xff09;并注明来源。 一、现 象 业务侧反馈连接数据库异常&#xff0c;报错 connection is not av…...

C#在 .NET 9.0 中启用二进制序列化:配置、风险与替代方案

在 .NET 9.0 中启用二进制序列化&#xff1a;配置、风险与替代方案 引言一、启用二进制序列化的步骤二、实现序列化与反序列化三、安全风险与缓解措施四、推荐替代方案五、总结 引言 在 .NET 生态中&#xff0c;二进制序列化&#xff08;Binary Serialization&#xff09;曾是…...