惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
Webroot Blog
Webroot Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
T
Threat Research - Cisco Blogs
V2EX - 技术
V2EX - 技术
L
LINUX DO - 热门话题
Google DeepMind News
Google DeepMind News
Recorded Future
Recorded Future
S
Schneier on Security
I
InfoQ
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
The GitHub Blog
The GitHub Blog
S
Security @ Cisco Blogs
O
OpenAI News
W
WeLiveSecurity
Vercel News
Vercel News
阮一峰的网络日志
阮一峰的网络日志
Simon Willison's Weblog
Simon Willison's Weblog
人人都是产品经理
人人都是产品经理
Cloudbric
Cloudbric
The Last Watchdog
The Last Watchdog
The Hacker News
The Hacker News
Google Online Security Blog
Google Online Security Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
GbyAI
GbyAI
NISL@THU
NISL@THU
T
Tailwind CSS Blog
V
Visual Studio Blog
PCI Perspectives
PCI Perspectives
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
D
DataBreaches.Net
B
Blog RSS Feed
N
News and Events Feed by Topic
N
News and Events Feed by Topic
H
Heimdal Security Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
腾讯CDC
Latest news
Latest news
V
Vulnerabilities – Threatpost
Hacker News: Ask HN
Hacker News: Ask HN
WordPress大学
WordPress大学
V
V2EX
aimingoo的专栏
aimingoo的专栏
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
D
Darknet – Hacking Tools, Hacker News & Cyber Security
The Register - Security
The Register - Security
Help Net Security
Help Net Security

祝融说。

抱朴守缺。 肩吾 huan(幻) PinConsole Terminal Hole 共识并不平均,但是基本上均衡。 权力是共识切片的曲率。 存在不是「是什么」,而是一系列极小的,从分歧到共识再到分歧的,连续的构建过程。 分歧实际上是对共识往哪个方向延伸的拉力。 分歧是尚未落实的实在,是可能性基底中尚未被锁定的在共识中相互牵引的可用余量。 权力从来不是中立的,它是带有倾向性的「牵扯力」。 过程即完备,容错即自由。 第10章 逆向投喂:用真实数据让AI做出精准诊断 第11章 测试电网:用刚性指标代替肉眼审查 第12章 定期“垃圾回收”:别让系统背负AI制造的债务 第13章 防退化契约:确保每一次修改都是在进步 第14章 全生命周期演练:从零开始用“有效约束”交付一个项目 第15章 随身工具包:即查即用的约束指令库 第1章 这不是结对编程,这是“人机共生” 第2章 你必须警惕的三个陷阱 第3章 把话说死:用 Markdown 建立 AI 的“单源真相” 第4章 负空间设计:先规定“不准做什么”,再让它写代码 第6章 上下文断头台:善用 `/clear` 斩断错误蔓延 第7章 剥夺执行权:强制 AI 像资深工程师一样“慢思考” 第8章 角色锁定:用一句话给AI戴上“思考帽” 第9章 遥测驱动:帮AI长出“千里眼”和“顺风耳” 结语:成为系统牧马人,而不是代码搬运工 第八章 金融与科技的“禁手”:现代战争的底层收敛 第二章 认知锚点:心理战中的“强制步” 第九章 历史的单行道:那些被剥夺国运的时刻 第六章 消费主义的迷宫:在货架上剥夺选择 第七章 战略逼压:没有硝烟的“切香肠战术” 第三章 构造绝杀:逻辑闭环的艺术 第十二章 绝对零度下的生机:成为“不可测”的人 第十一章 掀翻棋盘:非对称竞争与正交化打击 第十章 识破隐形控制:第一时间嗅到危险 第四章 标准的暴政:打造“不得不”的生态 第五章 锁死阀门:关系链与供应链的囚笼 第一章 降熵法则:时空维度的隐蔽控制 结语:愿你在这个被设定的世界里,永远握有掀桌的权力。 引言:自由意志的幻觉 项羽 当前的AI工程化本质上是受限于上下文长度而采用的「以提示词约束去置换确定性」的一种妥协。 即时反应是一种不假思索,它是观念通过最简单、轻易、高效的路径寻求表达。 青衫 第九章:估值的坐标:建立“内在记分牌” 第六章:资产重估的艺术:从“硬实在”到“认知折价” 第七章:预期差交易:坍缩“概率波” 第十一章:内在博弈:克服‘评估异化’ 第十章:交易的算法:逆人性的“人之道” 第五章:空间套利:高能耗产业的跨境建构 结语:构建你的“财富多重宇宙” Code-Coder 第八章:效率革命:细分赛道的“降本增效” 第二章:评估权的博弈:商业模式的权力差序 第三章:去伪存真:穿透“符号泡沫” 第四章:能源共识:黑金的物理法则 第一章:宏观观察者:借势“国家共识” 前言:从“市场囚徒”到“清醒的观察者” Code-Ledge-X Code-Lint-X
第5章 模块化解耦:让AI每次只面对一个小问题
祝融 · 2026-05-16 · via 祝融说。

