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

基于Vite+React+TypeScript的现代Web应用开发实践与架构演进

1. 项目概述与背景最近在整理自己的开源项目时我决定把几年前做的一个老项目“如何月HUB”正式归档并写篇文章记录一下它的始末。这个项目本质上是一个基于React和TypeScript的东方Project二次创作同人网站主要展示“如何月”这个角色的相关内容。虽然现在看代码有些稚嫩架构也谈不上多优雅但它是我从纯前端转向全栈开发、学习现代Web工具链的一个关键里程碑。项目已经停止维护并迁移到了新的“如何月ポータル”但回过头看里面涉及的很多技术选型和开发思路特别是如何用Vite、React 18和TypeScript搭建一个现代的单页应用对很多刚入门的朋友来说依然有不错的参考价值。简单来说这是一个典型的个人兴趣驱动的技术实践项目。它不追求大而全而是聚焦于如何用一套当时还算前沿的技术栈React TypeScript Vite快速构建一个风格统一、体验流畅的静态内容站点。过程中我踩了不少坑也积累了一些关于组件设计、状态管理和构建优化的心得。如果你正在学习React生态或者想用Vite启动一个自己的Side Project那么我在这项目里趟过的路或许能帮你避开一些弯路。2. 技术栈选型与架构思路2.1 为什么是React TypeScript Vite2019年前后我决定重写这个站点时前端生态正处在一个微妙的节点。Create React App (CRA) 依然是主流但Webpack的构建速度在项目稍大时就开始让人焦虑。Vite 1.x刚出现其基于ES Module的闪电般冷启动和热更新速度让我眼前一亮。对于个人项目快速验证想法、即时看到改动效果至关重要Vite完美契合了这个需求。它原生支持TypeScript和JSX配置极其简单几乎开箱即用这让我能更专注于业务逻辑而非构建配置。选择TypeScript而非纯JavaScript则是出于项目可维护性的长远考虑。即使是一个人开发的小项目清晰的类型定义也能极大减少运行时错误尤其是在处理东方Project复杂的角色、作品数据关系时。TypeScript的接口Interface和类型别名Type Alias能很好地定义数据模型配合React的组件Props类型检查代码的健壮性提升了一个档次。虽然初期学习曲线稍陡但带来的开发体验和代码提示的收益是巨大的。React的选择则更顺理成章。其组件化思想非常适合构建这种由多个独立内容区块如角色介绍、作品列表、画廊组成的页面。当时React Hooks已经稳定函数式组件加上Hooks的写法让逻辑复用和状态管理变得非常清爽不再需要面对Class组件中令人头疼的this绑定和生命周期方法。2.2 项目结构与职责划分项目的目录结构遵循了当时社区比较推崇的按功能模块划分的方式而不是传统的按文件类型components, pages, utils划分。这更贴合React“组件即一切”的理念。src/ ├── assets/ # 静态资源图片、字体、样式 ├── components/ # 通用共享组件Button, Card, Layout │ ├── common/ # 纯UI组件无业务逻辑 │ └── features/ # 业务功能组件如Gallery, MusicPlayer ├── features/ # 业务功能模块 │ ├── character/ # 角色介绍相关逻辑、组件、类型定义 │ ├── works/ # 作品列表模块 │ └── gallery/ # 图片画廊模块 ├── hooks/ # 自定义React Hooks ├── lib/ # 第三方库封装或工具函数 ├── pages/ # 页面级组件对应路由 ├── styles/ # 全局样式与CSS模块 ├── types/ # 全局TypeScript类型定义 └── main.tsx # 应用入口这种结构的核心思想是“高内聚、低耦合”。所有与“角色介绍”相关的东西——组件、工具函数、类型定义、甚至模拟数据——都放在features/character目录下。当需要修改或删除这个功能时影响范围非常清晰不会散落在项目的各个角落。components/目录下存放的是真正可复用的、与业务无关的“砖块”比如按钮、卡片、模态框等。注意这种“Feature-based”结构在项目初期功能较少时可能显得有些“重”但随着功能模块增加其维护优势会越来越明显。如果你的项目非常小只有2-3个页面从简单的“按类型划分”开始也未尝不可但最好心里有这根弦为未来的扩展留好余地。2.3 状态管理轻量化的选择对于这个项目我没有引入Redux、MobX这类重型状态管理库。原因很简单状态复杂度不高。大部分状态都是组件内部的UI状态如模态框是否打开、下拉菜单是否展开或者可以通过Props向下传递的数据。少量需要跨组件共享的状态我使用了React Context API结合useReducerHook。例如全局的主题深色/浅色模式和用户的语言偏好。Context能解决“Prop Drilling”属性层层传递的问题而useReducer提供了比useState更结构化的状态更新方式尤其适合状态逻辑较复杂的场景。// 示例主题Context interface ThemeState { mode: light | dark; } const ThemeContext React.createContext{ state: ThemeState; dispatch: React.DispatchAction; } | undefined(undefined); function themeReducer(state: ThemeState, action: Action): ThemeState { switch (action.type) { case TOGGLE_THEME: return { mode: state.mode light ? dark : light }; default: return state; } } export function ThemeProvider({ children }: { children: React.ReactNode }) { const [state, dispatch] useReducer(themeReducer, { mode: light }); return ( ThemeContext.Provider value{{ state, dispatch }} {children} /ThemeContext.Provider ); }实操心得不要盲目引入状态管理库。先仔细分析你的应用状态。如果大部分是局部状态用useState如果需要跨少量组件共享用Context只有当应用变得非常庞大存在大量异步逻辑和复杂的中间件需求时才考虑Redux Toolkit这类方案。过早优化是万恶之源。3. 核心功能模块实现解析3.1 基于文件系统的路由与懒加载项目使用react-router-domv6进行路由管理。为了保持结构清晰路由定义集中在一个文件中并且与pages/目录下的组件一一对应。一个关键优化是利用了Vite和React.lazy实现的动态导入懒加载。// router.tsx import { lazy, Suspense } from react; import { createBrowserRouter } from react-router-dom; // 使用lazy进行代码分割 const HomePage lazy(() import(./pages/Home)); const CharacterPage lazy(() import(./pages/Character)); const WorksPage lazy(() import(./pages/Works)); const router createBrowserRouter([ { path: /, element: ( // Suspense提供加载中的回退UI Suspense fallback{GlobalLoadingSpinner /} Layout / {/* 公共布局组件 */} /Suspense ), children: [ { index: true, element: HomePage / }, { path: character/:id, element: CharacterPage / }, { path: works, element: WorksPage / }, ], }, ]); // main.tsx import { RouterProvider } from react-router-dom; ReactDOM.createRoot(document.getElementById(root)!).render( React.StrictMode RouterProvider router{router} / /React.StrictMode );这样做的好处是初始加载的JavaScript包体积很小只有当前页面所需的代码。当用户点击导航到“作品列表”页面时才会动态加载WorksPage组件的代码。这在内容较多的站点上对首屏加载速度的提升非常显著。Vite在背后会自动进行代码分割。踩坑记录使用React.lazy时必须用Suspense组件包裹并提供fallback。否则在组件加载期间页面会是一片空白。fallback可以是一个简单的加载动画组件。另外懒加载的组件必须是export default导出的。3.2 数据获取与静态内容渲染作为一个同人资料站大部分内容角色介绍、作品信息是相对静态的。我最初尝试了直接从Markdown文件读取内容并渲染的方案。具体做法是将内容写在.md或.mdx文件中利用Vite插件如vite-plugin-md在构建时将其转换为React组件或JSON数据。// 1. 配置vite.config.ts import Markdown from vite-plugin-md; export default defineConfig({ plugins: [ React(), Markdown(), // 处理.md文件 ], }); // 2. 直接导入.md文件 import CharacterIntro from ../data/character-intro.md?raw; // Vite的raw导入 // 3. 使用一个Markdown渲染组件例如react-markdown import ReactMarkdown from react-markdown; function CharacterPage() { return ( article ReactMarkdown{CharacterIntro}/ReactMarkdown /article ); }这种方式将内容和代码分离非技术人员也能通过修改Markdown文件来更新网站内容非常友好。而且由于内容在构建时就已经确定可以直接生成静态HTML对SEO和加载速度都极有益处。注意事项如果内容需要支持富文本或自定义组件可以考虑使用MDXMarkdown JSX。它允许你在Markdown中直接使用React组件灵活性更高但配置也稍复杂一些。对于纯内容展示react-markdown库足够轻量且高效。3.3 图片画廊的性能优化“画廊”模块展示如何月的相关图片这是前端性能的一个常见挑战。我主要做了以下几方面优化图片格式与压缩将所有图片转换为现代格式WebP并在不损失视觉质量的前提下进行压缩。我使用了构建脚本在npm run build时自动调用sharp库批量处理src/assets/images目录下的图片并输出到dist目录。WebP格式通常比同质量的JPEG或PNG小25%-35%。懒加载Lazy Loading使用原生img loadinglazy /属性或者Intersection Observer API实现自定义懒加载。这样只有当图片滚动到视口附近时才开始加载减少了初始页面的网络请求和内存占用。响应式图片Responsive Images针对不同屏幕尺寸和分辨率提供不同尺寸的图片源。使用picture元素和srcset属性。// 一个优化后的图片组件示例 interface OptimizedImageProps { src: string; alt: string; width: number; height: number; } function OptimizedImage({ src, alt, width, height }: OptimizedImageProps) { const webpSrc src.replace(/\.(jpg|png)$/, .webp); return ( picture {/* 优先提供WebP格式 */} source srcSet{webpSrc} typeimage/webp / {/* 兼容性回退 */} source srcSet{src} type{image/${src.split(.).pop()}} / img src{src} alt{alt} width{width} height{height} loadinglazy style{{ maxWidth: 100%, height: auto }} // 保持宽高比 / /picture ); }虚拟列表Virtual List当画廊图片数量非常多比如上百张时一次性渲染所有DOM节点会导致严重的性能问题。我引入了react-window库实现虚拟列表。它只渲染可视区域内的图片元素大幅提升了滚动流畅度。实操心得图片优化是前端性能提升的“低垂果实”投入产出比很高。建议在项目初期就建立图片处理流程。可以使用像vite-plugin-imagemin这样的插件在构建时自动压缩或者将图片托管到支持自动格式转换和尺寸裁剪的CDN服务上。4. 开发体验与工程化配置4.1 基于Vite的极致开发体验Vite的开发服务器基于原生ESM启动速度极快。我的项目冷启动时间在1秒以内热更新HMR几乎在保存文件的同时就能在浏览器中反映出来这种流畅感是Webpack时代难以想象的。vite.config.ts的配置也非常简洁明了。// vite.config.ts import { defineConfig } from vite; import react from vitejs/plugin-react; import path from path; export default defineConfig({ plugins: [react()], resolve: { alias: { : path.resolve(__dirname, ./src), // 配置路径别名方便导入 }, }, server: { port: 3000, open: true, // 启动后自动打开浏览器 }, build: { outDir: dist, sourcemap: true, // 生产环境生成sourcemap方便调试 rollupOptions: { output: { // 对chunk文件进行更好的命名便于缓存 manualChunks(id) { if (id.includes(node_modules)) { return vendor; } }, }, }, }, });路径别名的配置强烈推荐。它让导入语句从../../../components/Button变成了/components/Button代码清爽了很多移动文件时也不必再手动修改一堆相对路径。4.2 TypeScript的严格模式与ESLint/Prettier为了保持代码质量我开启了TypeScript最严格的检查选项tsconfig.json中的strict: true并配合ESLint和Prettier进行代码规范和格式化。// tsconfig.json 核心配置 { compilerOptions: { target: ES2020, useDefineForClassFields: true, lib: [ES2020, DOM, DOM.Iterable], module: ESNext, skipLibCheck: true, moduleResolution: bundler, allowImportingTsExtensions: true, resolveJsonModule: true, isolatedModules: true, noEmit: true, jsx: react-jsx, strict: true, // 开启所有严格类型检查 noUnusedLocals: true, noUnusedParameters: true, noFallthroughCasesInSwitch: true, baseUrl: ., paths: { /*: [./src/*] // 配合Vite别名 } }, include: [src], references: [{ path: ./tsconfig.node.json }] }在package.json中配置脚本可以在提交代码前自动检查和格式化。scripts: { dev: vite, build: tsc vite build, lint: eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0, prettier: prettier --write \src/**/*.{ts,tsx,css,md}\, pre-commit: npm run lint npm run prettier }踩坑记录strict: true一开始会报很多类型错误让人有点抓狂但请坚持下去。它强迫你写出类型安全的代码从长远看节省了大量的调试时间。对于第三方库缺乏类型定义的情况可以创建src/types/目录来存放自定义的类型声明文件.d.ts。4.3 样式方案CSS Modules与CSS-in-JS的取舍项目中我主要使用了CSS Modules。它的好处是样式默认局部作用避免了全局污染同时写法又和原生CSS一样学习成本低。Vite原生支持CSS Modules只需将文件命名为*.module.css即可。/* Button.module.css */ .primary { background-color: #007bff; color: white; padding: 0.5rem 1rem; border: none; border-radius: 4px; } .primary:hover { background-color: #0056b3; }// Button.tsx import styles from ./Button.module.css; interface ButtonProps extends React.ButtonHTMLAttributesHTMLButtonElement { variant?: primary | secondary; } export function Button({ variant primary, className, ...props }: ButtonProps) { const variantClass variant primary ? styles.primary : styles.secondary; return button className{${variantClass} ${className || }} {...props} /; }我也尝试了styled-components这类CSS-in-JS方案它确实非常灵活可以将样式直接写在组件文件中并且能轻松地基于props动态调整样式。但考虑到这是一个内容为主的静态站点我更看重的是可缓存性和构建速度。CSS Modules生成的静态CSS文件可以被浏览器缓存而CSS-in-JS的样式通常在运行时注入可能会影响首屏渲染速度虽然新版本有优化。最终为了更稳定的性能和更简单的架构我选择了CSS Modules。注意样式方案没有绝对的好坏只有是否适合。如果你的项目有大量动态主题、样式需要频繁根据状态变化CSS-in-JS可能是更好的选择。对于偏展示型、追求极致性能的站点CSS Modules或Utility-First的Tailwind CSS更值得考虑。5. 部署与持续集成5.1 静态站点托管选择由于项目是纯静态的构建后生成dist目录包含HTML、CSS、JS和资源文件托管选择非常多。我最终选择了Vercel原因如下无缝的Git集成连接GitHub仓库后每次git push到主分支都会自动触发部署。极快的全球CDN生成的站点被部署到全球边缘网络访问速度快。自定义域名和HTTPS免费提供配置简单。预览部署针对每个Pull Request生成独立的预览URL方便团队评审。部署配置极其简单基本上就是“零配置”。Vercel会自动检测到这是一个Vite React项目并运行npm run build进行构建。替代方案Netlify是另一个非常优秀的同类平台功能类似。如果你更喜欢自己掌控可以将dist目录上传到任何对象存储服务如AWS S3、Google Cloud Storage或Cloudflare R2然后配置CDN和域名即可。5.2 自动化工作流利用GitHub Actions我设置了一个简单的CI持续集成流程在每次推送代码时自动运行测试如果有的话和代码检查。# .github/workflows/ci.yml name: CI on: [push, pull_request] jobs: lint-and-test: runs-on: ubuntu-latest steps: - uses: actions/checkoutv3 - name: Setup Node.js uses: actions/setup-nodev3 with: node-version: 18 cache: npm - name: Install Dependencies run: npm ci # 使用ci命令确保依赖锁一致 - name: Run Linter run: npm run lint # - name: Run Tests # run: npm test - name: Build Project run: npm run build这个流程能及早发现代码风格问题和构建错误避免有问题的代码被合并到主分支。对于个人项目这或许不是必须的但它培养了一种良好的工程习惯。6. 项目复盘与迁移至“如何月ポータル”6.1 为何停止维护并启动新项目“如何月HUB”运行了几年后我逐渐发现了它的几个局限性架构僵化早期的技术选型和代码结构在应对新需求时显得不够灵活。例如想增加一个用户评论功能就需要大动干戈。技术债一些早期为了快速实现而写的“临时方案”变成了“永久方案”代码可读性下降。内容管理不便虽然用Markdown管理内容但每次更新都需要重新构建和部署对于非技术运营者不够友好。因此我决定启动“如何月ポータル”项目。新项目在技术栈上进行了升级如使用了Next.js App Router引入了更规范的状态管理但更重要的是架构理念的转变从“静态内容站”转向了“动态内容门户”。新项目计划接入一个Headless CMS内容管理系统让内容更新可以通过后台界面完成无需触碰代码。同时设计上更注重交互性和社区功能。6.2 从旧项目迁移的经验教训迁移过程并非重写所有代码而是有策略地复用和重构。资产迁移图片、字体等静态资源可以直接复制到新项目。组件重构对于UI组件如Button、Card我评估了其设计是否过时、API是否合理。设计良好的组件直接复制有问题的则利用这个机会用更新的模式如Compound Components重写。逻辑抽取将旧项目中的工具函数、自定义Hooks、类型定义仔细审查并迁移。这是一个清理技术债的好机会可以统一代码风格补充单元测试。数据迁移将Markdown文件中的内容通过脚本批量转换为新CMS所需的数据格式如JSON然后导入。这个过程让我深刻体会到设计系统和清晰的模块边界的重要性。如果旧项目的组件从一开始就设计良好、职责单一迁移成本会低得多。7. 给后来者的建议回顾整个“如何月HUB”项目它是我前端学习之路上的一个扎实的脚印。如果你也想启动一个类似的技术实践项目我的建议是不要过度设计但要为变化留好接口。项目初期你无法预知所有未来需求。选择一个你熟悉且能快速上手的栈比如Vite React先做出一个可用的版本。但在设计组件和模块时要有意识地思考“如果这里以后要改会不会很麻烦”。良好的命名、单一职责、清晰的Props接口这些简单的原则能极大提升代码的适应能力。性能优化要有节奏。不要一开始就追求极致的性能。先保证功能正确、用户体验流畅。在项目有一定规模后再用Lighthouse等工具进行性能测评有针对性地优化瓶颈如图片、包体积、渲染性能。记住“过早优化是万恶之源”。文档和注释不是可选项。即使是个人项目也请为复杂的逻辑、重要的决策点写下注释。几个月后你自己也会忘记当时为什么这么写。如果项目开源清晰的README和代码注释是吸引贡献者的第一步。享受过程而不仅仅是结果。个人项目最大的价值在于学习。大胆尝试新技术踩坑然后爬出来。把“如何月HUB”归档我没有任何遗憾因为它已经完成了它的使命让我学到了东西并成为了下一个更好项目的基石。

