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

基于 pnpm + Monorepo + Turbo + 无界微前端 + Vite 的企业级前端工程实践

基于 pnpm + Monorepo + Turbo + 无界微前端 + Vite 的企业级前端工程实践

一、技术演进:为什么引入 Vite?

在微前端与 Monorepo 架构落地后,构建性能成为新的优化重点:

  • Webpack 构建瓶颈:复杂配置导致开发启动慢(尤其多子应用场景),HMR 延迟随项目规模增长
  • 依赖预构建需求:第三方库重复编译,影响开发者体验
  • 现代浏览器适配:ES Module 原生支持普及,需要更轻量的构建方案

Vite 以「开发时极速冷启动 + 生产环境高度优化」的特性,成为企业级微前端架构的理想搭档。结合原有技术栈,形成 「pnpm 依赖管理 + Monorepo 统一架构 + Turbo 任务调度 + 无界微前端解耦 + Vite 极速构建」 的五层工程体系。

二、技术栈全景:工具链协同架构

1. 核心工具分工

工具职责
pnpm工作区依赖管理(Monorepo 基石),依赖包硬链接共享,跨项目依赖安装
Monorepo单一仓库管理基座、子应用、共享模块,统一工程规范
Turbo任务并行执行与智能缓存,调度 Vite 构建、测试、打包等流程
无界微前端实现技术栈无关的应用拆分,沙箱隔离、路由分发、增量加载
Vite开发环境极速启动(200ms 级冷启动),生产环境基于 Rollup 的优化构建

2. 协同流程图

graph TDA[开发启动] --> B{Turbo 任务调度}B --> C[pnpm 安装工作区依赖]C --> D[Vite 启动基座(dev server)]D --> E[Vite 并行启动子应用(HMR 独立运行)]F[生产构建] --> G[Turbo 分析变更模块]G --> H[Vite 构建基座(外置公共依赖)]H --> I[Turbo 并行构建子应用(Vite 按需构建)]J[微前端加载] --> K[基座动态加载子应用资源(CDN/Vite 构建产物)]

三、工程初始化:融合 Vite 的目录规范

1.目录结构

├── apps/                
│   ├── micro-host/      # 主应用(基座,Vite 构建)
│   │   ├── src/
│   │   └── vite.config.ts  # 基座 Vite 配置
│   ├── sub-app-react/   # React 子应用(Vite 构建)
│   │   └── vite.config.ts
│   └── shared-config/   # 共享配置(含 Vite 基础配置)
│       └── vite.base.config.ts  # 公共 Vite 配置(别名、插件、环境变量)
├── packages/            
│   ├── micro-shared/    # 微前端通信模块(TS 库,Vite 构建为 UMD)
│   └── utils/           # 工具库(ES Module 输出)
├── config/              
│   ├── vite/            # Vite 全局配置(如公共插件、代理规则)
│   └── turbo/           # Turbo 任务配置
├── turbo.json           # 包含 Vite 相关任务的管道配置
├── pnpm-workspace.yaml  # 包含所有 Vite 项目工作区
└── package.json

2. 核心配置文件

pnpm-workspace.yaml(新增 Vite 相关工作区):

packages:- "apps/micro-host"- "apps/sub-*/"        # 所有子应用工作区- "packages/**"

根目录 vite.config.ts(公共配置,供各应用继承):

// 公共 Vite 配置(基础别名、TS 支持、环境变量)
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react'; // 可扩展 Vue 等其他插件
import path from 'path';export default defineConfig({resolve: {alias: {'@shared': path.resolve(__dirname, 'packages/micro-shared'),},},plugins: [react()],envPrefix: 'MICRO_APP_', // 微前端专属环境变量前缀
});

四、核心能力实现:Vite 深度集成

1. 基座应用 Vite 配置(React 示例)

apps/micro-host/vite.config.ts

import { defineConfig } from 'vite';
import baseConfig from '../../shared-config/vite.base.config';
import { createMicroHost } from 'vite-plugin-micro-app'; // 自定义微前端插件export default defineConfig({...baseConfig,server: {port: 3000,proxy: {'/api': { target: 'https://api.example.com', changeOrigin: true }, // 全局接口代理},},plugins: [...baseConfig.plugins,createMicroHost({// 微前端基座专属配置(如路由前缀、沙箱模式)sandbox: { type: 'proxy' },publicPath: '/micro-host/', // 基座公共路径(CDN 部署场景)}),],
});