在前两章,我们学会了用“文档”为AI设定全局法律,用“负空间设计”雕刻具体任务的边界。我们已经拥有了强大的“软约束”能力。然而,当项目规模膨胀,代码库变成一个拥有数百个文件、数万行代码的庞然大物时,你会发现,即使有再完美的文档,AI在面对这个“巨兽”时,依然会开始表现出“困惑”、“健忘”甚至“精神错乱”的迹象。

它可能会在一个看似简单的修改中,引用一个八竿子打不着的模块;或者在重构一个函数时,忘记了它在五个文件之外的某个隐秘角落里被调用过。问题的根源,不在于我们的指令不够清晰,而在于我们向AI的大脑里,一次性塞入了远超其“认知带宽”的信息。

本章,我们将学习如何运用软件工程中最经典、最强大的思想——模块化与解耦——来解决这个问题。但这并非老调重弹,我们将从一个全新的视角,即“AI友好型架构”的视角,来重新审视和应用这些原则。

我们的目标是:通过精心的物理代码结构设计,将一个庞大的、令人生畏的代码库,拆解成一系列AI可以轻松理解和处理的、独立的“小问题”。我们不仅要解耦“代码”,更要解耦“AI的注意力”。

5.1 为什么 AI 在庞大代码库里会“发疯”?

要理解如何治愈AI的“疯病”,我们必须先诊断它的病因。AI在面对庞大代码库时表现出的种种“智障”行为,并非因为它真的“笨”,而是源于其底层工作原理与人类心智模型的根本性差异。

病因一:上下文的“扁平化诅咒”

人类工程师在阅读一个庞大项目时,大脑里会自动构建一个层次化的、带权重的心智模型。

  • 我们会迅速识别出哪些是“核心模块”(如领域模型、主服务),哪些是“边缘模块”(如工具函数、UI组件)。
  • 我们会知道,修改核心模块需要万分小心,而修改一个边缘的UI组件则相对安全。
  • 我们会下意识地忽略掉那些与当前任务无关的95%的代码,将注意力高度集中在相关的5%上。

而AI没有这种能力。对它来说,你提供给它的所有代码上下文,都是一个扁平化的、无差别的Token序列。config.js里的一个配置项,和UserService.js里的核心业务逻辑,在它的“眼中”,重要性是相同的。它缺乏对代码“宏观结构”和“语义重要性”的理解。

这种“扁平化诅咒”导致:

  • 注意力分散:当上下文信息过多时,AI的注意力会被大量无关紧要的细节稀释。就像让一个人同时听一百个人说话,他最终谁的话也听不清。
  • 错误关联:在扁平的Token海洋里,AI可能会因为某些表面的、词法上的相似性,将两个毫无关系的模块错误地关联起来,从而做出荒谬的修改。

【实战噩梦】 你让AI修改一个CSS样式文件中的颜色变量。因为上下文中包含了整个项目的文件,AI在分析时,注意到了后端数据库配置文件db.config.js中,也有一个名为'primary-color'的字符串(可能是某个注释或测试数据)。结果,它不仅修改了CSS文件,还“贴心”地帮你把数据库配置文件里的字符串也改了,导致整个后端服务无法连接数据库。这就是典型的“错误关联”。

病因二:隐性依赖的“认知黑洞”

一个设计不良的大型项目,往往充满了各种“隐性依赖”。

  • 一个模块通过全局变量,修改了另一个模块的状态。
  • 一个函数依赖于某个环境变量在特定时刻必须是某个值。
  • 两个模块通过一个共享的、未经显式声明的事件总线进行通信。

人类开发者或许能通过“项目经验”和“口耳相授”记住这些“雷区”。但AI对此一无所知。这些隐性依赖,对于AI来说,就是“认知黑洞”。它在代码的字面上,完全看不到这两个模块之间有任何联系。

