Cypress测试性能优化实战:7大策略提升E2E测试执行效率
1. 项目概述为什么Cypress测试也需要“性能优化”如果你和我一样长期用Cypress配合Testing Library来写前端集成测试大概率经历过这样的场景随着项目迭代测试套件从几十个慢慢膨胀到几百个每次跑npm run test:e2e看着终端里一行行滚动的日志从最初的几秒变成几分钟甚至十几分钟。CI/CD流水线开始频繁超时开发者的本地反馈循环被严重拖慢每次提交代码前都要等上一杯咖啡的时间才能确认自己的改动没有破坏现有功能。这不仅仅是等待的烦躁更是开发效率和团队协作成本的直接损耗。Cypress Testing Library本身是一对黄金组合前者提供了强大的端到端测试能力后者则倡导以用户视角通过角色、文本、标签查询DOM元素让测试更健壮、更贴近真实用户行为。但正是这种“真实”带来了性能开销Cypress需要启动一个真实的浏览器加载完整的应用执行每一个命令并等待其响应Testing Library的查询虽然健壮但可能比简单的cy.get(‘[data-testid]’)更耗时。当测试用例成百上千时这些微小的开销累积起来就成了性能瓶颈。因此为Cypress测试做性能优化绝不是简单的“代码技巧”而是一项直接影响研发效能的基础设施建设。它关乎开发者的“心流”体验、CI资源的有效利用以及项目能否持续健康迭代。今天我就结合自己踩过的坑和实战经验分享7个经过验证、能显著减少测试执行时间的核心策略。这些策略覆盖了从测试架构、编写模式到运行配置的方方面面目标是让你在享受Cypress Testing Library带来的健壮性同时不再为漫长的等待而苦恼。2. 测试架构与设计层面的优化策略优化测试性能首先要从顶层设计入手。错误的测试结构和编写模式是导致执行缓慢的根源修修补补不如从源头重构。2.1 策略一重构测试套件实现智能测试隔离与状态管理Cypress的默认行为是在每个测试文件it块运行后并不完全清理浏览器状态。虽然它有自己的测试隔离机制清理localStorage,cookies,sessionStorage但应用的内部状态如Redux store、Vuex state、内存中的变量和DOM状态是会保留下来的。很多团队的习惯是在每个测试用例it开始时都用cy.visit(‘/’)重新访问首页并登录这造成了巨大的重复开销。核心思路是按需重置而非全量重启。我们需要根据测试的破坏性来分层管理状态。识别“干净”与“脏”测试将测试分为两类。一类是“干净”的只读测试比如验证页面静态内容、导航栏显示另一类是“脏”的写入测试比如提交表单、删除数据、修改用户设置。“脏”测试会改变应用状态可能影响后续测试。使用before和beforeEach钩子进行分层设置before在整个测试套件describe块运行前执行一次。这里适合做代价最高、但状态稳定的操作比如登录用户。我们称之为“全局前置条件”。// cypress/e2e/user-profile.cy.js describe(‘用户个人中心’, () { before(() { // 仅执行一次以测试用户身份登录 cy.loginByApi(‘testuserexample.com‘, ‘password123’); // 使用API登录比UI登录快一个数量级 cy.visit(‘/dashboard’); // 登录后跳转到仪表盘 }); // ... 后续的测试用例都基于已登录状态 });beforeEach在每个测试用例it前执行。这里适合重置那些会被“脏”测试修改的特定状态而不是整个应用。例如如果测试是修改个人资料那么beforeEach里只需要确保导航到个人资料页或者重置一个测试专用的用户资料副本而不是重新登录。利用after或afterEach进行针对性清理对于“脏”测试如果它创建了测试数据如一篇新文章应在after或afterEach中通过API删除这些数据防止数据堆积影响后续测试或污染数据库。为独立性强、破坏性大的测试单独开套件对于那些需要完全纯净环境的测试例如注册流程、支付流程不要把它们和其他的测试塞在同一个describe里。单独创建一个测试文件让它自己管理完整的生命周期before里可能什么都不做每个it里都cy.visit(‘/’)。虽然这个文件本身可能稍慢但它避免了污染其他大量测试从整体上节省了时间。实操心得我们项目曾有一个包含30个测试用例的“订单管理”套件每个用例都从首页登录开始总耗时约4分钟。通过应用上述策略将登录移至before并为涉及订单状态变更的测试添加特定的状态重置通过调用内部API总耗时降低到了1分半钟。关键在于分析测试依赖用最细粒度的操作代替最粗粒度的重置。2.2 策略二拥抱命令日志与自定义命令消除重复等待Cypress的命令队列是异步的但编写测试时很容易陷入“隐式等待”的陷阱或者写出重复的查询逻辑这都会拖慢测试。深度理解并利用Cypress的重试与超时机制Cypress的核心优势之一是其内置的智能重试。对于cy.get(),cy.findByRole()等命令Cypress会自动重试直到元素出现或命令超时。这意味着你通常不需要自己写cy.wait(5000)这种固定等待。反面例子cy.get(‘.loading-spinner’).should(‘not.exist’); cy.wait(1000); // 多余的等待 cy.get(‘[data-testid”submit-btn”]’).click();正确做法直接断言元素可交互后操作。Cypress的.click()本身也会等待元素达到可点击状态。cy.get(‘.loading-spinner’).should(‘not.exist’); cy.get(‘[data-testid”submit-btn”]’).should(‘be.enabled’).click(); // .click()会隐含等待为常用操作设置合理的自定义超时{ timeout: 10000 }比全局增加超时时间更有效。用自定义命令封装高频、多步操作如果多个测试用例都需要执行“登录并跳转到某页面”或“创建一条测试数据”将其封装为自定义命令。这不仅能减少代码重复更重要的是你可以在自定义命令内部进行最优化的等待和断言避免每个用例都写一遍相同的等待逻辑。// cypress/support/commands.js Cypress.Commands.add(‘loginAndGoToSettings’, (username, password) { cy.loginByApi(username, password); // 快速API登录 cy.visit(‘/settings’); // 确保设置页面核心元素已加载避免后续测试因页面未就绪而失败重试 cy.findByRole(‘heading’, { name: /设置/i }).should(‘be.visible’); }); // 在测试中使用 it(‘应该能更新用户名’, () { cy.loginAndGoToSettings(‘user1‘, ‘pass’); // 直接开始测试逻辑无需关心登录和导航的细节与等待 cy.findByLabelText(‘用户名’).clear().type(‘新用户名’); cy.findByRole(‘button’, { name: ‘保存’ }).click(); cy.contains(‘更新成功’).should(‘be.visible’); });性能收益自定义命令内部的等待是精确且一致的。避免了新手开发者因为不确定而添加的过长cy.wait也通过复用避免了重复执行相同的低效步骤。3. 测试编写与查询优化策略测试代码本身的写法对性能有直接影响。特别是使用Testing Library时查询策略决定了Cypress要在DOM中搜索多久。3.1 策略三优化Testing Library查询让查找更快更准testing-library/cypress提供了findBy*和findAllBy*系列查询。它们默认会重试直到元素出现类似Cypress命令但不同的查询方式和参数对性能有细微影响。优先使用findByRole这是Testing Library最推荐、也通常是性能最好的查询方式。浏览器对角色role有原生支持查询速度快且最能体现可访问性使测试更健壮。优化前cy.get(‘.btn-primary’).click();// 依赖不稳定的CSS类优化后cy.findByRole(‘button’, { name: ‘提交’ }).click();// 通过角色和可访问名称定位精准且快。为关键交互元素按钮、链接、输入框添加明确的aria-label或确保其有可访问的文本内容是配合此策略的前置工作这也提升了应用本身的可访问性。为findByTestId设立使用边界>// 复杂的股票行情表格中的某个单元格用其他方式很难定位 cy.findByTestId(‘stock-table-cell-AAPL-price’).should(‘have.text’, ‘$150.23’);避免在循环或频繁调用的地方使用findAllBy*findAllBy*会查询所有匹配元素返回一个数组。如果只需要第一个或某个特定元素使用findBy*并搭配更精确的选项如name,level对于标题会更高效。谨慎使用container参数进行范围查找默认情况下查询在整个document中进行。如果你能确定元素只在某个特定容器内可以传入container参数来缩小搜索范围提升查询速度。这在模态框Modal、抽屉Drawer内查找元素时特别有用。cy.get(‘[data-testid”modal”]’).within(() { // within 创建了一个作用域 cy.findByRole(‘button’, { name: ‘确认’ }).click(); // 只在这个modal内查找更快 }); // 或者直接使用container参数如果已有容器引用 cy.get(‘[data-testid”modal”]’).then(($modal) { cy.findByRole(‘button’, { name: ‘确认’ }, { container: $modal[0] }).click(); });3.2 策略四减少不必要的断言与操作保持测试精简每个cy.should()断言和cy.click()等操作都需要时间。编写“经济”的测试用例。断言“什么”而不是“一切”一个测试用例应该有一个明确的测试目标。只断言与这个目标直接相关的输出。例如测试一个登录功能成功后的断言应该是“跳转到了仪表盘页面”或“显示了用户菜单”而不是去断言页面上每一个静态文本都存在。过度断言登录后断言导航栏、侧边栏、欢迎语、用户头像等十几个元素都存在。精准断言登录后cy.url().should(‘include’, ‘/dashboard’)或cy.findByText(‘欢迎回来’).should(‘be.visible’)。一个关键断言足以证明功能正确。合并连贯的操作Cypress支持命令链但也要避免无意义的拆分。对于用户的一个连贯操作可以用一个命令完成。冗余操作cy.findByLabelText(‘邮箱’).click(); cy.findByLabelText(‘邮箱’).type(‘userexample.com‘);优化操作cy.findByLabelText(‘邮箱’).type(‘userexample.com‘);//.type()会自动将焦点聚焦到输入框。警惕“隐身”的等待快照和截图cy.screenshot()和命令日志中的快照对于调试非常有用但在CI环境中大量使用会显著增加执行时间和存储开销。仅在失败时截图是一个好习惯。可以通过配置screenshotOnRunFailure为true并关闭video录制除非必要来优化。// cypress.config.js module.exports defineConfig({ e2e: { screenshotOnRunFailure: true, // 仅失败时截图 video: false, // 关闭视频录制对性能提升巨大 // ... 其他配置 }, });4. 运行配置与基础设施调优再好的测试代码也需要在优化的环境中运行。Cypress的运行配置和CI环境设置对总执行时间的影响是数量级的。4.1 策略五并行化测试执行充分利用计算资源当测试套件达到一定规模串行执行是最大的时间瓶颈。并行化是减少总执行时间的“杀手锏”。使用Cypress Cloud原Dashboard Service或第三方工具实现并行化Cypress官方商业版提供了最集成的并行化方案。其原理是将测试文件列表动态分配给多个CI机器运行器同时执行。你需要将项目连接到Cypress Cloud并在CI配置中设置parallel和record参数。# 例如在GitHub Actions中的配置片段 - name: Run Cypress E2E Tests uses: cypress-io/github-actionv6 with: record: true parallel: true group: ‘E2E Tests on Chrome’ env: CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}分组策略你可以通过--group参数和--ci-build-id来更精细地控制分组例如将核心冒烟测试和完整回归测试分开并行。基于测试时长进行智能负载均衡简单的按文件数量平分可能不均因为每个测试文件耗时不同。Cypress Cloud的“智能负载均衡”功能会记录历史测试时长并在下次并行运行时将总时长相近的测试包分给每个运行器使所有机器几乎同时结束最大化并行效率。这是付费功能但对于大型项目物有所值。如果没有商业版可以考虑基于文件的手动分割你可以自己写脚本将cypress/e2e/下的测试文件列表分成N份然后在CI上启动N个独立的job来分别执行一份列表。这需要更复杂的CI配置和结果汇总但也能实现基本的并行。注意事项并行化会显著增加CI的基础设施成本需要更多机器/容器和复杂度日志聚合、失败排查。建议在测试套件稳定、失败率较低后再引入。同时确保测试之间没有隐藏的依赖真正做到独立否则并行运行会引发随机失败。4.2 策略六优化Cypress运行配置榨干每一秒性能Cypress的配置文件cypress.config.js里有很多影响性能的开关。调整numTestsKeptInMemory这个配置控制Cypress在运行期间保留在内存中的测试数量。默认值可能较低。当测试文件很多时Cypress需要频繁地从磁盘重新读取测试文件造成I/O开销。适当增加这个值例如从默认的50增加到100或200可以减少磁盘读取尤其对SSD不那么快的CI环境有帮助。但注意不要设得过高以免内存溢出。// cypress.config.js module.exports defineConfig({ e2e: { numTestsKeptInMemory: 150, // ... 其他配置 }, });禁用不需要的experimental*功能Cypress的一些实验性功能如experimentalSourceRewriting用于改进错误堆栈或experimentalStudio可能会引入额外开销。在生产CI环境中如果不需要它们最好关闭。使用baseUrl始终在配置中设置baseUrl。这样当你使用cy.visit(‘/path’)时Cypress会直接拼接baseUrl ‘/path’而不是依赖前一个页面的相对路径行为更确定且避免了潜在的冗余解析。选择更快的浏览器如果适用在CI环境中electron浏览器通常是预装且最稳定的但chrome或chromium在某些操作上可能更快。你可以进行对比测试。在cypress run时通过--browser chrome指定。4.3 策略七打造高效的CI/CD流水线与缓存策略CI环境是测试执行的主战场其配置直接决定了“硬性”耗时。实现依赖缓存最耗时的步骤之一就是每次CI运行都重新安装node_modules。利用CI系统如GitHub Actions, GitLab CI, Jenkins的缓存功能缓存node_modules和Cypress二进制包。# GitHub Actions 缓存示例 - name: Cache node_modules and Cypress uses: actions/cachev3 with: path: | **/node_modules ~/.cache/Cypress key: ${{ runner.os }}-cypress-${{ hashFiles(‘**/package-lock.json’) }} restore-keys: | ${{ runner.os }}-cypress-缓存命中后安装步骤可能从几分钟缩短到几秒钟。构建产物缓存与复用如果你的测试需要先构建前端应用例如npm run build并且代码变更不涉及依赖更新可以考虑缓存构建输出目录如dist/,build/。这样在仅修改测试代码或文档时可以跳过构建步骤。分层测试与选择性执行不是每次提交都需要跑全部E2E测试。提交门禁Pre-commit运行一个超快的核心冒烟测试子集 2分钟确保基本功能正常。Pull Request运行与改动模块相关的集成测试套件。可以通过分析文件变更用工具如jest --findRelatedTests用于单元测试对E2E可自定义脚本动态决定运行哪些E2E测试文件。主干/定时任务每天或每次合并到主干后运行完整的E2E回归测试套件。优化CI机器配置确保CI机器有足够的CPU和内存。特别是内存不足会导致浏览器频繁崩溃或变慢反而浪费更多时间。SSD磁盘是必须的。5. 高级技巧与持续监控在应用了上述基础策略后还可以通过一些高级手段和持续监控来进一步微调和保持测试性能的健康度。5.1 利用插件进行测试分割与动态加载对于超大型项目即使并行化单个测试文件也可能非常大。可以考虑使用像cypress-split这样的插件它支持在单个文件内部对测试用例it块进行分割和并行实现更极致的负载均衡。这需要对测试结构有较好的设计避免用例间的状态依赖。5.2 实施测试性能监控与告警性能优化不是一劳永逸的。随着功能增加测试时间会自然增长。需要建立监控机制。记录测试时长Cypress Cloud Dashboard 天然提供了每个测试文件和历史运行时间的图表。你也可以在CI脚本中使用--reporter json输出JSON格式的报告然后解析并记录总耗时到监控系统如Datadog, Prometheus。设置耗时阈值告警为整套测试的总体耗时、或者关键核心测试集的耗时设置一个阈值例如核心测试集超过10分钟总集超过30分钟。当CI运行时间超过阈值时通过CI告警或Slack等工具通知团队及时回顾并优化新增的或变慢的测试。定期审查“最慢的测试”定期查看Cypress Dashboard或测试报告找出耗时最长的几个测试文件。分析它们慢的原因是操作步骤太多等待时间过长还是测试了过于复杂的集成场景针对这些“瓶颈”进行重构或拆分。5.3 平衡性能与测试质量不要过度优化最后也是最重要的提醒所有优化都必须在保证测试可靠性和覆盖核心场景的前提下进行。不要为了快而牺牲稳定性移除所有cy.wait(毫秒数)是目标但必须用更健壮的等待条件如should(‘be.visible’),should(‘have.value’, ‘xxx’)来替代。一个运行飞快但随机失败的测试套件毫无价值。谨慎对待“跳过”或“禁用”测试不要因为某个测试跑得慢就轻易跳过它。首先要理解它为什么慢是否可以通过模拟Mock部分后端接口来加速是否可以将一个庞大的测试拆分成几个更小、更专注的测试E2E测试的定位记住E2E测试是用于验证关键用户流程和跨模块集成的。不要用它来测试细枝末节的UI状态或复杂的业务逻辑这些应该交给单元测试和集成测试。保持E2E测试的高层次和场景化本身就是一种性能优化。在我自己的项目中通过系统性地应用这7个策略我们将一个超过350个测试用例、CI运行时间长达45分钟的Cypress测试套件优化到了12分钟左右结合了6-way并行。最大的收益并非来自某个“银弹”而是架构优化策略一、并行化策略五和CI缓存策略七的组合拳。优化过程是持续的每当测试套件增长20%我们就回头审视一下耗时曲线和最慢的测试确保性能不会退化。希望这些具体的策略和背后的思考能帮助你打造一个既健壮又迅捷的前端测试防线。