相关文章:

基于Vite+React+TypeScript的现代Web应用开发实践与架构演进

1. 项目概述与背景最近在整理自己的开源项目时,我决定把几年前做的一个老项目“如何月HUB”正式归档,并写篇文章记录一下它的始末。这个项目本质上是一个基于React和TypeScript的东方Project二次创作同人网站,主要展示“如何月”这个角色的相…...

电源PCB虚焊反复?抓准核心诱因,批量良率稳提至98%

做工业电源、车载电源的工程师和采购,没人没被虚焊折磨过:批量生产时,电源模块通电后时通时断、负载发热严重,拆解一看,功率管、电解电容引脚焊点灰暗、一碰就掉。某新能源电源厂商反馈:首批 5000 片 12V/5…...

Cloudflare Workers + ChatGPT插件开发实战:从零构建AI应用后端

1. 项目概述:当Cloudflare遇上ChatGPT插件 最近在折腾AI应用部署的朋友,估计都绕不开两个名字:Cloudflare和ChatGPT。前者是边缘计算的巨头,后者是AI对话的标杆。当这两个名字出现在同一个GitHub仓库里—— cloudflare/chatgpt-…...

告别Selenium弹窗烦恼:用Playwright Python实现无头浏览器文件自动下载(附pytest实战代码)

