Now vibe coding, so learning hammer FE ?
《Playwright Fixtures 的"魔法"实现原理》
标签:#测试 #Playwright #JavaScript #API设计 #源码分析
总结:
作者深入剖析 Playwright 的 Fixtures API 如何通过
文章要点:
1. 懒加载是核心卖点**:Playwright 的 fixtures 按需初始化,不用就不创建,能节省测试执行时间;但传统 Proxy/getter 方案会导致异步 fixture 需要 `await`,破坏 API 体验
2. "偷看"函数参数是关键**:Playwright 在不调用测试函数的情况下,就能知道它需要哪些 fixture,这解决了"鸡生蛋"难题——要知道用哪些 fixture 才能准备它们,但准备前又不能运行测试
3. **`Function.prototype.toString()
4. **解析逻辑相当 robust**:源码展示了
5. **压缩工具不会破坏它**:实测 Terser 和 esbuild 的 minify 只会把参数名缩短(如
6. **魔法有代价**:函数组合(如 `noThrow(fn)
7. **作者态度很诚实**:认可 Playwright 团队的选择非常适合测试框架场景,但坦言这种魔法比个人期望的多了一点,想不出其他库有同样充分的理由采用此方案
URL:
https://ivakin.dev/blog/how-playwright-fixtures-work
标签:#测试 #Playwright #JavaScript #API设计 #源码分析
总结:
作者深入剖析 Playwright 的 Fixtures API 如何通过
Function.prototype.toString() 在测试运行前"偷看"函数参数,实现按需懒加载。文章揭示了这一巧妙但略带"魔法"的设计:Playwright 强制要求测试函数使用对象解构语法(如 `async ({ page }) =>`),然后通过正则解析源码字符串提取 fixture 名称,从而只初始化测试真正需要的依赖。作者还验证了该方案对不同函数类型、压缩工具(Terser/esbuild)的兼容性,并坦诚讨论了其"神奇感"与潜在局限性。文章要点:
1. 懒加载是核心卖点**:Playwright 的 fixtures 按需初始化,不用就不创建,能节省测试执行时间;但传统 Proxy/getter 方案会导致异步 fixture 需要 `await`,破坏 API 体验
2. "偷看"函数参数是关键**:Playwright 在不调用测试函数的情况下,就能知道它需要哪些 fixture,这解决了"鸡生蛋"难题——要知道用哪些 fixture 才能准备它们,但准备前又不能运行测试
3. **`Function.prototype.toString()
是秘密武器**:Playwright 把测试函数转成字符串,用正则提取解构参数,因此强制要求 `async ({ page }) => 这种写法,否则直接抛错"First argument must use the object destructuring pattern"4. **解析逻辑相当 robust**:源码展示了
innerFixtureParameterNames 的实现,能正确处理普通函数、async 函数、生成器函数、箭头函数等多种声明方式,还能处理带默认值的复杂解构5. **压缩工具不会破坏它**:实测 Terser 和 esbuild 的 minify 只会把参数名缩短(如
foo → `o`),不会改解构语法,所以 Playwright 的正则解析依然能工作6. **魔法有代价**:函数组合(如 `noThrow(fn)
包装后传入)会失效,因为 `toString() 拿到的是包装函数的源码而非原始函数;这种"黑魔法"虽然 DX 很好,但违反了"最小惊讶原则"7. **作者态度很诚实**:认可 Playwright 团队的选择非常适合测试框架场景,但坦言这种魔法比个人期望的多了一点,想不出其他库有同样充分的理由采用此方案
URL:
https://ivakin.dev/blog/how-playwright-fixtures-work
《为AI智能体设计产品:从界面思维到智能体思维》
标签:#AI产品 #MCP #智能体交互设计 #产品架构 #API设计 #Salesforce #Ramp #Notion
总结:
本文由Ramp产品负责人Teddy Riker撰写,探讨了AI智能体时代产品设计的范式转变。作者指出,未来80%的软件交互将通过AI智能体完成,产品团队需要从"为用户设计界面"转向"为智能体设计能力"。文章以Ramp、Salesforce、Notion等案例,提出了三大核心设计原则:主动提供成功所需的上下文规范、建立基于工具调用的反馈循环、识别并填补智能体间的上下文缺口。
文章要点:
- **交互范式正在翻转**:传统模式是"用户→界面→数据库",而AI时代正在变成"用户→用户智能体→软件智能体→数据库"。界面不会消失,但80%的交互将发生在智能体之间,产品团队需要为"看不见的用户"重新设计。
- **Salesforce的激进转型**:这家27年的传统软件巨头推出"Headless 360"计划,将平台所有能力暴露为API、MCP工具或CLI命令,承认图形界面CRM的护城河正在被侵蚀,主动拥抱"无界面"未来。
- **教会智能体如何成功**:Notion的MCP设计是个正面教材——它在工具描述中明确要求智能体先读取Markdown规范再操作,确保格式准确。相比之下,Slack MCP让智能体"自己摸索"格式规则,结果用户反而要花更多时间修正。产品团队应该主动告诉调用方"你需要知道什么才能成功"。
- **用反馈循环驱动产品迭代**:Ramp通过三个机制解决智能体交互的可观测性难题:要求每次工具调用附带`rationale`参数解释意图、提供独立的反馈提交工具、在特定工具中预埋上下文种子。这些反馈比人类用户更具体、更一致,能直接转化为新功能需求。
- **填补上下文缺口是核心设计挑战**:在"用户智能体↔️软件智能体"的协作中,双方各自掌握对方没有的信息。优秀的设计不是让智能体去猜技术细节(如GL code),而是让它们交换语义上下文(如"这是客户晚餐还是团队建设"),由各自擅长的那一方完成最终决策。
- **敷衍智能体支持的产品会被淘汰**:仅仅发布一个MCP服务器、勾上"支持AI"的 checkbox 是不够的。客户最终会流向那些认真打磨智能体体验、真正理解"最后签支票的可能是AI"的产品。
文章URL:https://baoyu.io/blog/2026-04-24/teddy-riker-2047312986696454584
标签:#AI产品 #MCP #智能体交互设计 #产品架构 #API设计 #Salesforce #Ramp #Notion
总结:
本文由Ramp产品负责人Teddy Riker撰写,探讨了AI智能体时代产品设计的范式转变。作者指出,未来80%的软件交互将通过AI智能体完成,产品团队需要从"为用户设计界面"转向"为智能体设计能力"。文章以Ramp、Salesforce、Notion等案例,提出了三大核心设计原则:主动提供成功所需的上下文规范、建立基于工具调用的反馈循环、识别并填补智能体间的上下文缺口。
文章要点:
- **交互范式正在翻转**:传统模式是"用户→界面→数据库",而AI时代正在变成"用户→用户智能体→软件智能体→数据库"。界面不会消失,但80%的交互将发生在智能体之间,产品团队需要为"看不见的用户"重新设计。
- **Salesforce的激进转型**:这家27年的传统软件巨头推出"Headless 360"计划,将平台所有能力暴露为API、MCP工具或CLI命令,承认图形界面CRM的护城河正在被侵蚀,主动拥抱"无界面"未来。
- **教会智能体如何成功**:Notion的MCP设计是个正面教材——它在工具描述中明确要求智能体先读取Markdown规范再操作,确保格式准确。相比之下,Slack MCP让智能体"自己摸索"格式规则,结果用户反而要花更多时间修正。产品团队应该主动告诉调用方"你需要知道什么才能成功"。
- **用反馈循环驱动产品迭代**:Ramp通过三个机制解决智能体交互的可观测性难题:要求每次工具调用附带`rationale`参数解释意图、提供独立的反馈提交工具、在特定工具中预埋上下文种子。这些反馈比人类用户更具体、更一致,能直接转化为新功能需求。
- **填补上下文缺口是核心设计挑战**:在"用户智能体↔️软件智能体"的协作中,双方各自掌握对方没有的信息。优秀的设计不是让智能体去猜技术细节(如GL code),而是让它们交换语义上下文(如"这是客户晚餐还是团队建设"),由各自擅长的那一方完成最终决策。
- **敷衍智能体支持的产品会被淘汰**:仅仅发布一个MCP服务器、勾上"支持AI"的 checkbox 是不够的。客户最终会流向那些认真打磨智能体体验、真正理解"最后签支票的可能是AI"的产品。
文章URL:https://baoyu.io/blog/2026-04-24/teddy-riker-2047312986696454584