相关新闻

高效网盘直链解析工具:一站式解决八大平台下载难题

高效网盘直链解析工具:一站式解决八大平台下载难题

高效网盘直链解析工具:一站式解决八大平台下载难题 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘…

2026/7/2 23:58:40阅读更多 →
Selenium核心函数实战指南:从定位到等待的自动化测试精要

Selenium核心函数实战指南:从定位到等待的自动化测试精要

1. 项目概述:为什么Selenium函数是测试面试的“硬通货” 最近帮几个准备跳槽的测试朋友做模拟面试,发现一个挺有意思的现象:无论简历上写了多少高大上的测试框架、持续集成经验,面试官总喜欢冷不丁地抛出一个具体问题——“你用Se…

2026/7/2 23:58:40阅读更多 →
React 快速入门 —— 小白也能懂的通俗版

React 快速入门 —— 小白也能懂的通俗版

🧩 先搞懂:React 是什么? React 是 Meta(原 Facebook)开源的 前端 UI 框架,让你能用 “组件” 的方式构建用户界面。你可以把它理解为乐高积木——每个积木就是一个组件,拼在一起就是你的网页。…

2026/7/2 23:58:40阅读更多 →
三步快速导出:GetQzonehistory帮你永久保存QQ空间青春记忆终极指南