当AI修改了其中一个模块时,它无法预测这个改动会像一颗投入水中的石子,通过看不见的涟漪,影响到远方的另一个模块,最终导致系统在某个意想不到的地方崩溃。

【实战噩梦】 你的前端项目里,有一个authStore.js负责用户认证,它会在用户登录后,往window对象上挂载一个全局的currentUser对象。项目里有十几个组件,都隐式地依赖于window.currentUser的存在。现在,你让AI重构authStore.js,使用更现代的Context API。AI出色地完成了任务,但它不知道window.currentUser这个“黑魔法”的存在,自然也就删除了这行代码。结果,项目里那十几个组件,在用户登录后,全部因为读取不到currentUser而崩溃。

病因三:Token限制的“物理天花板”

这是最直接、最物理的限制。所有大模型都有一个上下文窗口的Token上限。即使是像Claude 3这样拥有200K甚至1M超长上下文的模型,这个上限依然存在。

当你的项目代码总量超过这个上限时,你就不可能一次性把所有信息都喂给AI。你将不得不手动挑选“相关”的文件。但这个“挑选”的过程,本身就是一个巨大的心智负担,而且极易出错。你很可能会遗漏某个关键的依赖文件,从而误导AI做出错误的决策。

更重要的是,即便没有达到Token上限,上下文越长,AI的“推理成本”和“出错概率”也会呈指数级上升。在一个塞满了20万Token的超长对话里,AI的“注意力”会严重衰退,它很可能会忘记你在对话开始时定下的某个重要约束。这被称为“大海捞针”问题。

结论: 对抗AI“发疯”的根本方法,不是去训练一个更聪明的AI,也不是寄希望于无限长的上下文窗口。而是从我们的代码架构本身入手,将那个巨大的、扁平的、充满隐性依赖的“认知泥潭”,改造成一个由许多小型的、独立的、接口清晰的“认知积木”所组成的有序世界。

这就是模块化解耦在AI时代的全新使命。

5.2 拆分主流程与辅助能力

在进行模块化解耦时,最常见的错误是按照“技术类型”或“功能页面”进行划分。比如,把所有的API请求放一个文件夹,所有的UI组件放另一个文件夹。这种划分方式有一定作用,但它并没有触及问题的核心。

一种更深刻、更符合AI心智模型的解耦模式,我称之为“能力驱动解耦”,或者叫“主流程-能力”模式。

这种模式的核心思想是:将一个复杂的业务功能,拆分为一个极其简洁、稳定的“主流程”,以及一系列可插拔的、独立的“辅助能力”。

  • 主流程:它只负责一件事——用最高阶的、最接近业务语言的方式,编排各个辅助能力,来完成一个完整的业务闭环。主流程本身不包含任何具体的实现细节。它应该是极度稳定、极少变更的。
  • 辅助能力:每一个“能力”都是一个独立的模块,它封装了一项具体的技术实现,比如“向API发送请求”、“在本地存储数据”、“解析一个PDF文件”、“显示一个通知弹窗”等。这些能力模块是可替换、可独立测试、可独立让AI进行修改的。

【一个生动的比喻】

想象一下你在指挥一场电影拍摄。

  • 主流程(导演的工作):你的剧本上写着:“第一场:主角出场,表情凝重。第二场:发生爆炸。第三场:主角在废墟中发现线索。” 这个剧本就是你的主流程,它只关心“什么”发生,不关心“如何”发生。
  • 辅助能力(各个专业团队):
  • 演员团队(能力A):负责实现“主角出场,表情凝重”。
  • 特效团队(能力B):负责实现“发生爆炸”。
  • 道具团队(能力C):负责实现“废墟中的线索”。

作为导演,你只需要调用这三个团队即可。如果觉得爆炸效果不好,你不需要修改剧本,你只需要把特效团队叫过来,对他们说:“重做这个爆炸,我想要更震撼的效果。” 特效团队的工作,完全不会影响到演员或道具团队。

AI编程也应如此。我们作为“导演”(决策者),应该让AI分别去和各个“专业团队”(能力模块)打交道,而不是让它面对一整个乱糟糟的片场。

实战演练:重构一个“用户注册”功能

重构前:一个臃肿的“巨无霸”函数(AI的噩梦)

