<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Monorepo | 锤子前端</title><description>Now vibe coding, so learning hammer FE ?</description><link>https://channel.meo-ai.com</link><item><title>《W键在前端：技术与产品的协同进化》</title><link>https://channel.meo-ai.com/posts/673</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/673</guid><pubDate>Fri, 10 Jul 2026 02:21:02 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《W键在前端：技术与产品的协同进化》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;a href=&quot;/search/result?q=%23%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B%E5%8C%96&quot; title=&quot;#前端工程化&quot;&gt;#前端工程化&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Electron&quot; title=&quot;#Electron&quot;&gt;#Electron&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Vite&quot; title=&quot;#Vite&quot;&gt;#Vite&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E4%BB%A3%E7%A0%81%E9%87%8D%E6%9E%84&quot; title=&quot;#代码重构&quot;&gt;#代码重构&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Monorepo&quot; title=&quot;#Monorepo&quot;&gt;#Monorepo&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23TailwindCSS&quot; title=&quot;#TailwindCSS&quot;&gt;#TailwindCSS&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23ShadcnUI&quot; title=&quot;#ShadcnUI&quot;&gt;#ShadcnUI&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23ReactRouter&quot; title=&quot;#ReactRouter&quot;&gt;#ReactRouter&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96&quot; title=&quot;#性能优化&quot;&gt;#性能优化&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Medal&quot; title=&quot;#Medal&quot;&gt;#Medal&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;1. **从&quot;巨兽组件&quot;说起**：作者用一张拥有30+ props的TextInput截图开场，生动展示了&quot;反模式&quot;组件的恐怖——职责混乱、默认值泛滥、DOM和自定义props杂糅，改一行代码要检查十个角落，开发体验堪比噩梦&lt;br /&gt;2. **宏观手术刀**：不硬啃旧组件，而是先换&quot;土壤&quot;——迁移Monorepo+PNPM解决版本混乱，引入Vite+HMR让Electron本地开发告别&quot;停启地狱&quot;，CEO亲自下场当普罗米修斯点火&lt;br /&gt;3. **Marie Kondo式删代码**：统一导入路径（包名+清晰路径+文件后缀），减少barrel文件，让AI能精准识别&quot;死代码&quot;。结果疯狂删代码：单PR删除上万行，团队享受&quot;五杀&quot;快感，还提炼出跨平台通用包（utils/hooks/types）&lt;br /&gt;4. **生产环境统一Vite**：干掉Rollup，用Glob Imports做代码分割，配合路由级动态加载，i18n文件懒加载，最终渲染包从巨大体积瘦身到2.7MB，构建速度快到QA都惊呼&quot;嗖嗖嗖&quot;&lt;br /&gt;5. **组件层&quot;换血&quot;**：用Tailwind+Shadcn/Radix UI（后迁Base UI）替代Grommet和Styled Components，给旧组件挂ESLint&quot;红牌&quot;禁止令，同时写迁移指南。React Router v5→v7的大升级也顺势完成，现在搭个新页面只需一天&lt;br /&gt;&lt;br /&gt;URL：&lt;a href=&quot;https://medal.tv/blog/posts/w-key-in-frontend-synergizing-technology-and-product&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://medal.tv/blog/posts/w-key-in-frontend-synergizing-technology-and-product&quot;&gt;https://medal.tv/blog/posts/w-key-in-frontend-synergizing-technology-and-product&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://medal.tv/blog/posts/w-key-in-frontend-synergizing-technology-and-product&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Front End Engineer Rick Zhang shares how Medal&apos;s frontend team broke the deadlock between legacy code and new features by rebuilding their developer experience from the ground up. Through a monorepo migration, a full move to Vite and Rolldown, aggressive…&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;medal.tv&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;W-Key in Frontend: Synergizing Technology and Product | Medal&quot; src=&quot;/static/https://cdn4.telesco.pe/file/Ja8jh4CR_X5n1ZweFyHbHOk07dDOJlt1YEjJr4IwK-miJoQ7-XP0mn5MVL75muvn92MqXGqIxlsw4__v1RrBmkGaW8nTgADE7YHhACPnMF_so3dlhW2tahrRFuskkx13d_iaE5pDMKgqjqKN6wHyIOmJgbF8a2t-8iPwY393mvUegrIa2IfULNQdyMvXR04Om6MLAElsPSfQME303_B9Q8EsXJx6w40grYF_2XwFkrr94ZK6LZq52EfP3D-BbQ0vl2stbCn-tTACUzoGdP1-C8bU6xtWAb0lLCnGGbaDxIRCCM6sC73HUl48vh4DLQSLPBDMSOSHZpEjqDhNmr3-TQ.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;W-Key in Frontend: Synergizing Technology and Product | Medal&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Front End Engineer Rick Zhang shares how Medal&apos;s frontend team broke the deadlock between legacy code and new features by rebuilding their developer experience from the ground up. Through a &lt;mark class=&quot;highlight&quot;&gt;monorepo&lt;/mark&gt; migration, a full move to Vite and Rolldown, aggressive…&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《Portless：告别端口号的本地开发代理工具》</title><link>https://channel.meo-ai.com/posts/620</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/620</guid><pubDate>Sat, 02 May 2026 07:08:24 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《Portless：告别端口号的本地开发代理工具》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;a href=&quot;/search/result?q=%23%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7&quot; title=&quot;#开发工具&quot;&gt;#开发工具&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%9C%AC%E5%9C%B0%E5%BC%80%E5%8F%91&quot; title=&quot;#本地开发&quot;&gt;#本地开发&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23DevServer&quot; title=&quot;#DevServer&quot;&gt;#DevServer&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23HTTPS&quot; title=&quot;#HTTPS&quot;&gt;#HTTPS&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Monorepo&quot; title=&quot;#Monorepo&quot;&gt;#Monorepo&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Turborepo&quot; title=&quot;#Turborepo&quot;&gt;#Turborepo&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Vercel&quot; title=&quot;#Vercel&quot;&gt;#Vercel&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;Portless 是 Vercel Labs 推出的本地开发代理工具，用 &lt;code&gt;https://myapp.localhost&lt;/code&gt; 这类稳定命名 URL 彻底取代难记的端口号。它默认开启 HTTPS + HTTP/2，自动分配端口并适配 Next.js、Vite、Astro 等主流框架，支持 &lt;mark class=&quot;highlight&quot;&gt;Monorepo&lt;/mark&gt; 多包路由、Git Worktree 自动子域名、LAN 内网共享及 Tailscale 团队协作，让本地开发环境对人类和 AI 代理都更加友好。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;- 一键替换端口号：把 &lt;code&gt;localhost:3000&lt;/code&gt; 变成 &lt;code&gt;https://myapp.localhost&lt;/code&gt;，告别记端口的烦恼，对人类可读、对 AI 代理也更友好&lt;br /&gt;- 开箱即用的 HTTPS/HTTP/2：首次运行自动生成本地 CA 并加入系统信任，浏览器零警告；HTTP/2 多路复用解决 Vite 等开发服务器大量并发请求的性能瓶颈&lt;br /&gt;- 框架零配置适配：自动识别 Next.js、Express、Nuxt、Vite、Astro、Expo 等框架，通过 &lt;code&gt;PORT&lt;/code&gt; 环境变量或自动注入 &lt;code&gt;--port&lt;/code&gt;/&lt;code&gt;--host&lt;/code&gt; 参数，无需手动改配置&lt;br /&gt;- &lt;mark class=&quot;highlight&quot;&gt;Monorepo&lt;/mark&gt; 与 Turborepo 原生支持：通过 &lt;code&gt;portless.json&lt;/code&gt; 或 &lt;code&gt;package.json&lt;/code&gt; 的 &lt;code&gt;portless&lt;/code&gt; 字段统一管理多包路由，如 &lt;code&gt;api.myapp.localhost&lt;/code&gt; 和 &lt;code&gt;web.myapp.localhost&lt;/code&gt;，与 Turborepo 无缝集成&lt;br /&gt;- Git Worktree 智能隔离：自动检测 Git Worktree，用分支名作为子域名前缀，避免多个工作区端口冲突，无需额外配置&lt;br /&gt;- 多场景网络共享：LAN 模式通过 mDNS 让手机等设备访问 &lt;code&gt;.local&lt;/code&gt; 域名；Tailscale 集成支持团队内网共享，甚至通过 Funnel 一键暴露到公网&lt;br /&gt;- 灵活的子域名与自定义域名：支持 &lt;code&gt;api.myapp.localhost&lt;/code&gt; 等子域名组织服务，也可切换 &lt;code&gt;.test&lt;/code&gt; 等自定义 TLD，自动同步 &lt;code&gt;/etc/hosts&lt;/code&gt; 保证 Safari 兼容&lt;br /&gt;&lt;br /&gt;文章URL：&lt;a href=&quot;https://github.com/vercel-labs/portless&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://github.com/vercel-labs/portless&quot;&gt;https://github.com/vercel-labs/portless&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://github.com/vercel-labs/portless&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Replace port numbers with stable, named local URLs. For humans and agents. - vercel-labs/portless&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;GitHub&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;GitHub - vercel-labs/portless: Replace port numbers with stable, named local URLs. For humans and agents.&quot; src=&quot;/static/https://cdn4.telesco.pe/file/hYuG4oO20wH0fbYMLcLLQV0UxSkt9VsbYsexs2i88PEgHWeFHXcm-0Ll-QS54Z8UlFrsCJKMQfq5vkyfO0j5IcBr75_Jd5P8FXjbqrWKjWsDexG7lIiOpBukjWsEJhOAOSEhUrlganM_7iqkFGsPc86iZ7dG1znEyDrk9wbeISvwK7vO9YVbKALSQGi1UWbhf0qG7eEvIP4661MNLC1IrtAmdoHTx6sILu5D3KJc_w1oIH98yJras3BlpECnp2ZrENAlQ7PRrI4l0hVHNMszBVbbBe9ZpSXsGKPnVSSw9ePUa2EtXZ8487QIwByjNTFcaL2o0nDle_lXMEnnKtHMig.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;GitHub - vercel-labs/portless: Replace port numbers with stable, named local URLs. For humans and agents.&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Replace port numbers with stable, named local URLs. For humans and agents. - vercel-labs/portless&lt;/div&gt;
&lt;/a&gt;</content:encoded></item><item><title>《垂直代码库：告别按类型分层，拥抱按业务域组织》</title><link>https://channel.meo-ai.com/posts/599</link><guid isPermaLink="true">https://channel.meo-ai.com/posts/599</guid><pubDate>Sat, 18 Apr 2026 08:12:54 GMT</pubDate><content:encoded>&lt;span class=&quot;post-title-source&quot;&gt;《垂直代码库：告别按类型分层，拥抱按业务域组织》&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;标签：&lt;a href=&quot;/search/result?q=%23%E5%89%8D%E7%AB%AF&quot; title=&quot;#前端&quot;&gt;#前端&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E4%BB%A3%E7%A0%81%E7%BB%84%E7%BB%87&quot; title=&quot;#代码组织&quot;&gt;#代码组织&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1&quot; title=&quot;#架构设计&quot;&gt;#架构设计&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23Monorepo&quot; title=&quot;#Monorepo&quot;&gt;#Monorepo&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23React&quot; title=&quot;#React&quot;&gt;#React&lt;/a&gt; &lt;a href=&quot;/search/result?q=%23%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B&quot; title=&quot;#软件工程&quot;&gt;#软件工程&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;总结：&lt;br /&gt;&lt;br /&gt;本文主张前端代码库应从&quot;水平分层&quot;（按 components/hooks/utils 技术类型划分）转向&quot;垂直切片&quot;（按业务域/功能域组织）。作者以 Sentry 代码库十年演进为例，指出水平分层会导致代码分散、认知负荷高、耦合混乱；而垂直组织将同一业务域的组件、工具、类型内聚到一起，配合 &lt;mark class=&quot;highlight&quot;&gt;Monorepo&lt;/mark&gt; 的显式边界（exports/eslint-plugin-boundaries），能显著提升可维护性。虽然确定正确的垂直划分需要更多团队沟通，但这是支撑代码库长期演进的必要投资。&lt;br /&gt;&lt;br /&gt;文章要点：&lt;br /&gt;&lt;br /&gt;- 水平分层的隐患：把代码按 components / hooks / utils / types 分类虽然上手简单，但随着项目膨胀，同一业务逻辑会被拆得七零八落——比如 PageFilters 的组件、类型、工具函数散落在三个目录，改一个小需求要跳来跳去， cognitive load 直接拉满&lt;br /&gt;- 垂直切片的核心思想：不按&quot;技术类型&quot;而按&quot;业务域&quot;分组，把同一个功能域（如 dashboard、profiling、billing）相关的组件、Hook、工具、类型全部收进一个目录；就像当年我们把 HTML/CSS/JS 从三层文件合并成组件一样，这次是更高维度的&quot;关注点内聚&quot;&lt;br /&gt;- 与团队结构天然对齐：现代产品团队通常是端到端的功能团队（dashboard 团队、replay 团队），垂直代码结构让 CODEOWNERS 和包边界直接对应团队职责，谁负责什么一目了然&lt;br /&gt;- 解决跨域复用焦虑：不是所有代码都严格属于某个页面，像 PageFilters 这种被多页面使用的通用能力，完全可以作为独立垂直域存在；关键是按&quot;逻辑关联&quot;而非&quot;物理位置&quot;来划分&lt;br /&gt;- 用边界守护架构：垂直化后还需降低耦合，推荐通过 &lt;mark class=&quot;highlight&quot;&gt;Monorepo&lt;/mark&gt; + package.json#exports 显式暴露公共 API，或借助 eslint-plugin-boundaries 禁止深路径导入，把&quot;私有实现&quot;真正保护起来&lt;br /&gt;- 没有银弹，但值得投入：确定合理的垂直域确实比&quot;丢进 utils&quot;更难，也可能出现不同团队重复造轮子；但作者认为这恰恰促进了团队沟通，而沟通本就是软件工程最难也最重要的部分&lt;br /&gt;&lt;br /&gt;文章URL：&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://tkdodo.eu/blog/the-vertical-codebase&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;https://tkdodo.eu/blog/the-vertical-codebase&quot;&gt;https://tkdodo.eu/blog/the-vertical-codebase&lt;/a&gt;&lt;a class=&quot;tgme_widget_message_link_preview&quot; href=&quot;https://tkdodo.eu/blog/the-vertical-codebase&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;Let&apos;s take a look at why the common, horizontal code structure is not ideal, where it breaks down, and what we can do about it.&quot;&gt;
  
  &lt;div class=&quot;link_preview_site_name accent_color&quot;&gt;tkdodo.eu&lt;/div&gt;
  &lt;img class=&quot;link_preview_image&quot; alt=&quot;The Vertical Codebase&quot; src=&quot;/static/https://cdn4.telesco.pe/file/UQNHQ5CBOo9YPc282-wjXkZj4PZ5DB5zFN6AcdBCGzJE5sJnuaw-V2V6sKibIvd5vfa9ekRtzuXoI6OnOZ_k1DF5YFoVfMgJHKVvA63WGg59BKOYzxTqmJaAxqyMw3QUQzlh3zNnw-BVDfmzabcFfGTp6KoV8nnXsMcAzd22mQ1iQg3o9vmfA9Scfo5p3viArCt5tGzxf-n2LhFYLOFxTKAPQtqhrcCjrFgB_maNEZlyJsUk_23V0odEQqqA-gZltg6z0v0kM7ke4letXnHXh4H8E2GYkTFJeFigVwwOpDsOhjT3Uq5wsaF5jXy-cAm6b1bXPEjfKWYiK3s8IC41Yg.jpg&quot; width=&quot;1200&quot; height=&quot;630&quot; loading=&quot;eager&quot; /&gt;
  &lt;div class=&quot;link_preview_title&quot;&gt;The Vertical Codebase&lt;/div&gt;
  &lt;div class=&quot;link_preview_description&quot;&gt;Let&apos;s take a look at why the common, horizontal code structure is not ideal, where it breaks down, and what we can do about it.&lt;/div&gt;
&lt;/a&gt;</content:encoded></item></channel></rss>