现代应用程序在模块化架构上蓬勃发展,无缝适应不断变化的业务需求。然而,要实现真正的模块化,您需要的不仅仅是独立的组件 - 您需要一种高效方式将它们组合在一起。这意味着控制模块如何加载、以什么顺序加载以及使用哪些依赖项。当您想要关闭系统的某些部分代码中没有任何痕迹(例如 if/else 语句),并且不影响其他组件的稳定性时,事情会变得更加棘手。
最简单的示例:想象您的应用程序具有许多互连的功能。有时,您需要禁用其中之一。问题是:某些功能可能直接依赖于它,而其他功能可能会间接(传递性)受到影响。如果您忽略这些依赖项,您的应用程序可能会崩溃。如果您需要禁用多个功能,则组合可能会变得复杂且容易出错。理想的是有一种方法可以显式地描述功能依赖性并安全地禁用它们而不会遗漏任何内容。
比如这样
const user = createContainer({ id: 'user', start: async () => { const data = await fetchUser(); return { api: { data } }; }, }); const accounts = createContainer({ id: 'accounts', dependsOn: [user], start: async ({ user }) => { const data = await fetchAccounts({ id: user.data.id }); return { api: { data } }; }, enable: ({ user }) => user.data.id !== null, }); const wallets = createContainer({ id: 'wallets', dependsOn: [accounts], start: () => ({ api: null }), });
...并期待这样的事情:
compose.up start user: 'idle', accounts: 'idle', wallets: 'idle' user: 'pending', accounts: 'idle', wallets: 'idle' user: 'done', accounts: 'idle', wallets: 'idle' # if user.data.id user: 'done', accounts: 'pending', wallets: 'idle' user: 'done', accounts: 'done', wallets: 'pending' user: 'done', accounts: 'done', wallets: 'done' # else user: 'done', accounts: 'off', wallets: 'off' compose.up done
我创建了 @grlt-hub/app-compose 库,这使得这成为现实。
该库提供了用于创建模块并将其组合到单个系统中的便捷功能。每个模块都封装在一个容器中,配置清晰,包括id、dependsOn、OptionalDependsOn、start、enable等参数。开发人员使用 compose.up fn 描述容器并启动它们,而无需担心执行顺序。这种方法使容器的使用变得直观且接近自然语言。
准备好简化您的模块化架构了吗?深入研究应用程序组合并体验高效、可扩展的依赖关系管理。检查一下并让我们知道它如何改变您的项目!
以上是如何轻松创建可扩展的、基于模块的应用程序。的详细内容。更多信息请关注PHP中文网其他相关文章!