// A monolithic, AI-unfriendly function
async function handleUserRegistration(formData) {
  // 1. Validation
  if (!formData.email || !formData.password) {
    // Directly manipulating UI state
    showError("Email and password are required.");
    return;
  }
  if (formData.password !== formData.confirmPassword) {
    showError("Passwords do not match.");
    return;
  }

  // 2. API Call (tightly coupled)
  try {
    const response = await fetch('/api/register', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ email: formData.email, password: formData.password })
    });

    if (!response.ok) {
      const errorData = await response.json();
      showError(errorData.message);
      return;
    }

    const userData = await response.json();

    // 3. Local Storage (tightly coupled)
    localStorage.setItem('authToken', userData.token);
    localStorage.setItem('user', JSON.stringify(userData.user));

    // 4. Analytics (tightly coupled)
    analytics.track('User Registered', { userId: userData.user.id });

    // 5. Navigation (tightly coupled)
    router.push('/dashboard');

  } catch (error) {
    showError("An unexpected error occurred.");
    // 6. Logging (tightly coupled)
    logErrorToServer(error);
  }
}

这个函数就是典型的“认知泥潭”。它把校验、API、本地存储、分析、导航、日志等至少6个不同的“能力”,紧紧地耦合在了一起。如果你让AI修改其中任何一部分(比如“把localStorage换成sessionStorage”),AI的“扁平化”视野,需要同时理解所有这6个部分,极易出错。

重构后:“主流程-能力”模式(AI的天堂)

第一步:抽离“能力”模块

我们创建一系列独立的、职责单一的能力模块。

// capabilities/validator.js
export function validateRegistrationForm(formData) {
  if (!formData.email || !formData.gpassword) return { isValid: false, message: "..." };
  // ...
  return { isValid: true };
}

// capabilities/authApi.js
export async function registerUser(email, password) {
  const response = await fetch('/api/register', { ... });
  // ...
  return await response.json();
}

// capabilities/session.js
export function saveSession(token, user) {
  localStorage.setItem('authToken', token);
  localStorage.setItem('user', JSON.stringify(user));
}

// capabilities/analytics.js
export function trackRegistration(userId) {
  analytics.track('User Registered', { userId });
}

// capabilities/navigation.js
export function redirectToDashboard() {
  router.push('/dashboard');
}

// ...等等

注意,每一个能力模块都是纯粹的、独立的、易于测试的。让AI修改session.js,你只需要把这一个文件和它的测试文件给AI,完全不需要提供任何其他业务逻辑的上下文。

第二步:重写“主流程”

现在,我们用“导演”的视角,重写handleUserRegistration函数。

// main-flows/userRegistration.js
import { validateRegistrationForm } from '../capabilities/validator';
import { registerUser } from '../capabilities/authApi';
import { saveSession } from '../capabilities/session';
import { trackRegistration } from '../capabilities/analytics';
import { redirectToDashboard } from '../capabilities/navigation';
import { notifyError } from '../capabilities/notifier';
import { logError } from '../capabilities/logger';

// A clean, AI-friendly main flow
export async function handleUserRegistration(formData) {
  const validation = validateRegistrationForm(formData);
  if (!validation.isValid) {
    return notifyError(validation.message);
  }

  try {
    const { token, user } = await registerUser(formData.email, formData.password);
    
    saveSession(token, user);
    trackRegistration(user.id);
    
    redirectToDashboard();

  } catch (error) {
    notifyError("Registration failed. Please try again.");
    logError(error);
  }
}

看到这个“主流程”的美妙之处了吗?

  • 极度简洁:它没有任何实现细节,只有对能力的调用。代码行数大大减少。
  • 业务语言:它读起来就像一段业务需求文档,而不是技术代码。AI和人类都能轻松理解其意图。
  • 高度稳定:只要“用户注册”这个业务流程不变,这个文件就永远不需要修改。如果我们要改API的地址,我们去改authApi.js;如果我们要改路由跳转的目的地,我们去改navigation.js。主流程文件本身,是对修改封闭的。

AI如何在这种架构下工作?

现在,当你想让AI修改功能时,你的指令会变得无比精确和安全。

  • 旧指令(危险):“在用户注册功能里,把localStorage换成sessionStorage。”(AI需要在那个200行的巨无霸函数里,小心翼翼地找到那两行代码,同时祈祷不要影响到其他逻辑。)
  • 新指令(安全):“这是capabilities/session.js文件。请把其中的localStorage全部替换为sessionStorage。”(AI面对的是一个只有几行代码的小文件,任务清晰,不可能犯错。)

