96SEO 2026-07-23 23:47 1
前两篇讲完了架构和机制。这一篇换个角度——不谈概念,只看代码。用一个模拟 Soul 业务场景的社交应用完整实现。验证框架在真实项目中的表现,最终分享一些工程实践中的感悟。

EchoApp 是 Neo 仓库中的示例项目,模拟一款社交应用的主要功能:聊天、广场动态、匹配、使用者资料等。不是 demo 级别的 HelloWorld。而是有意按照中型项目的体量来组织代码:
| 维度 | 数量 |
|---|---|
| Service 总数 | 27 |
| infra 层 | 8 |
| business 层 | 12 |
| feature 层 | 5 |
| lazy 层 | 2 |
| 页面 | 10 |
| 组件 | 40+ |
选择这个体量是有原因的——太少了看不出分层的价值,太多了读起来成本太高。个 Service 恰好在"能看清楚全貌"和"有足够的复杂度"之间。
AppModule 是整个应用的起点,所有 个 Service 在这里统一声明:
export const appModule = new NeoModule — infra services ===== { tag: 'AppInitService',phase: GLOBAL_PHASE,factory: => new AppInitService },{ tag: 'SecurityService',phase: GLOBAL_PHASE,factory: => new SecurityService,dependencies: },{ tag: 'DatabaseService',phase: GLOBAL_PHASE,factory: => new DatabaseService,dependencies: },{ tag: 'NetworkService',phase: GLOBAL_PHASE,factory: => new NetworkService,dependencies: },{ tag: 'CacheService',phase: GLOBAL_PHASE,factory: => new CacheService },{ tag: 'StorageService',phase: GLOBAL_PHASE。factory: => new StorageService,dependencies: },// ... // ===== BUSINESS_PHASE — business services ===== { tag: 'AuthService',phase: BUSINESS_PHASE,factory: => new AuthService,dependencies: },{ tag: 'UserService',phase: BUSINESS_PHASE,factory: => new UserService,dependencies: },{ tag: 'IMService',phase: BUSINESS_PHASE,factory: => new IMService,dependencies: },{ tag: 'MomentService',phase: BUSINESS_PHASE,factory: => new MomentService,dependencies: },{ tag: 'MatchService',phase: BUSINESS_PHASE,factory: => new MatchService,dependencies: )
. 分层的判断标准
哪些 Service 放 infra、哪些放 business,不是拍脑袋决定的。再看判断标准,
** . 依赖的方向 **
依赖关系一定是单向的: infra ← business ← feature ← lazy。不会出现 IM ervice 依赖 earch ervice 的情况。这不是框架强制的,而是分层的自然结果——你不会在业务层引用一个功能层的服务。因为业务层在它之前就加载了。说起来,
. Phase 的调整是启动调整的主要手段
假设启动速度不达标,调整思路不是去改 Service 内部代码,而是调整 Phase 从归属来看。
ervice 从 BUSINES
降到 FEATURE?匹配结果不在首屏展示,可以先显示骨架屏
降到 FEATURE?表情面板不是默认展开的
阶段就少一个串行等待的 Service。使用者更快看到首页
这种调整不需要改任何业务代码,只改 AppModule 中的 phase 字段。
以聊天功能为例,走一遍从使用者操作到 UI 刷新的全链路。
// ChatPage.ets@Entry@Componentstruct ChatPage {
@State messages:
ChatMessage =
@State inputText:
string = ''
private imSvc?:
IM
ervice
private unbind:
=> void) | undefined
private conversationId:
string = ''
aboutToAppear {
const params =
router.getParams as ChatPageParams
this.conversationId =
params.conversationId
this.imSvc =
serviceManager.get('IM
ervice')!this.unbind =
StateBinder.bind(
this.imSvc.getMessagesObservable。this as Object,'messages'
)
this.loadMessages
}
aboutToDisappear {
this.unbind?.
}
async loadMessages {
if {
this.messages =
await this.imSvc.getMessages
await this.imSvc.markAsRead
}
}
// 使用者点击发送
async onSend {
if ) {
await this.imSvc.sendMessage(this.conversationId。this.inputText.trim)
this.inputText = ''
}
}
build {
Column {
List {
ForEach(this.messages,(msg:
ChatMessage) => {
ListItem {
//
渲染消息气泡
}
})
}
// 输入框 + 发送按钮
}
}}
页面做的事情很薄: 绑定 Observable、调用 Service 方法、渲染 UI。没有网络请求、没有状态管理、没有回调地狱。
// IM
ervice.ets export class IM
ervice extends
ervice {
private conversationsObs =
new Observable
private messagesObs =
new Observable
getMessagesObservable {
return this.messagesObs }
async sendMessage(conversationId:
string,content:
string):
Promise{
// .
业务逻辑的观点是。创建消息
const msg =
this.createMessage(conversationId,content)
// . 网络:
发送到服务器
await this.networkSvc.send('/im/send',msg)
// . 更新 Observable → 自动通知所有绑定的页面
const msgs =
this.messagesObs.getValue
this.messagesObs.setValue()
// . 发送事件 → 其他 Service 可以响应
eventBus.emit('im:messageSent',{ conversationId,message:
msg } as Object)
return msg
}}
业务层做的事情: 页面在用自己,也不知道 UI 长什么样。
// Network
ervice.ets export class Network
ervice extends
ervice {
async send(path:
string,data:
Object):
Promise
基础设施层做的事情: 纯技术实现。不知道业务概念,不知道 UI,甚至不知道自己在被谁调用。样的,其实,
使用者点击发送→ imSvc.sendMessage // 页面调 Service→ 创建消息对象 // 业务逻辑→ networkSvc.send('/im/send',msg) // 调基础设施→ messagesObs.setValue() // 更新 Observable→ StateBinder 自动写入 @State messages // 根据数据调整 UI→ ArkUI重新渲染消息列表 // 使用者看到新消息→ eventBus.emit //通知其他 Service
页面不需要手动 this.messages =newMessages 。不需要 $setState,不需要 notifyDataSetChanged.只要 Service 调用了 setValue,UI就会自动刷新.
/feature/Report
ervic.ets
exportclass Reportervicextends Servic{async report)as NetworkServicawait network.send('/report'。{targetIreason}as Objectretrue}
. 注册到 AppModul—
{tag:'ReportServicphaseFEATURE_PHASfactory=>new ReportServicdependencies:},/cod>
. 页面使用—在需要举报的页面中:
三个文件,零耦合。不需要修改 NetworkServic、不需要修改任何基类、不需要在某个全局注册表里手动添加。
定义 -> 注册 -> 使用。流程是固定的.
AI 时代,工程节奏变快.
软件是有固有生命周期的,公司和团队也有生命周期。
这不是悲观。而是因为时间有限,才更需要一个好的结构约束。
让代码在你还在的时候能跑,在你走了之后别人也能接。老实说,
Neo 不追求成为最好的框架。只追求成为 一个不太烂的共同约束。
作为专业的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