三步快速导出:GetQzonehistory帮你永久保存QQ空间青春记忆终极指南

三步快速导出:GetQzonehistory帮你永久保存QQ空间青春记忆终极指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾经想要找回多年前在QQ空间发布的那些珍贵说说&am…

2026/7/3 1:13:46阅读更多 →
暑假通勤便携风扇哪款顺手?自营服务一起看

暑假通勤便携风扇哪款顺手?自营服务一起看

暑假通勤、出行用的便携风扇,优先选带冰敷或喷雾制冷、可折叠多形态、低档续航12小时以上的艾美特FREE3和H2O-F2A,在京东自营下单可享国补叠平台券、次日达、免费上门退换及闪电退款服务。选购时核心看两个要点:一是优先选带制冷功能的款式&a…

2026/7/3 1:13:46阅读更多 →
error 事件的注册

error 事件的注册

多次注册 error 事件,不会重复执行多个回调: var fn window.onerror function() {console.log(arguments); }; window.addEventListener("error", fn); window.addEventListener("error", fn); 触发错误之后,上面代码…

2026/7/3 1:13:46阅读更多 →
收集日志的方法

收集日志的方法

主动判断 我们在一些运算之后&#xff0c;得到一个期望的结果&#xff0c;然而结果不是我们想要的 // test.js function calc(){// code...return val; } if(calc() ! "someVal"){Reporter.send({position: "test.js::<Function>calc"msg: "c…

2026/7/3 1:13:46阅读更多 →
模型动态量化实践:让大模型瘦身加速的实战指南

模型动态量化实践:让大模型瘦身加速的实战指南

一、引言&#xff1a;当BERT变得"臃肿"&#xff0c;我们该怎么办&#xff1f; 自从2018年Google提出BERT以来&#xff0c;基于Transformer架构的预训练模型彻底改变了自然语言处理&#xff08;NLP&#xff09;的格局。然而&#xff0c;“成也萧何&#xff0c;败也萧…

2026/7/3 1:13:46阅读更多 →
MySQL零基础入门(二)

MySQL零基础入门(二)

CentOS 7 下安装 MySQL 8.0 详细教程 MySQL版本&#xff1a;8.0.x 操作系统&#xff1a;CentOS 7&#xff08;演示环境为 CentOS Linux release 7.9.2009&#xff09; 安装方式&#xff1a;MySQL Yum 仓库 前置要求&#xff1a;安装之前先确保没有 MySQL 服务正在运行&#xff…

2026/7/3 1:08:46阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月&#xff0c;Boris Cherny 公开宣布自己卸载了 IDE。一时间&#xff0c;Vibe Coding 成了全行业最热的话题。6个月后&#xff0c;当我们回过头来拉一份真实账本&#xff0c;发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/7/2 12:10:34阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言&#xff1a;审计结束三个月了&#xff0c;审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间&#xff0c;内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中&#xff0c;审计…

