阅读更多

10顶
2踩

Web前端

转载新闻 可扩展的JavaScript应用体系结构

2009-11-24 14:37 by 资深编辑 wutao0603 评论(2) 有5185人浏览
今天无意中看到 Yahoo! 资深前端工程师 Zakas 的一个 slide :

Scalable JavaScript Application Architecture

看完之后觉得很震撼,思路开阔了许多,发现原来前端的代码可以这样架构,写得如此优雅。这个 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.

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 的全貌

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

原文来自:Dreamer’s Blog-Scalable JavaScript Application
来自: zhuoqun.net
10
2
评论 共 2 条 请登录后发表评论
2 楼 yarmyarch 2009-11-25 14:37
对楼上不敢苟同。

js可在发布阶段被压缩,也可通过动态导入机制分散WebA的加载负担,还可以在发布时通过编译(例如使用google的Closure Compiler)减少代码引用。
因此代码量不是问题,一个真正可信赖的框架才是问题!
1 楼 guazi 2009-11-25 08:18
想法是不错,但是这样会不会加重网络负担?会多出好多js的代码吧。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 一个Grandjs软件包助手,用于在单一应用程序上应用事件驱动程序体系结构-JavaScript开发

    用于在单例应用程序Grafka上应用事件驱动程序体系结构的Grandjs程序包帮助程序用于在单项应用程序上应用事件驱动程序体系结构的...可帮助您使用事件驱动的体系结构在单一应用程序内部编写高度可扩展的Web应用程序,因此

  • poc-generic-form-structure-vue:此poc用于渲染功能,可扩展的体系结构和组件化的知识的应用

    通用形式架构 项目设置 npm install 编译和热重装以进行开发 npm run serve 编译并最小化生产 npm run build 运行测试 npm run test 整理和修复文件 npm run lint 运行单元测试 npm run test:unit ...

  • FeReactArk:具有高度可扩展性的体系结构,具有最好的新前端技术,这些功能全部可配置,功能丰富,并且注重性能和最佳实践

    铁React器快速轻松地启动新的React项目具有高度可扩展性的体系结构,具有最好的新前端技术,这些功能全部可配置,功能丰富,并且注重性能和最佳实践React FE架构包含: 浏览器支持 边缘+ 最新的最新的最新的最新的 :...

  • jessica:Jessica-Jessie(安全分布式Javascript)编译器体系结构

    Jessica-Jessie(安全分布式Javascript)编译器体系结构 注意:尚未准备好生产。 杰西卡(Jessica)现在仍然处于引导状态,但是欢迎您来贡献和讨论! 该目录包含Jessica,这是实现的编译器体系结构。 简而言之,...

  • 软件体系结构风格介绍

    文章目录软件体系结构风格介绍(一)管道和过滤器风格(二)数据抽象与面向对象风格(三)基于事件的隐式调用风格(四)层次系统风格(五)仓库风格(六)C2风格(七)基于层次消息总线的架构风格 软件体系结构风格...

  • vesper:Vesper是一个NodeJS框架,可帮助您创建可扩展,可维护,可扩展,声明性和快速的基于GraphQL的服务器应用程序

    它非常适合您选择的任何体系结构和规模-从整体到微服务,从小型到企业应用程序。 使用Vesper,您的应用程序的核心组件是: 控制器(根查询) Args(例如GraphQL解析器args或用户输入) 楷模 解析器 服务 以....

  • pomelo:用于Node.js的快速,可扩展的分布式游戏服务器框架

    它的分布式体系结构使pomelo的扩展性优于其他实时Web框架。 主页: : 邮件列表: : 文档: : Wiki: : 问题: : 标签:游戏,nodejs 特征 全面支持游戏服务器和实时应用服务器架构 多人游戏:移动,社交,...

  • GIS开发中的JavaScript的应用

    主要介绍JavaScript的基本概念和GIS开发中JavaScript的使用范围

  • Web应用服务网络扩展

    一、概述 对于一个简单的web应用,可能只需要一台性能一般的服务器就可以搞定。但是随着网络应用的推广,越来越...越来越多的用户涌入,数以千计,数万,每小时,分钟,秒…对于你的生意来说,这是好消息,可对你的...

  • Facebook的可扩展性体系结构

    其支持可扩展性的核心结构部件有:Memcache (一个分布式的基于内存的Cache), Thrift (跨语言的Remote Procedure Call (RPC) library)和 Scribe (一个C++ logging library). 它支持1.2亿用户,每月超过500...

  • js-plugin:通用JavaScript插件引擎

    是一个通用且简单的插件引擎,用于为浏览器和nodejs创建可扩展且可维护JavaScript应用程序。 动机 如今,Web应用程序变得越来越复杂。 为了分开关注点,使业务逻辑脱钩,应该精心设计大型应用程序。 最佳实践之一是...

  • 如何一步一步打造高可扩展性的应用程序?

    随着项目的规模越来越大,项目的维护性就可能会变得越来越差,有时可能会出现牵一发而动全身的情况。如果需要修改某个功能的代码,或者添加某项功能,会...一个可扩展的应用程序应该能够以某种方式实现增长,并且添加、

  • Nest:Node.js框架,用于构建高效且可扩展的服务器端应用程序-开源

    Nest是用于构建高效,可靠和可扩展的服务器端应用程序的渐进式Node.js框架。 Nest的目标是提供一种可以立即创建高度可测试,可伸缩且易于维护的应用程序的应用程序体系结构。 使用TypeScript构建并使用现代...

  • 计算机组成原理与体系结构知识概括

    计算机组成原理与体系结构知识概括计算机组成原理与体系结构计算机组成原理计算机体系结构 计算机组成原理与体系结构 关系解释: 计算机系统是由硬件和软件两部分组成,《计算机组成原理》讲述的是计算机的硬件组成...

  • almin:JavaScript的客户端DDDCQRS

    Almin是众所周知的Flux / CQRS的读/写堆栈体系结构的实现。 安装 npm install almin 您还需要针对的Promise polyfill。 npm install es6-promise 文献资料 :memo: 有关详细信息,请参见 。 :open_book: Almin的...

  • HydraJS:使用Hydra.js创建可扩展,可维护且面向模块的系统

    Hydra.js使用一种解耦的体系结构,该体系结构: 允许您更改基本框架,而无需更改模块或窗口小部件代码。 在不知道加载了哪些模块的情况下,允许模块彼此通信。 可以轻松扩展新功能。好处: 没有其他模块的已知模块...

  • Vaadin 的体系结构和功能扩展

    Vaadin 的体系结构介绍 Vaadin 应用程序实质上是运行在 Java Web 服务器上的 Servlet,专门响应 HTTP 请求,它包含一套 web 应用编程 API,一组 UI 用户界面组件,用来控制外观的主题和一个与用户界面直接绑定的...

  • AnduxJS:ReactReact + Redux模块化,可扩展,简单友好的框架

    如果环顾四周,您将看到应用程序具有相同的行为,几乎所有应用程序都具有相同的CRUD(创建,读取,更新和删除)逻辑,对于我们开发人员来说,创建始终相同的体系结构和功能很无聊。 :rocket: 脚手架 要动态生成新...

  • 前端体系结构知识概括

    前端体系结构知识概括前端体系简介三大框架CSS简介HTML简介JavaScript详细简介UI 组件简介 前端体系简介 前端开发的核心是HTML + CSS +JavaScript。 本质上它们构成一个MVC框架,即HTML作为信息模型(Model),CSS...

  • AJAX 应用程序体系结构(第1部分)

    简而言之,部分呈现允许您维护与传统 asp.net 2.0 应用程序类似的体系结构。它只提供了一套新的服务器端工具,您可以用其来实现无闪烁页面更新。 而远程服务则涉及由脚本相对较多的 ajax 前端所调用的面向服务的...

Global site tag (gtag.js) - Google Analytics