我正在构建一个多页 javascript 应用程序。我已经阅读了很多设计模式,并使用松散耦合(发布/订阅事件)的核心/外观/模块方法创建应用程序。
我有一个非常好的系统,可以在部署时将我的所有模块文件和相关依赖项缩小并合并到一个外部 javascript 文件中。为我的应用程序最小化额外的 HTTP 请求是一个设计目标——因此我对 AMD(异步模块定义)不太感兴趣。
我正在使用 Nicholas Zakas 的演示文稿 Scalable JavaScript Application Architecture中界定的指南
http://www.youtube.com/watch?v=vXjVFPosQHw
&&
Addy Osmani 的大型 JavaScript 应用程序架构模式 http://addyosmani.com/largescalejavascript/
&&
这个高级教程,来自 Nettuts 的 Andrew Burgess,编写模块化 JavaScript http://marketplace.tutsplus.com/item/writing-modular-javascript/128103/?ref=addyosmani&ref=addyosmani&clickthrough_id=90060087&redirect_back=true
我的问题是关于如何管理此应用程序的不同页面及其相关模块的建议。我还使用 Backbonejs 的路由器类 w/ballupton 的History.js库来操作 HTML5 历史/状态 API 并在不刷新的情况下动态加载页面,同时保持对不支持 HTML 状态 API 的旧浏览器的向后兼容性。我的所有页面都共享一个通用代码库(单个缩小和压缩的 js 文件)。
这是我正在考虑在我的应用程序中使用的结构的概述:
它本质上是一种混合方法。上半部分由 Core/Facade/Module 模式和离散的模块组成,这些模块不直接相互交互并通过外观发布/订阅通知。
下半部分由我提出的应用程序结构组成,当状态/url改变时通知“主控制器”,主控制器执行任何全局操作(例如,如果尚未初始化,则初始化我的 UI 的标题和侧边栏菜单)并指示相关子控件运行它的 init() 方法(以及调用 destroy(); 在先前加载的任何控制器上)。每个子控制器(与 ex:主页、日历页面、预订页面等相关)从可用模块池中挑选模块并初始化它们。
这是一个好方法还是我走错了路?我可以看到模块仍然相互独立,这有利于可扩展性。
我还考虑过将路由器和控制器视为离散模块并让它们发布/订阅核心,并且每个控制器以某种方式初始化其页面所需的必要模块。