`

如何组织大型JavaScript应用中的代码?

阅读更多

文章源自:http://www.csdn.net/article/2013-04-27/2815077-code-organization-angularjs-javascript

本文作者Cliff Meyers是一个前端工程师,熟悉HTML5、JavaScript、J2EE开发,他在开发过程中总结了自己在应对JavaScript应用越来越庞大情况下的文件结构,深得其他开发者认可。以下为CSDN编译:

地板上堆放的衣服

首先,我们来看看angular-seed,它是AngularJS应用开发的官方入门项目,其文件结构是这样的:

  • css/
  • img/
  • js/
    • app.js
    • controllers.js
    • directives.js
    • filters.js
    • services.js
  • lib/
  • partials/

看起来就像是把衣服按类型堆在地板上,一堆袜子、一堆内衣、一堆衬衫等等。你知道拐角的那堆袜子里有今天要穿的黑色羊毛袜,但你仍需要花上一段时间来寻找。

这种组织方式很凌乱。一旦你的代码中存在6、7个甚至更多的控制器或者服务,文件管理就会变得难以处理:很难找到想要寻找的对象,源代码控制中的文件也变更集变得难懂。

袜子抽屉

常见的JavaScript文件结构还有另一种形式,即按原型将文件分类。我们继续用整理衣服来比喻:现在我们买了有很多抽屉的衣柜,打算将袜子放在其中一个抽屉里,内衣放在另一个抽屉,再把衬衫整齐地叠在第三个抽屉……

想 象一下,我们正在开发一个简单的电子商务网站,包括登陆流程、产品目录以及购物车UI。同样,我们将文件分为以下几个原型:models(业务逻辑和状 态)、controllers以及services(HTTP/JSON端点加密),而按照Angular默认那样非笼统地归到“service”架构。 因此我们的JavaScript目录变成了这样:

  • controllers/
    • LoginController.js
    • RegistrationController.js
    • ProductDetailController.js
    • SearchResultsController.js
  • directives.js
  • filters.js
  • models/
    • CartModel.js
    • ProductModel.js
    • SearchResultsModel.js
    • UserModel.js
  • services/
    • CartService.js
    • UserService.js
    • ProductService.js

不错,现在已经可以通过树形文件目录或者IDE快捷键更方便地查找文件了,源代码控制中的变更集(changeset)也能够清楚地描述文件修改记录。虽然已经获得了极大的改进,但是仍有一定的局限性。

想象一下,你现在正在办公室,突然发现明天有个商务出差,需要几套干洗的衣服,因此给家里打电话告诉另一半把黑色和蓝色的西装交给清洁工,还有黑纹领带配灰色衬衫、白衬衫配纯黄领带。如果你的另一半并不熟悉衣柜,又该如何从三条黄色的领带中挑出你的正确需求?

 

模块化

希望衣服的比喻没有让你觉得过于陈旧,下面举一个实例:

  • 你的搭档是新来的开发者,他被要求去修补这个复杂应用中的一处bug。
  • 他扫过这些文件夹,看到了controllers、models、services等文件夹整齐地排列着,但是他仍然不清楚对象间的依赖关系。
  • 处于某些原因,他希望能够重用部分代码,这需要从各个文件夹中搜集相关文件,而且常常会遗漏某些文件夹中的对象。

信或不信,你确实很少会在新项目中重用很多代码,但你很可能需要重用登陆系统这样的整个模块。所以,是不是按功能划分文件会更好?下面的文件结构是以功能划分后的应用结构:

  • cart/
    • CartModel.js
    • CartService.js
  • common/
    • directives.js
    • filters.js
  • product/
    • search/
      • SearchResultsController.js
      • SearchResultsModel.js
    • ProductDetailController.js
    • ProductModel.js
    • ProductService.js
  • user/
    • LoginController.js
    • RegistrationController.js
    • UserModel.js
    • UserService.js

虽然现实世界中有空间限制,难以随意整理服装,但是编程中类似的处理却是零成本的。

现在即使是新来的开发者也能通过顶级文件夹的命名理解应用的功能,相同文件夹下的文件会存在互相依赖等关系,而且仅仅通过浏览文件组织结构就能轻易理解登录、注册等功能的原理。新的项目也可以通过复制粘贴来重用其中的代码了。

使用AngularJS我们可以进一步将相关代码组织为模块:

var userModule = angular.module('userModule',[]);
  
userModule.factory('userService', ['$http', function($http) {
  return new UserService($http);
}]);
  
userModule.factory('userModel', ['userService', function(userService) {
  return new UserModel(userService);
}]);
  
userModule.controller('loginController', ['$scope', 'userModel', LoginController]);
  
userModule.controller('registrationController', ['$scope', 'userModel', RegistrationController]);

 

如果我们将UserModule.js文件放到user文件夹,它就成了这个模块中使用到的对象的“manifest”,这也是适合RequireJS或者Browserify中放置某些加载指令的地方

如何处理通用代码

每个应用都会有某些代码广泛使用在多个模块中,我们常常使用名为“commom”或者“shared”的文件夹来存放这些功能代码。又该如何处理这些通用代码呢?

  1. 如果模块中的对象需要直接访问几个“通用”对象,为这些对象提供几个Facade(外观模式)。这有助于减少每个对象的依赖者,而过多的关联对象通常意味着糟糕的代码结构。
  2. 如果“通用”模块变得过于庞大,你需要将它按功能领域细分为多个子模块。确保每个应用模块只使用它需要的“通用”模块,这即是SOLID中“接口隔离原则”的变种。
  3. 在根范围($rootScope)添加实体,这样子范围也可以使用,适合多个控制器都依赖同一个对象(比如“PermissionsModel”)的情况。
  4. 在解耦两个不明确互相引用的组件时,请使用事件。Angular中Scope对象的$emit、$broadcast以及$on方法使得这种方式变得现实。控制器能够触发一个事件来执行某些动作,然后再动作结束后收到相应地通知。

 

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    大型JavaScript应用程序架构模式(1)

    在探讨大型JavaScript应用程序架构模式的过程中,我们首先需要理解架构模式的重要性以及它们如何帮助开发者构建更加稳定、可维护和可扩展的应用程序。今天,我们将深入研究几种关键的架构模式,特别是那些适用于从中...

    精通JavaScript源代码.rar

    理解如何通过对象和类来组织代码,以及如何利用继承和多态性来设计可复用的组件,对于大型项目来说至关重要。 DOM(文档对象模型)操作是前端开发的核心,JavaScript提供了与HTML元素交互的方法,如创建、查找、...

    Angular和Javascript有什么关系?

    当TypeScript代码被编译时,它会被转换成标准的JavaScript代码,可以在任何支持JavaScript的环境中运行,包括浏览器和Node.js环境。 Angular框架利用TypeScript的优势,为开发者提供了一种结构化的方式来组织和管理...

    JavaScript特效代码集

    这些框架极大地简化了大型Web应用的开发,通过组件化的方式组织代码,使得代码更易于维护和扩展。通过学习和实践这些框架的特效代码,开发者可以更好地理解和掌握这些前沿技术。 最后,对于初学者来说,这个代码集...

    基于MVC的JavaScript Web富应用开发

    通过实例代码和最佳实践,读者可以了解到如何构建健壮、易于维护的JavaScript应用。 总的来说,这本书不仅是JavaScript开发者的实用指南,也是理解Web应用开发趋势和最佳实践的重要参考资料。无论你是初涉...

    Javascript的有效代码

    同时,学习如何使用模块系统(CommonJS、ES6模块)进行代码组织,以及利用工具链(如Webpack、Babel)进行打包和转换,对于大型项目尤其重要。 在实际应用中,结合jQuery或React、Vue、Angular等前端框架可以进一步...

    C# to JavaScript转换器

    这种转换器的核心是SharpKit,一个高效且功能强大的编译工具,它允许开发者编写C#代码,然后在编译过程中自动将其转化为可以在浏览器环境中运行的JavaScript代码。 SharpKit的主要优点在于其编译时转换机制,这意味...

    vs2010 javascript代码折叠扩展插件

    在编程过程中,特别是在处理大型项目时,代码的组织和可读性至关重要。代码折叠功能允许隐藏不相关的代码块,只显示关键部分,从而让开发者更专注于当前的工作任务。对于JavaScript这种常常需要处理大量逻辑和函数的...

    21天学通JavaScript 源代码1(还有10章在源代码2文件)

    最后一篇综合案例篇用一个完整的例子讲解了如何使用JavaScript进行大型应用开发。  本书中,每一篇都是不同层次的完整内容,这不仅给初学者安排了循序渐进的学习过程,也便于不同层次读者选读。本书既适合没有编程...

    javaScript王者归来完整源代码

    同时,还会讲解错误处理、调试技巧以及如何构建和维护大型JavaScript项目。 总的来说,"JavaScript王者归来完整源代码"是一个全面的资源,无论你是刚开始接触JavaScript,还是希望进一步提升自己的技能,都能从中...

    21天学通JavaScript 源代码2(有一部分在源码1文件中)

    最后一篇综合案例篇用一个完整的例子讲解了如何使用JavaScript进行大型应用开发。  本书中,每一篇都是不同层次的完整内容,这不仅给初学者安排了循序渐进的学习过程,也便于不同层次读者选读。本书既适合没有编程...

    1st JavaScript Editor Pro 5.1

    6. **项目管理**:支持多文件项目管理,方便组织和管理大型JavaScript项目中的文件结构。 7. **HTML预览**:编辑器可以直接预览与JavaScript关联的HTML页面,确保代码与网页展示效果的一致性。 8. **版本控制集成*...

    很常用的JavaScript源代码文件.rar

    JavaScript,一种轻量级的解释型编程语言,广泛应用于网页和网络应用开发,是Web开发不可或...通过阅读和分析这些源代码,不仅可以巩固JavaScript基础知识,还能了解到实际项目中的最佳实践,从而提升自己的编程技能。

    Web前端开发技术-JavaScript代码编写.pptx

    1. **行内式**:这是最简单的JavaScript应用方式,将JavaScript代码直接写在HTML标签的事件属性中,例如`onclick`,`onmouseover`等。这种方式适用于编写简单的单行代码,但不推荐用于大型项目,因为它会使得HTML...

    javascript代码

    在"javascript代码"这个主题中,我们可以深入探讨JavaScript的核心概念、语法以及常见用途。 首先,JavaScript的基本结构包括变量、数据类型、运算符、流程控制(如条件语句和循环)以及函数。变量是存储数据的地方...

    TypeScript:JavaScript的强类型超集及其在Web开发中的应用

    TypeScript的设计目标是开发大型应用,它可以编译成纯JavaScript,编译出来的JavaScript可以运行在任何浏览器上 TypeScript作为一种为JavaScript添加了静态类型的编程语言,它在Web开发中的应用越来越广泛。通过提供...

    两个比较好用的Eclipse中javascript插件jsEditor jsEclipse

    在IT行业中,开发JavaScript应用程序时,一款好的集成开发环境(IDE)是必不可少的。Eclipse作为一款广泛应用的开源IDE,其强大的可扩展性使得开发者能够通过安装各种插件来增强其功能,特别是在JavaScript开发领域...

    JavaScript实例应用

    9. **模块化**:了解CommonJS、AMD和ES6模块系统,它们帮助组织和管理大型项目中的代码,使得代码可读性和可维护性更强。 10. **jQuery库**:虽然现代开发中更多使用原生API,但jQuery依然是许多网站的基础。学习其...

Global site tag (gtag.js) - Google Analytics