告别Selenium弹窗烦恼:用Playwright Python实现无头浏览器文件自动下载(附pytest实战代码) 在自动化测试和爬虫开发领域,文件下载一直是个令人头疼的问题。传统工具如Selenium虽然功能强大,但遇到浏览器弹窗时往往束手…...

SIEMENS 6SE7012-0TP50-Z变频器

SIEMENS 6SE7012-0TP50-Z 是西门子 SIMOVERT MASTERDRIVES MC 系列中的一款紧凑型变频器,属于运动控制领域的工程型传动产品。以下是该模块的15条主要产品特点:中间15条特点:属于 SIMOVERT MASTERDRIVES MC 运动控制系列,为 Compa…...

从VSCode转战华为云CodeArts IDE:我的Python开发环境迁移与配置实战

从VSCode转战华为云CodeArts IDE:我的Python开发环境迁移与配置实战 作为一名长期使用VSCode进行Python开发的工程师,最近我决定尝试华为云推出的CodeArts IDE。这个决定源于对国产开发工具的好奇,也希望能探索更多高效的开发可能性。迁移过程…...

题解:AcWing 6031 计算

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大…...

告别Python命令行!用SheetJS社区版在前端搞定Excel转JSON(附完整代码)

告别Python命令行!用SheetJS社区版在前端搞定Excel转JSON(附完整代码) 在数据处理领域,Excel文件与JSON格式的相互转换一直是高频需求。传统解决方案往往依赖Python等后端语言,通过openpyxl等库处理后再用pyinstaller打…...

