Scalable JavaScript Application Architecture

今天无意中看到 Yahoo! 资深前端工程师 Zakas 的一个 slide :

看完之后觉得很震撼,思路开阔了许多,发现原来前端的代码可以这样架构,写得如此优雅。这个 slide 是值得你反复看的(Jay.li 同学说结合 YUI 3 的代码看效果更佳,等有空我也来学习一下 YUI 3 的源码),这里总结一下其中的精华部分:

1. An application framework is like a playground for your code,provides structure around otherwise unrelated activities; A JavaScript library is like a toolbox,you can build any number of things using the tools.

框架(framework)和库(library)是不一样的,我们用到的JQuery, dojo, YUI 等都只是库,而不是框架,你可以随意选用这些好用的工具,但是应用程序的框架还是要靠你自己来搭建,因为每个程序都有它各自的特点。

2. Module Theory:Everything is a module

一切皆模块。在一个 web application 中模块是什么意思呢?模块就是在整个架构中的一组独立功能的集合。任何一个模块都应该是独立的,不依赖于其它模块。松耦合可以让我们在不影响其它模块的情况下修改一个模块。

3. Each module has its own sandbox(An interface with which the module can interact to ensure loose coupling)

每个模块都有自己的 sandbox ,这个 sandbox 就是用来降低模块间耦合度的,它是与模块进行交互的接口。

4. 一个 web application 的架构应该包括四个部分:Modules, Sandbox, Application Core, Base Library.

scale-js-app.png

Module 只能“接触”它自身以及它所在 sandbox 的内容。那么这四个部分中哪一个是贯穿整个架构并知道将要构建的 application 呢? None of them. 是的,所有的模块对于全局都是“无知”的。整个架构中的这四个部分就好像拼图游戏中的那些小方块,每一个都不清楚最后要拼的图是什么,它们只需要做好自己的事情就行了。

5. The web application is created as a result of all parts doing their job.

模块的工作是什么呢? 举例来说, YAHOO! 首页的新闻模块就是向用户展示新闻,热门搜索模块就是为了告诉用户最热门的关键词。模块的工作就是创建一个有意义的用户体验。 当所有的模块都做好了它们的事情的时候,整个 application 也就建好了。

6. Module Rules.

一个模块需要严格遵守下面的规则:

Hands to yourself
– Only call your own methods or those on the sandbox (只调用自己或者自己的sandbox 中的方法)
– Don’t access DOM elements outside of your box (不要访问 sandbox 之外的DOM元素)
– Don’t access non-native global objects (不要访问非原生的全局对象)
Ask, don’t take
– Anything else you need, ask the sandbox(所有需要的东西都只能从 sandbox 中获取)
Don’t leave your toys around
– Don’t create global objects (不要创建全局对象)
Don’t talk to strangers
– Don’t directly reference other modules (不要直接引用其它的模块)

7. Sandbox Jobs

Sandbox 应该有下面的作用:

Consistency
– Interface must be dependable (接口应该是可以信赖的)
Security
– Determine which parts of the framework a module can access (决定一个模块可以访问框架的哪些部分)
Communication
– Translate module requests into core actions (将模块的请求转化成 application core 的动作)

8. Application Core Jobs

Application Core 需要做下面的工作:

Manage module lifecycle
– Tell modules when to start and stop doing their job (控制模块的初始化和销毁)
Enable inter-module communication
– Allow loose coupling between modules that are related to one another (允许模块间进行松耦合的交互)
General error handling
– Detect, trap, and report errors in the system (进行错误处理)
Be extensible
– The first three jobs are not enough! (可扩展性)

为什么需要扩展呢?因为创建好的 web application 总是在不停变化,而且你无法预测会出现什么变化,所以需要有良好的可扩展性。AJAX 功能可以算作一个扩展,它会为模块隐藏所有请求的细节,而模块只需要根据扩展提供的接口发送请求并获取自己想要的数据。

9. Base Library

基础库应该可以提供最基本的功能:

Browser normalization
– Abstract away differences in browsers with common interface(为所有浏览器提供统一接口)
General-purpose utilities
– Parsers/serializers for XML, JSON, etc. (基本的XML, JSON 处理功能)
– Object manipulation (对象操作)
– DOM manipulation (DOM 操作)
– Ajax communication (AJAX 异步通信)
Provide low-level extensibility (底层可扩展)

大部分的web application 都和基础库耦合得太紧,这句话我要加粗显示,想一想我们见到的应用吧,几乎所有的都是特别依赖于某个库,比如 JQuery , 所有的东西都紧紧耦合在 JQuery 之上。而理想化的情况是:只有 Application Core 这一部分才知道底层用的是什么库,而 Module 和 Sandbox 根本不需要去关心。

10. 总结

一个理想的 web application 架构应该是这样的:

只有 base library 知道使用的是哪一个浏览器
只有 Application core 知道正在使用哪一个 base library
只有 sandbox 知道 Application core 是什么样子
Module 只了解 sandbox 和它自身
这四个模块都不需要知道web application 的全貌

一句话,所有的部分都只对它上层的那部分可见,而且都不需要关心整个架构的全貌。 再来看图吧:

scale-js-app1.png

最后说一句,资深就是资深,高屋建瓴是需要很强功力的。继续努力吧。


本文链接:http://www.zhuoqun.net/html/y2009/1412.html 转载请注明出处。TrackBack:http://www.zhuoqun.net/html/y2009/1412.html/trackback

相关日志


Posted in Web Develop, 技术.

8条评论

  • At 2009.11.24 10:07, jayli said:

    你为人类的发展和进步做了一件好事

    • [...] 从这里看到了一个slide, Scalable JavaScript Application Architecture 觉得很不错,分享一下,国外技术人员做的slide确实很cool Scalable JavaScript Application Architecture View more documents from Nicholas Zakas. [...]

      • At 2009.11.26 23:57, 沐璘 said:

        发现你这也是PJBLOG转WP的,我和你一样~

        • At 2009.12.09 22:15, Supersha said:

          赞一个!! 从思维里改变了对开发库的一般性思维。

          • At 2009.12.25 10:43, China travels said:

            这些都是国外顶尖的技术牛人弄的

            • At 2009.12.31 10:09, Ray said:

              很不错的文章,的确现在的应用和基础库的耦合性太紧,当然,这种情况是多方面原因造成的。
              我们坚持这种观念,但实际开发过程中的并不允许我们有足够的时间和要求去设计架构。
              国内的大部分公司在工期要求紧张,产品规划不明确,模块划分混乱的情况下,是无法做到架构的设计的。
              国外的公司还好一点,他们愿意花费更多的时间在价格设计上。

              • At 2010.01.10 16:59, Jinjiang said:

                认真学习了,最近正在研习前端类库、框架的东西,有一种豁然开朗的感觉

                • [...] 本文引用自:http://www.zhuoqun.net/html/y2009/1412.html [...]

                  (Required)
                  (Required, will not be published)