2. 子应用 Vite 配置(技术栈无关化)

apps/sub-app-react/vite.config.ts

import { defineConfig } from 'vite';
import baseConfig from '../../shared-config/vite.base.config';
import react from '@vitejs/plugin-react';export default defineConfig({...baseConfig,build: {target: 'es2020',format: 'umd', // 微前端要求子应用输出 UMD 格式(兼容沙箱环境)entry: './src/micro.ts', // 暴露微前端生命周期钩子的入口manifest: true, // 生成资源清单供基座动态加载rollupOptions: {external: ['react', 'react-dom'], // 外置基座已提供的依赖output: {name: 'subReactApp', // UMD 全局变量名(避免冲突)globals: {react: 'React','react-dom': 'ReactDOM',},},},},plugins: [...baseConfig.plugins,react(),],
});

3. Turbo 任务优化(Vite 构建加速)

turbo.json 关键配置

{"pipeline": {"vite:dev": {"command": "vite", // 启动 Vite 开发服务器"dependsOn": ["^install"],"filter": ["apps/micro-host", "apps/sub-*/"], // 同时启动基座和子应用"parallel": true,"cache": false // 开发模式不缓存},"vite:build": {"command": "vite build","dependsOn": ["^vite:build"], // 依赖同工作区的构建任务(如公共库)"outputs": ["dist/**", "*.manifest.json"], // 包含 Vite 生成的资源清单"filter": "apps/sub-*/", // 仅构建子应用(基座单独构建)"cache": true,"parallel": 4 // 按 CPU 核数动态调整}}
}

4. 依赖管理升级(Vite 专属策略)

  1. 公共依赖外置
    基座统一提供的依赖(如 React)通过 Vite external 配置排除,避免子应用重复打包:

    // 子应用 Vite 配置
    build: {rollupOptions: {external: ['react', 'react-dom', '@shared/utils'], // 外置 Monorepo 共享库},
    },
    
  2. 依赖预构建优化
    通过 pnpm 安装依赖后,Turbo 自动触发 Vite 预构建(仅首次执行):

    {"pipeline": {"install": {"command": "pnpm install","outputs": ["node_modules", "package-lock.json"]}}
    }
    

五、微前端增强:Vite 特化能力

1. 极速开发体验

  • 独立 HMR 服务:每个子应用的 Vite 开发服务器独立运行,修改时仅更新自身模块,HMR 延迟 < 100ms
  • 依赖热更新:Monorepo 内共享模块(如 @shared/utils)修改时,所有引用该模块的子应用自动触发 HMR
  • 条件编译:通过 Vite 环境变量(import.meta.env.MODE)区分微前端模式/独立运行模式:
    // 子应用入口
    if (import.meta.env.MODE === 'micro') {// 微前端生命周期钩子
    } else {// 独立运行时的启动逻辑
    }
    

2. 生产构建优化

  • 资源拆分:Vite + Rollup 实现子应用代码拆分为 vendor.js(第三方库)和 app.js(业务代码),基座按需加载
  • CDN 友好输出:子应用构建产物生成 *.js.mapmanifest.json,基座通过动态 import 加载:
    // 基座动态加载逻辑(基于 Vite 生成的 manifest)
    const loadSubApp = async (name) => {const manifest = await fetch(`/micro-apps/${name}/manifest.json`).then(res => res.json());await import(manifest['app.js']); // 加载子应用代码
    };
    

3. 沙箱与 Vite 兼容性

  • 全局变量隔离:Vite 构建的子应用默认不污染全局作用域,结合无界微前端的 Proxy 沙箱,彻底隔离 windowdocument 等对象
  • 样式作用域:子应用使用 Vite 的 css.scoped(Vue)或 css modules(React),配合基座的 shadow DOM,实现 100% 样式隔离:
    /* React 子应用 CSS Modules */
    .container {composes: global .common-container; /* 允许访问基座全局样式 */padding: 20px;
    }
    

六、企业级开发规范

1. 代码提交与校验

  1. Vite 配置审查:提交前检查 vite.config.ts 是否遵循公共规范(如外置依赖列表、输出格式)

    // lint-staged 配置
    "*.{ts,tsx,js,jsx}": ["eslint --fix","npx vite-validate-config" // 自定义 Vite 配置校验脚本
    ]
    
  2. 分支策略

    • main 分支:仅允许通过 PR 合并,触发 Turbo 构建所有子应用 + 基座
    • feature/sub-app 分支:独立开发子应用,通过 turbo dev --filter=sub-app 本地联调

2. 环境管理

  • 多环境配置:通过 Vite 的 envDirmode 区分开发/测试/生产环境,配置文件统一存放于 config/env/

    # 启动生产环境预览
    turbo dev --filter=micro-host --mode production
    
  • 微前端参数注入:基座通过 window.__MICRO_APP_ENV__ 向子应用传递全局配置(如 API 地址、租户信息):

    // 基座 index.html
    <script>window.__MICRO_APP_ENV__ = {API_URL: import.meta.env.VITE_API_URL,TENANT_ID: 'enterprise'};
    </script>
    

3. CI/CD 优化(GitHub Actions 示例)

.github/workflows/vite-build.yml

name: Vite 构建与部署
on: [push, pull_request]jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v4- uses: actions/setup-node@v4with:node-version: 20- run: pnpm install --frozen-lockfile- run: turbo vite:build --filter=micro-host  # 构建基座- run: turbo vite:build --filter=sub-app-*  # 并行构建所有子应用- uses: actions/upload-artifact@v4with:name: micro-apps-buildpath: apps/**/dist/deploy:needs: buildruns-on: ubuntu-lateststeps:- uses: actions/download-artifact@v4with:name: micro-apps-build- run: scp -r dist/ user@server:/var/www/micro-apps/  # 上传至 CDN 或服务器

七、性能优化:Vite 特性深度挖掘

1. 开发阶段

  • 预构建优化:Vite 自动将 node_modules 依赖预构建为 ES Module,Turbo 缓存预构建结果,二次启动时间 < 50ms
  • HTTP/2 推送:基座 Vite 服务器启用 server.http2.push,提前推送子应用常用资源(如公共样式、字体)

2. 生产阶段

  • SSG 支持:对子应用中的静态页面使用 Vite SSG(Static Site Generation),构建时生成 HTML,首屏加载速度提升 40%

    // 子应用 React 组件(Vite SSG 兼容)
    export default async function Home() {const data = await fetch('/api/data').then(res => res.json());return <div>{data.content}</div>;
    }
    
  • 压缩与 CDN 缓存

    // 子应用 Vite 构建配置
    build: {minify: 'terser', // 生产环境使用 Terser 压缩(比 ESBuild 更优的压缩率)manifest: true,rollupOptions: {output: {assetFileNames: 'assets/[name]-[hash].[ext]', // 哈希戳防止缓存污染}}
    }
    

八、总结:打造下一代前端工程生态

融合五大核心技术后,企业级前端工程具备 「开发极速化、架构弹性化、协作规范化、性能极致化」 的核心优势:

1. 开发体验升级

  • Vite 冷启动时间从 Webpack 的 30s+ 缩短至 500ms 以内
  • Turbo 任务缓存使重复构建时间减少 70%,微前端子应用联调效率提升 50%

2. 架构优势

  • 技术栈自由:子应用可独立使用 React 18/Vue 3/Angular 15,基座统一采用 React + Vite
  • 弹性扩展:新增子应用仅需复制模板工作区,10 分钟内完成初始化

3. 企业级价值

  • 资源成本:pnpm 依赖共享减少 70% 磁盘占用,Vite 构建产物体积平均缩小 30%
  • 协作成本:统一的 Vite 配置规范、Turbo 任务定义、微前端通信协议,新成员上手周期从 2 周缩短至 3 天

未来演进方向

  1. Vite 插件生态扩展:开发企业级专属插件(如权限路由自动注入、资源加载监控)
  2. 边缘计算集成:利用 Vite 构建的 ES Module 产物,部署到边缘节点实现「零延迟加载」
  3. 智能化工具链:结合 AI 分析 Turbo 任务依赖,动态优化 Vite 构建并行策略

这套工程体系不仅解决了单体应用的历史问题,更构建了面向未来的技术底座。企业可根据自身规模逐步落地:从小型 Monorepo 开始,随着业务扩展逐步引入微前端,最终通过 Vite 实现性能突破。技术选型的本质是「工具为人服务」,唯有与团队协作模式、业务发展节奏深度契合,才能发挥最大价值。

相关文章:

基于 pnpm + Monorepo + Turbo + 无界微前端 + Vite 的企业级前端工程实践

基于 pnpm Monorepo Turbo 无界微前端 Vite 的企业级前端工程实践 一、技术演进&#xff1a;为什么引入 Vite&#xff1f; 在微前端与 Monorepo 架构落地后&#xff0c;构建性能成为新的优化重点&#xff1a; Webpack 构建瓶颈&#xff1a;复杂配置导致开发启动慢&#…...

软考高级系统架构设计师-第15章 知识产权与标准化

【本章学习建议】 根据考试大纲&#xff0c;本章主要考查系统架构设计师单选题&#xff0c;预计考3分左右&#xff0c;较为简单。 15.1 标准化基础知识 1. 标准的分类 分类 内容 国际标准&#xff08;IS&#xff09; 国际标准化组织&#xff08;ISO&#xff09;、国际电工…...

MySQL 视图

核心目标&#xff1a; 学习如何创建和使用视图&#xff0c;以简化复杂的查询、提供数据访问控制、实现逻辑数据独立性&#xff0c;并通过 WITH CHECK OPTION 保证数据一致性。 什么是视图&#xff1f; 视图&#xff08;View&#xff09;是一种虚拟表&#xff0c;其内容由一个 …...

[操作系统] 信号

信号 vs IPC 板书最后提到了 “信号 vs IPC”&#xff0c;暗示了信号也是一种进程间通信 (Inter-Process Communication, IPC) 的机制。虽然信号的主要目的是事件通知&#xff0c;但它也可以携带少量的信息&#xff08;即信号的类型&#xff09;。 初探“信号”——操作系统的“…...

网络基础(协议,地址,OSI模型、Socket编程......)

目录 一、计算机网络发展 二、协议 1.认识协议 2.OSI七层模型 3.TCP/IP 五层(或四层)模型 4.协议本质 三、网络传输流程 1.MAC地址 2.协议栈 3.IP地址 IP地址 vs MAC地址 1. 核心区别 2. 具体通信过程类比 3. 关键总结 为什么需要两者&#xff1f; 4.协议栈图解…...

产品经理学习过程

一&#xff1a;扫盲篇&#xff08;初始产品经理&#xff09; 阶段1&#xff1a;了解产品经理 了解产品经理是做什么的、产品经理的分类、产品经理在实际工作中都会接触什么样的岗位、以及产品经理在实际工作中具体要做什么事情。 二&#xff1a;准备篇 阶段2&#xff1a;工…...

深入理解Java包装类:自动装箱拆箱与缓存池机制

深入理解Java包装类&#xff1a;自动装箱拆箱与缓存池机制 对象包装器 Java中的数据类型可以分为两类&#xff1a;基本类型和引用类型。作为一门面向对象编程语言&#xff0c; 一切皆对象是Java语言的设计理念之一。但基本类型不是对象&#xff0c;无法直接参与面向对象操作&…...

Linux中的信号量

目录 信号量概念 定义 操作 类型 应用 信号量封装 一、创建信号量 头文件 函数原型 参数说明 返回值 示例 二、设置信号量初始值 头文件 函数原型 参数解释 返回值 示例 三、信号量的P操作 头文件 函数原型 参数解释 返回值 示例 四、信号量的V操作 示…...

深入理解linux操作系统---第15讲 Web 服务器 Nginx

15.1 Nginx 概述 核心特性与历史背景 Nginx由俄罗斯工程师Igor Sysoev于2002年开发&#xff0c;2004年正式发布&#xff0c;旨在解决传统服务器&#xff08;如Apache&#xff09;的C10K问题&#xff08;即单机万级并发连接处理&#xff09;。其采用事件驱动&#xff08;Event…...

深度解析算法之前缀和

25.【模版】一维前缀和 题目链接 描述 输入描述 输出描述 输出q行,每行代表一次查询的结果. 示例 输入&#xff1a; 3 2 1 2 4 1 2 2 3 复制 输出&#xff1a; 3 6 这个题的话就是下面的样子&#xff0c;我们第一行输入 3 2的意思即是这个数组是3个元素大小的数组&…...

混合精度训练中的算力浪费分析:FP16/FP8/BF16的隐藏成本

在大模型训练场景中&#xff0c;混合精度训练已成为降低显存占用的标准方案。然而&#xff0c;通过NVIDIA Nsight Compute深度剖析发现&#xff0c;‌精度转换的隐藏成本可能使理论算力利用率下降40%以上‌。本文基于真实硬件测试数据&#xff0c;揭示不同精度格式的计算陷阱。…...

6.8 Python定时任务实战:APScheduler+Cron实现每日/每周自动化调度

Python定时任务实战:APScheduler+Cron实现每日/每周自动化调度 实现每日和每周定时任务 关键词:定时任务调度、Python 原生调度器、Cron 脚本、异常重试机制、任务队列管理 1. 定时任务架构设计 采用 分层调度架构 实现灵活的任务管理: #mermaid-svg-PnZcDOgOklVieQ8X {f…...

[Android] 豆包爱学v4.5.0小学到研究生 题目Ai解析

[Android] 豆包爱学 链接&#xff1a;https://pan.xunlei.com/s/VOODT6IclGPsC7leCzDFz521A1?pwdjxd8# 拍照解析答案 【应用名称】豆包爱学 【应用版本】4.5.0 【软件大小】95mb 【适用平台】安卓 【应用简介】豆包爱学&#xff0c;一般又称河马爱学教育平台app,河马爱学。 关…...

swift-12-Error处理、关联类型、assert、泛型_

一、错误类型 开发过程常见的错误 语法错误&#xff08;编译报错&#xff09; 逻辑错误 运行时错误&#xff08;可能会导致闪退&#xff0c;一般也叫做异常&#xff09; 2.1 通过结构体 第一步 struct MyError : Errort { var msg: String &#xff5d; 第二步 func divide(_ …...

每日定投40刀BTC(14)20250409 - 20250419

定投 坚持 《磨剑篇》浮生多坎壈&#xff0c;志业久盘桓。松柏凌霜易&#xff0c;骅骝涉险难。砺锋临刃缺&#xff0c;淬火取金残。但使精魂在&#xff0c;重开万象端。...

【刷题Day20】TCP和UDP(浅)

TCP 和 UDP 有什么区别&#xff1f; TCP提供了可靠、面向连接的传输&#xff0c;适用于需要数据完整性和顺序的场景。 UDP提供了更轻量、面向报文的传输&#xff0c;适用于实时性要求高的场景。 特性TCPUDP连接方式面向连接无连接可靠性提供可靠性&#xff0c;保证数据按顺序…...

大数据建模与评估

文章目录 实战案例:电商用户分群与价值预测核心工具与库总结一、常见数据挖掘模型原理及应用(一)决策树模型(二)随机森林模型(三)支持向量机(SVM)模型(四)K - Means聚类模型(五)K - Nearest Neighbors(KNN)模型二、运用Python机器学习知识实现数据建模与评估(一…...

Python语法系列博客 · 第6期[特殊字符] 文件读写与文本处理基础

上一期小练习解答&#xff08;第5期回顾&#xff09; ✅ 练习1&#xff1a;字符串反转模块 string_tools.py # string_tools.py def reverse_string(s):return s[::-1]调用&#xff1a; import string_tools print(string_tools.reverse_string("Hello")) # 输出…...

Pandas取代Excel?

有人在知乎上提问&#xff1a;为什么大公司不用pandas取代excel&#xff1f; 而且列出了几个理由&#xff1a;Pandas功能比Excel强大&#xff0c;运行速度更快&#xff0c;Excel除了简单和可视化界面外&#xff0c;没有其他更多的优势。 有个可怕的现实是&#xff0c;对比Exce…...

《解锁图像“高清密码”:超分辨率重建之路》

在图像的世界里&#xff0c;高分辨率意味着更多细节、更清晰的画面&#xff0c;就像用高清望远镜眺望远方&#xff0c;一切都纤毫毕现。可现实中&#xff0c;我们常被低分辨率图像困扰&#xff0c;模糊的监控画面、老旧照片里难以辨认的面容……不过别担心&#xff0c;图像超分…...

杨校老师课堂之C++入门练习题梳理

采用C完成下列题目&#xff0c;要求每题目的时间限制&#xff1a;1秒 内存限制&#xff1a;128M 1. 交换个位与十位的数字 时间限制&#xff1a;1秒 内存限制&#xff1a;128M 题目描述 试编写一个程序&#xff0c;输入一个两位数&#xff0c;交换十位与个位上的数字并输出。 …...

基于springboot的老年医疗保健系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…...

数据分析与挖掘

一 Python 基本语法 变量与数据类型 &#xff1a; Python 中变量无需声明&#xff0c;直接赋值即可。 常见的数据类型有数值型&#xff08;整型 int、浮点型 float、复数型 complex&#xff09;、字符串型&#xff08;str&#xff0c;用单引号、双引号或三引号括起来&#xff…...

RoBoflow数据集的介绍

https://public.roboflow.com/object-detection&#xff08;该数据集的网址&#xff09; 可以看到一些基本情况 如果我们想要下载&#xff0c;直接点击 点击图像可以看到一些基本情况 可以点击红色箭头所指&#xff0c;右边是可供选择的一些yolo模型的格式 如果你想下载…...

大模型Rag - 两大检索技术

一、稀疏检索&#xff1a;关键词匹配的经典代表 稀疏检索是一种基于关键词统计的传统检索方法。其基本思想是&#xff1a;通过词频和文档频率来衡量一个文档与查询的相关性。 核心原理 文档和查询都被表示为稀疏向量&#xff08;如词袋模型&#xff09;&#xff0c;只有在词…...

【T型三电平仿真】SVPWM调制

目录 仿真模型分析 克拉克变换 大扇区判断​编辑 小区域判断 计算基本电压矢量作用时间 确定基本电压矢量的作用顺序 作用时间和矢量作用顺序对应 七段式化生成阶梯图 矢量状态分布 本人学习过程中提出的问题和解释 SVPWM调制实现了什么功能 SVPWM的算法步骤是什么…...

树莓派5-开发应用笔记

0.树莓派系统目录 /home&#xff1a;用户目录。 除了root用户外&#xff0c;其他所有的使用者的数据都存放在这个目录下&#xff0c;在树莓派的系统中&#xff0c;/home目录中有一个pi的子目录,这个就是pi用户的默认目录。 /bin&#xff1a; 主要放置系统的必备执行文件目录。 …...

[Java实战经验]异常处理最佳实践

一些好的异常处理实践。 目录 异常设计自定义异常为异常设计错误代码&#xff08;状态码&#xff09;设计粒度全局异常处理异常日志信息保留 异常处理时机资源管理try-with-resources异常中的事务 异常设计 自定义异常 自定义异常设计&#xff0c;如业务异常定义BusinessExce…...

AOSP的Doze模式-LightIdle初识

前言 从Android 6.0开始&#xff0c;谷歌引入了Doze模式(打盹模式)的省电技术延长电池使用时间。根据第三方测试显示&#xff0c;两台同样的Nexus 5&#xff0c;开启的Doze的一台待机能达到533小时&#xff0c;而未开启Doze的一台待机只能达到200小时。Doze省电效果十分明显。…...

QML动画--ParticleSystem

ParticleSystem 是 QML 中用于创建和管理粒子系统的组件&#xff0c;可以制作各种粒子效果如火焰、烟雾、爆炸等。 基本用法 qml import QtQuick.Particles 2.15ParticleSystem {id: particleSystemImageParticle {source: "particle.png"color: "red"a…...

Win 11 重装 Ubuntu 双系统方法

有时候 Ubuntu 环境崩溃了&#xff0c;或者版本过低&#xff0c;需要卸载重装。本文介绍重装的方法&#xff0c;默认已经有一个双系统。 1. 删除原先 Ubuntu 分区 首先打开 Win 的磁盘管理&#xff0c;找到 Ubuntu 的分区&#xff0c;右键删除分区&#xff08;注意不要错删 wi…...

单例模式:懒汉式的两种优化写法

单例模式&#xff1a;全局唯一实例 懒汉式&#xff1a;获取时才初始化 ①静态局部变量实现&#xff08;Meyer’s Singleton&#xff09;【推荐】 /* 类内创建自身实例的可行性分析&#xff1a;在C中&#xff0c;类可以通过静态成员函数创建自身实例。这种机制的核心在于&…...

详细解释浏览器是如何渲染页面的?

渲染流程概述 渲染的目标&#xff1a;将HTML文本转化为可以看到的像素点 当浏览器的网络线程收到 HTML 文档后&#xff0c;会产生一个渲染任务&#xff0c;并将其传递给渲染主线程的消息队列。在事件循环机制的作用下&#xff0c;渲染主线程取出消息队列中的渲染任务&#xff0…...

高速系统设计简介

1.1 PCB 设计技术回顾 1981 年 8 月 12 日&#xff0c;IBM 正式发布了历史上第一台个人电脑&#xff0c;自此之后&#xff0c;个人电脑融入了人们生活和工作的各个角落&#xff0c;人类从此进入了个人电脑时代。个人电脑的出现&#xff0c;不仅促进了电子产品在消费领域的发展…...

不规则曲面上两点距离求取

背景 在CT中求皮肤上两点间的弧长。由于人体表面并不是规则的曲面&#xff0c;不可能用圆的弧长求取方法来计算出两点间的弧长。 而在不规则的曲面上求两点的距离&#xff0c;都可以用类似测地线距离求取的方式来求取&#xff08;积分&#xff09;&#xff0c;而转化为搜索路…...

用usb网卡 虚拟机无法开到全双工的解决办法

今天突发奇想 给unraid宿主机插了两个一摸一样的usb网卡 2.5g的 直通给不同的虚拟机 这里unraid需要安装"USB Manager" 请给unraid自备环境 直通的时候 第一次还没生效 看不到网卡 我又在unraid的管理界面 顶部可以看到多出来一个 "usb"页面 打开可…...

webpack 中 chunks详解

webpack 中 chunks详解 在 Webpack 项目中&#xff0c;webpack.config.js 是核心配置文件&#xff0c;而非 webpack.json。chunks 的概念与 Webpack 的代码分割&#xff08;Code Splitting&#xff09;功能密切相关&#xff0c;通过 optimization.splitChunks 配置项可以实现对…...

Java @Serial 注解深度解析

Java Serial 注解深度解析 1. 注解本质 Serial 是 Java 14 引入的编译时校验注解&#xff0c;用于标记序列化相关成员&#xff0c;帮助开发者避免常见的序列化错误。 2. 核心作用 (1) 主要用途 标记序列化相关的特殊方法/字段 提供编译时检查 替代传统的命名约定验证 (…...

齐次坐标变换+Unity矩阵变换

矩阵变换 变换&#xff08;transform)&#xff1a;指的是我们把一些数据&#xff0c;如点&#xff0c;方向向量甚至是颜色&#xff0c;通过某种方式&#xff08;矩阵运算&#xff09;&#xff0c;进行转换的过程。 变换类型 线性变换&#xff1a;保留矢量加和标量乘的计算 f(x)…...

Python语法系列博客 · 第9期[特殊字符] 函数参数进阶:*args、**kwargs 与参数解包技巧

上一期小练习解答&#xff08;第8期回顾&#xff09; ✅ 练习1&#xff1a;整数转字符串列表 nums [1, 2, 3, 4, 5] str_list list(map(str, nums))✅ 练习2&#xff1a;筛选回文字符串 words ["madam", "hello", "noon", "python&qu…...

Python语法系列博客 · 第4期[特殊字符] 函数的定义与使用:构建可复用的模块

上一期小练习解答&#xff08;第3期回顾&#xff09; ✅ 练习1&#xff1a;创建一个列表&#xff0c;添加5个名字&#xff0c;并用循环打印 names ["Alice", "Bob", "Charlie", "David", "Eva"] for name in names:print…...

6547网:2025年3月 Python编程等级考试一级真题试卷

2025年3月青少年软件编程Python等级考试&#xff08;一级&#xff09;真题试卷 题目总数&#xff1a;37 总分数&#xff1a;100 选择题 第 1 题 单选题 下列哪个软件不能运行Python程序&#xff1f;&#xff08; &#xff09; A.JupyterNotebook B.Pycharm C.原版…...

微前端框架Module Federation

以下是 Module Federation 的核心知识点,并结合微前端架构的设计思想,帮助我们构建完整的知识体系: 一、Module Federation 基础概念 1. 什么是 Module Federation? 定义:Webpack 5 引入的一项革命性功能,允许在运行时动态加载其他独立构建的应用模块(微前端),实现跨…...

AUTOSAR图解==>AUTOSAR_SWS_IntrusionDetectionSystemManager

AUTOSAR 入侵检测系统管理器 (IdsM) 详解 AUTOSAR安全框架的核心组件 1. 概述 AUTOSAR 入侵检测系统管理器&#xff08;Intrusion Detection System Manager, IdsM&#xff09;是AUTOSAR标准中安全防护框架的关键组成部分&#xff0c;专门负责处理车载安全事件。IdsM模块提供了…...

Alan AI - 面向Web的生成式AI SDK

本文翻译整理自&#xff1a;https://github.com/alan-ai/alan-sdk-web 文章目录 一、关于 Alan AI相关链接资源关键功能特性Alan AI StudioAlan AI SDKAlan AI Cloud 二、为什么选择Alan AI&#xff1f;三、快速开始四、下载安装五、示例应用六、其他平台SDK七、获取帮助 一、关…...

递归下降 ll(1) 型文法 识别二元组文法分析

#include <stdio.h> #include <string.h>FILE* fp; FILE* fa2;char* str new char[1200]; // 循环读取文件&#xff0c;分200字节读取char* peek;// 表格 typedef struct table {char* sign;char* kind;char* message; } signtable;signtable* list; // 数…...

Qt unknown module(s) in qt:serialport解决方法

在Ubuntu和CentOS系统中,若使用Qt时遇到Unknown module(s) in QT: serialport错误,通常是由于未正确安装Qt的串口模块(QSerialPort)或项目配置不当导致。以下是针对两种系统的解决方案: 一、安装Qt串口模块 1. Ubuntu/Debian系列 安装开发包: 执行以下命令安装Qt5串口模…...

金融数学专题6 证券问题与资本利得税

一、固定利息证券 特点&#xff1a;利息固定&#xff0c;且可以在证券名字中体现。 发行价格:公司公开发行证券的价格。 固定利率证券通常在其名称中包括应付利率&#xff0c;例如&#xff0c;8% Treasury Stock 2021 或 5% Treasury Gilt 2018。每位持有人应得的年利息是通…...

XGBoost

XGBoost 假设一共有 m m m个基模型&#xff0c;分别为 f 1 ( x ) , f 2 ( x ) , … , f m ( x ) f_1(x),f_2(x),\dots,f_m(x) f1​(x),f2​(x),…,fm​(x)&#xff0c; n n n个样本&#xff0c; x 1 , x 2 , … , x n x_1,x_2,\dots,x_n x1​,x2​,…,xn​&#xff0c;则XGBoo…...

Kubernetes 多主多从集群部署完整文档

好久不见呀&#xff01;今天给大家整点干货尝尝&#xff08;其实是自己的总结&#xff09;&#xff0c;主打的就是全程无尿点。 Kubernetes 多主多从集群部署完整文档 1. 机器列表 PS: master&#xff0c;lb&#xff0c;nfs机器均为CentOS 7&#xff0c;其他为Ubuntu 22.04 L…...