计算机科学教材编写框架与数据存储技术详解

1. 计算机科学教材编写的基本框架计算机科学教材的编写是一项系统工程,需要兼顾学术严谨性和教学实用性。一本优秀的计算机科学教材应当像一座精心设计的建筑,既有坚实的理论基础作为地基,又有清晰的知识结构作为框架,还要有丰富的…...

一键部署OpenClaw:全自动脚本集成服务器安全加固实践

1. 项目概述:一键构建安全的OpenClaw私有部署环境最近在折腾一个叫OpenClaw的开源项目,它本质上是一个功能强大的AI网关和编排工具,能帮你把各种大模型API(比如OpenAI、Claude、Anthropic这些)统一管理起来&#xff0c…...

AI公平性检测:多阶段审计框架与性别偏见解决方案

1. 项目背景与核心问题去年参与某金融风控项目时,我们团队发现一个诡异现象:同一套AI评分模型对女性客户的拒贷率比男性高出23%。排查后发现训练数据中女性样本仅占38%,且历史放贷记录存在隐性性别歧视。这个案例让我意识到,AI偏见…...

构建私有AI智能体指挥中心:本地大模型与可观测性治理实践

1. 项目概述:构建一个私有、可审计的AI智能体指挥中心最近几年,AI Agent(智能体)的概念火得一塌糊涂,从AutoGPT到各种AI工作流自动化工具,大家都在畅想一个能自主完成任务、解放生产力的未来。但作为一名在…...