2026/7/2 12:10:34阅读更多 →
LV3296与PIC18F45K22的UART通信与USB扩展方案

LV3296与PIC18F45K22的UART通信与USB扩展方案

1. LV3296与PIC18F45K22的硬件搭档解析在嵌入式数据采集系统中&#xff0c;LV3296条形码扫描模块与PIC18F45K22微控制器的组合堪称经典搭配。LV3296作为一款工业级条码扫描头&#xff0c;其核心是一颗高性能CMOS图像传感器&#xff0c;配合专用解码芯片&#xff0c;能自动识别包…

2026/7/3 0:03:41阅读更多 →
AI初创生存指南:6个月完成可信度验证闭环

AI初创生存指南:6个月完成可信度验证闭环

1. 这不是“逆袭指南”&#xff0c;而是一份AI初创公司真实生存手记“How To Beat Odds As an AI Startup?”——这个标题乍看像一句热血口号&#xff0c;但在我带过7个从0到1的AI产品团队、亲手踩过融资失败、技术债崩盘、客户POC卡在最后一公里等23类典型坑之后&#xff0c;…

2026/7/3 0:03:41阅读更多 →
多模态+推理链+RAG 2.0+智能体:工业级AI系统落地四支柱

多模态+推理链+RAG 2.0+智能体:工业级AI系统落地四支柱