通过“主流程-能力”模式的拆分,我们为AI创造了一个“最小认知单元”。我们每次只让它处理一个“能力”模块,这使得我们可以将提供给它的上下文代码量,降到最低,从而从根本上规避了AI在庞大代码库里“发疯”的所有病因。

5.3 高内聚低耦合的 AI 友好型项目结构

“主流程-能力”模式是一种逻辑上的解耦思想。为了让它在物理上真正落地,我们需要设计一个与之匹配的、AI友好的项目目录结构。

一个“AI友好”的目录结构,其核心目标是:让“关注点”在物理上高度集中,让“依赖关系”在物理上清晰可见。 换句话说,就是经典的设计原则:高内聚,低耦合。

AI友好型目录结构的三个原则

原则一:按“业务领域”而非“技术类型”组织

传统的项目结构喜欢这样组织:

/
├── components/   (所有UI组件)
├── services/     (所有API服务)
├── stores/       (所有状态管理)
└── utils/        (所有工具函数)

这种结构的最大问题是“低内聚”。当你需要开发一个“用户管理”功能时,你需要在componentsservicesstores这三个文件夹之间反复横跳。如果要让AI帮你开发,你就必须把这三个文件夹里的相关文件,一股脑地全扔给它,造成巨大的上下文负担。

AI友好的结构,应该按“业务领域”或“功能特性”来组织:

/
├── features/
│   ├── UserManagement/
│   │   ├── components/       # 只属于用户管理的UI组件
│   │   ├── hooks/          # 只属于用户管理的业务逻辑
│   │   ├── userApi.js      # 只属于用户管理的API客户端
│   │   ├── userStore.js    # 只属于用户管理的状态
│   │   └── index.js        # 导出该功能的公共接口
│   ├── OrderManagement/
│   │   ├── ...
│   └── ...
└── shared/
    ├── components/       # 可被所有feature共享的通用组件 (Button, Input...)
    ├── hooks/            # 可被所有feature共享的通用hooks (useAuth, useApi...)
    └── ...

在这种结构下,当你让AI开发“用户管理”功能时,它的“认知边界”被物理地限制在了features/UserManagement/这个文件夹内。你只需要把这个文件夹的上下文给它,它就能获得完成任务所需的全部信息,而不会被OrderManagement里的任何代码所干扰。这就是高内聚。

同时,UserManagementOrderManagement之间没有任何直接的依赖关系。它们之间的通信,只能通过shared里共享的模块进行。这就是低耦合。

原则二:显式声明“公共接口”

每个业务领域模块(如UserManagement),都应该有一个index.js文件,作为其唯一的“出口”。这个文件显式地导出了该模块希望被外部(其他模块或应用主入口)使用的部分。

// features/UserManagement/index.js

// 只导出高阶组件和hooks,不暴露内部实现细节
export { UserListPage } from './pages/UserListPage';
export { useUserStore } from './userStore';

模块内部的其他文件,如components/UserTable.js,则不应该被外部直接引用。

这种做法的好处是:

  • 稳定接口:它为模块定义了一个清晰、稳定的“公共契约”。只要index.js里的导出不变,模块内部的实现就可以自由地进行重构,而不用担心破坏外部依赖。
  • 降低AI的认知负担:当AI需要使用UserManagement的功能时,你不需要给它看这个模块的全部源代码。你只需要告诉它:“你可以从features/UserManagement导入UserListPageuseUserStore。” 这就好像是给了AI一份简单易懂的“API文档”,而不是一本厚厚的“源码全集”。

原则三:根除“魔术依赖”和“副作用”

AI最害怕的就是那些看不见的、隐式的依赖。一个AI友好的项目,必须致力于将所有依赖都显性化。

  • 禁止全局变量:任何模块间的共享状态,都必须通过显式的状态管理器(如Redux, Zustand)或者Context API来传递。
  • 依赖注入:一个模块如果依赖另一个模块,应该通过构造函数或函数参数,将依赖“注入”进去,而不是在模块内部直接import。这使得依赖关系一目了然,并且极易于在测试中进行模拟。
  • 纯函数优先:尽可能地编写“纯函数”——即没有副作用、对于相同的输入永远返回相同输出的函数。纯函数是AI最容易理解和推理的代码单元,因为它们是完全独立的、自包含的。

一个AI友好的项目结构,不仅仅是为了让人类看得更清晰,它更是一种主动的、为AI的“认知缺陷”量身定制的“脚手架”。 它通过物理隔离,强制性地降低了AI在任意时刻所需要处理的信息复杂度,从而将AI的强大算力,引导到我们需要的、安全的、创造价值的地方。