别再手动传固件了!用麒麟OS+TFTP服务5分钟搞定网络设备批量升级

麒麟OSTFTP:网络设备批量升级的自动化利器 每次面对机房几十台交换机闪烁的指示灯,手动一台台升级固件的场景是否让你头皮发麻?传统方式不仅耗时耗力,还容易因人为操作失误导致设备异常。事实上,利用麒麟服务器操作系统…...

flowable 整合达梦V8

package com.dingxin.flowable.config;import org.flowable.spring.SpringProcessEngineConfiguration; import org.flowable.spring.boot.EngineConfigurationConfigurer; import org.springframework.context.annotation.Configuration;/*** Flowable 配置类* 用于配置达梦数…...

项目管理怎么做?3步让团队效率翻倍

很多团队上了项目管理工具,结果用不起来。不是工具不好,是方法不对。今天分享一套实战经验,帮你用好项目管理。 简道云项目管理是专为国内各类企业打造的零代码轻量化项目管理解决方案,无需专业技术开发能力,即可快速…...

百度网盘提取码快速获取指南:3步高效解决访问难题

百度网盘提取码快速获取指南:3步高效解决访问难题 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 还在为百度网盘资源访问而烦恼吗?每次遇到需要提取码的分享链接,我们都需要在多个平台间来…...

Codeforces Round 1095 (Div. 2) 补题

C. Mental Monumental (Easy Version)自己的思路:打表发现一个数的余数可以是 [ 0 , (x-1)/2 ] U {x},维护一个suf数组去二分答案,但是发现无法兼顾两种贡献方式,遂没写出来两种贡献: 1.x2.[0,(x-1)/2]正解&#xff1a…...

测试CIU32F003中的比较器

简 介: 本文介绍了CU32F003单片机内部比较器的测试过程。通过设计专用测试电路板,验证了比较器1的基本性能,包括使用PB0作为信号输入、PB3作为输出,并利用内部0.8V带隙参考电压作为比较基准。测试展示了比较器输出与输入信号的延迟…...

通过用量看板直观观测不同模型的Token消耗与成本分布

通过用量看板直观观测不同模型的Token消耗与成本分布 1. 用量看板的核心价值 Taotoken平台提供的用量看板功能,为开发者提供了透明化的API调用成本观测能力。通过该功能,用户可以清晰地追踪每个API Key的调用情况,包括成功请求数、失败请求…...

【hermes agent】配置model为百度千帆

文档 https://cloud.baidu.com/doc/LS/s/jmob90xi6 lite的模型列表 Custom OpenAI-compatible endpoint configuration:API base URL [e.g. https://api.example.com/v1]: https://qianfan.baidubce.com/v2/coding API key...

5分钟解决RTranslator模型下载难题:告别数小时等待的终极方案

5分钟解决RTranslator模型下载难题:告别数小时等待的终极方案 【免费下载链接】RTranslator Open source real-time translation app for Android that runs locally 项目地址: https://gitcode.com/GitHub_Trending/rt/RTranslator 还在为RTranslator首次启…...

3分钟掌握ROFL-Player:英雄联盟回放分析终极指南

3分钟掌握ROFL-Player:英雄联盟回放分析终极指南 【免费下载链接】ROFL-Player (No longer supported) One stop shop utility for viewing League of Legends replays! 项目地址: https://gitcode.com/gh_mirrors/ro/ROFL-Player 还在为英雄联盟回放文件打不…...

中兴光猫Telnet开启工具|支持2024年8月前原厂固件|一键修改SN/MAC/密码/配置导出

温馨提示:文末有联系方式工具核心功能概览 本款中兴光猫专用网络维护工具,专为技术型用户设计,全面支持2024年8月以前出厂的中兴原厂固件设备,无需刷机、不依赖第三方固件,安全稳定启用底层调试接口。Telnet远程调试一…...

python codecov

# Python Codecov 深度解析:从一个真实项目说起 前阵子遇到一个挺有意思的事。有个同事负责的微服务上线后,QA那边报了一个边界情况的bug——某个输入参数为空列表时,程序直接炸了。翻了翻代码仓库,发现这个函数上个月重构过&…...

【Swoole+LLM生产级长连接架构】:从内存泄漏到心跳保活,20年老兵手把手调优全过程

更多请点击: https://intelliparadigm.com 第一章:SwooleLLM生产级长连接架构全景概览 在高并发、低延迟的AI服务场景中,传统HTTP短连接难以支撑LLM推理会话的持续交互需求。Swoole作为高性能异步协程PHP引擎,与大语言模型服务深…...

Dev Container 启动慢如龟速,CPU 占用飙至98%?揭秘 .devcontainer.json 配置中被忽略的7个致命参数

更多请点击: https://intelliparadigm.com 第一章:Dev Container 启动性能瓶颈的系统性诊断 核心观测维度 Dev Container 启动延迟通常并非单一原因所致,需从镜像拉取、配置解析、挂载初始化、容器运行时准备及 VS Code 扩展加载五个关键维…...

EMC 三要素:干扰源-耦合路径-敏感设备,所有问题的根源

产品上电的瞬间,开关电源的尖峰噪声沿着PCB蔓延,敏感运放开始出现莫名其妙的下拉——这种情况在做硬件的日常中太常见了。查来查去,最后发现根因往往就藏在这三个地方:干扰源、耦合路径、敏感设备。这就是EMC领域里说的三要素模型…...

ComfyUI MediaPipe 终极填坑:解决 incompatible function arguments 报错,基于代理模式的猴子补丁升级版

https://pypi.org/project/mediapipe/#description https://chuoling.github.io/mediapipe/getting_started/python.html ComfyUI MediaPipe 终极填坑:解决 incompatible function arguments 报错,基于代理模式的猴子补丁升级版 系列文章回顾&#xff1…...

3个实用技巧彻底解决抖音视频批量下载难题

3个实用技巧彻底解决抖音视频批量下载难题 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音批量下载工具&a…...

《2026年Z世代五一出行图鉴》出炉,Soul App洞察年轻人出行偏好

在智能推荐驱动的社交环境中,年轻人的旅行观念正发生悄然转变,旅行不再是社交媒体上的攀比素材,也不再是单纯的逃离式出行,而是缓解压力、滋养情绪的私人化体验。作为深受Z世代喜爱的社交平台之一,Soul App精准捕捉到这…...