1. 这不是又一篇“AI趋势速览”&#xff0c;而是一份实操者手记&#xff1a;当多模态、推理链、检索增强与智能体协作真正撞进工程现场“LAI #73”这个编号本身就像一个暗号——它不属于某家大厂的白皮书&#xff0c;也不是学术会议的议程表&#xff0c;而是长期泡在模型训练集…

2026/7/3 0:03:41阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时&#xff0c;发现推理速度只有可怜的 1-2 FPS&#xff0c;而别人的演示视频却能跑到 30 FPS 以上&#xff0c;那么问题很可能不在模型本身&#xff0c;而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后&#xff0c;会直接使用官方示例…

2026/7/3 1:12:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一&#xff1a;为什么你需要了解 Coze 和 Dify&#xff1f;如果你对 AI 应用开发感兴趣&#xff0c;但一看到“大模型”、“智能体”、“工作流”这些词就头疼&#xff0c;觉得门槛太高&#xff0c;那这篇文章就是为你准备的。很多开发者&#xff0c;包括我自己&#…

2026/7/2 1:32:11阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会&#xff1a;配图一直是个让人头疼的问题。2026年&#xff0c;AI生图工具已经非常成熟了&#xff0c;但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1&#xff1a;速度之王2026年6月11日&#xff0c…

2026/7/2 1:50:13阅读更多 →