【重构步骤】30分钟将现有项目改造为AI友好结构

理论听起来很棒,但面对一个已经存在的、混乱的项目,从何下手呢?别怕,重构并不需要推倒重来。遵循以下步骤,你可以在半小时内,显著提升你现有项目的“AI友好度”。

前提: 你的项目已经使用了某种模块化系统(如ES Modules, CommonJS)。

Phase 1: 识别与分组(10分钟)

这个阶段,我们只做“考古”和“规划”,不动一行代码。

  1. 打印目录树:将你的项目src目录的完整文件结构,打印到一个文本文件中。
  2. 业务领域“着色”:打开这个文本文件,用不同的颜色或标记,开始识别业务领域。
  • 哪些文件是和“用户”相关的?(UserList.jsx, api/user.js, stores/user.js...)用黄色标记。
  • 哪些文件是和“订单”相关的?(OrderTable.jsx, pages/OrderDetail.jsx, services/order.js...)用蓝色标记。
  • 哪些文件是“通用”的,被所有领域都用到了?(components/Button.jsx, utils/formatDate.js...)用绿色标记。
  1. 规划新结构:在文本文件的底部,根据你的“着色”结果,开始规划新的目录结构。
// New Structure Plan
/src
/features
/User/ (all yellow files go here)
/Order/ (all blue files go here)
/shared (all green files go here)
/lib (external library configs, e.g., axios instance)
/pages (if you use a file-based router like Next.js)
/styles (global styles)
App.jsx
main.jsx

Phase 2: 物理迁移(15分钟)

现在,我们开始“搬家”。这个过程很机械,但非常重要。

  1. 创建新目录:根据你刚才规划的结构,在你的项目中创建features/User, features/Order, shared等新文件夹。
  2. 移动文件:根据你的“着色”结果,将旧的文件,批量移动到新的文件夹里。此时不要修改任何代码内容,只移动文件。
  • components/UserList.jsxfeatures/User/components/UserList.jsx
  • services/order.jsfeatures/Order/orderApi.js (可以顺便重命名)
  • components/Button.jsxshared/components/Button.jsx
  1. 修复导入路径:文件移动后,你的项目肯定会因为找不到模块而报错。这是最关键的一步。启动你的应用,打开浏览器的开发者工具,或者运行你的构建命令。它会告诉你哪些文件的导入路径错了。
  • 让AI来帮你! 这是一个AI能完美胜任的、模式化的任务。你可以复制一个文件的全部代码,然后对AI说:“这个文件被从A移动到了B。请检查并修复其所有的import语句的相对路径。” AI会非常高效地完成这个任务。
  • 或者,使用VSCode等IDE的“查找和替换”功能,批量修复导入路径。

Phase 3: 建立“公共接口”(5分钟)

最后一步,为我们新的feature模块,建立清晰的“城墙”。

  1. 创建index.js文件:在每一个features目录(如features/User/)下,创建一个index.js文件。
  2. 导出公共部分:检查这个模块里的文件,思考一下:哪些部分是需要被模块外部(比如App.jsx或其他feature)使用的?通常是页面级组件、状态管理的store或高阶hooks。在index.js里将它们导出。
// features/User/index.js
export { UserPage } from './components/UserPage';
export { useUser } from './hooks/useUser';
  1. 重构外部导入:现在,去那些使用了User模块功能的地方(比如你的主路由文件),将原来深层、混乱的导入,修改为从index.js导入。
  • 旧的(耦合的):
import { UserPage } from './features/User/components/UserPage';
import { useUser } from './features/User/hooks/useUser';
  • 新的(解耦的):
import { UserPage, useUser } from './features/User';

恭喜! 经过这30分钟,你的项目可能在功能上没有任何变化,但在“AI友好度”上,已经发生了质的飞跃。你现在拥有了一个:

  • 物理上隔离的认知单元:可以安全地让AI只关注features/User目录,而不用担心它会搞乱订单逻辑。
  • 清晰的依赖关系:模块间的依赖,现在都通过清晰的index.js接口进行,大大减少了AI产生“认知黑洞”的可能。

这半小时的投入,将在你未来与AI协作的数百个小时里,为你节省下难以估量的时间和心力。你为你的“超级实习生”,创造了一个它能理解、能高效工作的、整洁有序的工位。现在,你们可以一起,真正开始创造价值了。