96SEO 2026-04-21 19:26 1
在把多个业务模块统一放进同一个仓库后沟通成为了Zui关键的一环。若处理不当,代码会被循环引用、接口频繁变动,甚至导致构建速度直线下降。下面我把自己在大型交易系统里踩过的坑和的经验,用一种略带情绪化的口吻呈现给你。

把所有包想象成一座金字塔:底层是基础设施,上层是具体业务。遵循以下两条铁律:
上层Ke以向下依赖。业务代码Ke以直接引用 shared 中的常量或工具函数。
下层绝不向上依赖。shared 永远不应该 import trade 或 account 的实现。
用一段伪代码快速展示:
// packages/trade/package.json
{
"dependencies": {
"@repo/shared": "workspace:*",
"@repo/data-center": "workspace:*"
}
}
// packages/shared/package.json ❌ 错误示例
{
"dependencies": {
"@repo/trade": "workspace:*"
}
}
为什么要这么划分?
① 防止循环依赖导致编译报错;② 基础库改动后只需要一次发布,所有业务包立刻受益;③ 构建缓存命中率大幅提升,CI 时间从十几分钟降到几分钟。
二、常用通信模式大盘点 1. 事件总线适用于“某件事发生后需要多个模块感知”的场景,如订单提交成功后刷新持仓列表。
// packages/shared/events/index.ts
import mitt from 'mitt';
export const enum EEvent {
ORDER_SUCCESS = 'orderSuccess',
USER_LOGIN = 'userLogin',
}
export type TPayload = {
?: { orderId: string; type: string };
?: { userId: string };
};
export const bus = mitt;
发送方
// packages/trade/order/submit.ts
import { bus, EEvent } from '@repo/shared/events';
export function notifyOrder {
bus.emit;
}
监听方
// packages/portfolios/components/list.ts
import { onMounted, onUnmounted } from 'vue';
import { bus, EEvent } from '@repo/shared/events';
function refresh {/* … */}
onMounted => bus.on);
onUnmounted => bus.off);
2. 公共服务
当多个业务需要访问同一套数据或统一的业务逻辑时把它抽象成单例服务放在 shared 或 data‑center 包里。
// packages/shared/services/data-center.ts
import { Singleton } from '@repo/shared/utils/singleton';
export class DataCenter extends Singleton {
static tag = 'DataCenter';
async getStockInfo {
// 调用后端接口…
}
async getQuotes {
// ...
}
}
export { DataCenter };
业务方只需要拿到实例即可:
// packages/trade/utils/stock.ts
import { DataCenter } from '@repo/shared/services/data-center';
export async function fetchStock {
const dc = DataCenter.getInstance;
return await dc.getStockInfo;
}
3. 公共 API
每个子包dou提供一个根入口 index.ts,只导出「对外」的内容。内部实现永远藏在子目录里不让别的包直接触碰。
// packages/trade/index.ts
export * from './data/constant'; // 常量
export { canFillSearch } from './utils'; // 工具函数
export type { IOrderForm } from './types'; // 类型
export { default as OrderPanel } from './order/index.vue'; // UI
这样其他包只Neng这样使用:
import { canFillSearch } from '@repo/trade';
# ❌ 错误写法:import { canFillSearch } from '@repo/trade/utils';
三、Zui佳实践清单
把所有共享类型和常量放进 @repo/shared.
业务专属的工具函数或枚举留在对应业务包内部。
不要在业务包里直接 import 某个子目录路径,而是通过根入口导出。
若出现循环依赖,立刻抽取公共部分到 shared,再让两个原始包各自引用它。
事件监听要记得在组件销毁时解除订阅,防止内存泄漏。
Lerna/Yarn Workspace 的 version lock 应统一管理,避免出现 “package A@1.0.0” 与 “package B@1.1.0” 同时存在的尴尬局面。
CI 中加入 lint 检查:禁止 import '@/store/*' 等跨层级路径。
Eslint + eslint-plugin-import 的 settings 配置Ke以帮助捕获非法依赖方向。
四、一步步改造案例:从“乱糟糟”到“井然有序” 把订单状态枚举搬到 shared// 原始位置:packages/trade/data/constant.ts
// 改为:
export enum EOrderVerify {
NOT_LOGIN = 'not_login',
// ...
}
# 移动后在 trade 包中仅通过 @repo/shared/constants 引入。
将验证函数提取为共享工具
// packages/shared/utils/verify.ts
import type { IUserStore } from '@repo/shared/interfaces';
export async function preVerify: Promise {
if {
user.goLogin;
return false;
}
return true;
}
geng新业务调用
// packages/trade/utils/order.ts
import { preVerify } from '@repo/shared/utils/verify';
import { useUserStore } from '@/stores/user';
const userStore = useUserStore;
await preVerify;
清理旧引用
删除 package.json 中对其他业务包的 workspace 引用;
`npm run lint` 报错即代表还有残留路径,需要全部迁移至公共 API。
完成以上步骤后你会发现构建时间缩短了约30%,IDE 自动补全也geng友好——这才是 Monorepo 真正Neng带来的价值! 🎉
五、让沟通geng顺畅,让项目geng轻盈 🚀Monorepo 本身并不是魔法,它只是提供了一个“大屋子”。Ru果我们不提前规划好各房间之间的走廊,就会出现乱七八糟的门锁和堵塞的走道。本文给出的依赖层次原则、事件总线与共享服务两大核心模型,以及“一条入口、统一导出”的公共 API 策略,dou是帮助团队保持代码清洁、提升协作效率的不二法门。
记住:**先定义好谁Neng靠谁,再挑选Zui合适的通信方式**——如此,你才Neng真正体会到 Monorepo 带来的开发快感,而不是被循环依赖绊倒在路口。祝你的项目沟通顺畅,迭代如虎! 🐅
©2026 SEO 专家 出品 | 本文基于真实项目经验撰写,仅供参考。 .作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback