说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

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

HTML文档下载 WORD文档下载 PDF文档下载
我们常常看到Web应用中将JavaScript、CSS、图片文件分别按文件类型区分,这一习惯在过去的Web开发场景中尚可胜任。但随着Web App的发展,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方法使得这种方式变得现实。控制器能够触发一个事件来执行某些动作,然后再动作结束后收到相应地通知。

原文链接:CLIFF MEYERS

fieldValue(successful)-JQuery API formSerialize(true)-JQuery API formToArray(true)-JQuery API resetForm()-JQuery API $.recallDroppables()-JQuery API $.SortSerialize()-JQuery API Draggable(hash)-JQuery API DraggableDestroy()-JQuery API Droppable(options)-JQuery API DroppableDestroy()-JQuery API Sortable(options)-JQuery API SortableAddItem(elem)-JQuery API $.meta.setType(type, name)-JQuery API data()-JQuery API disableTab(position)-JQuery API enableTab(position)-JQuery API tabs(initial, settings)-JQuery API triggerTab(position)-JQuery API triggerTab(position)-JQuery API Tooltip(settings)-JQuery API PHP简介-PHP初学入门教程1 选择PHP的理由 -PHP初学入门教程2 从一个简单的程序来了解PHP -PHP初学入门教程3 PHP语法基础 -PHP初学入门教程4 建设一个简单的交互网站(一) -PHP初学入门教程5 建设一个简单交互的网站(二) -PHP初学入门教程6 建设一个简单交互的网站(三)密码验证 -PHP初学入门教程7 PHP文件上传 -PHP初学入门教程8 为站点添加投票功能 -PHP初学入门教程9 广告条轮播-PHP初学入门教程10 操作MySQL数据库实现简单的留言板-PHP初学入门教程11 在bc中怎样创建资源文件?? 请高手进入,急!在线等待 生活有你 更新后台數據,用試圖就可以,用代碼就不行? ★★★CFormView的大小,高手没必要进,低手就可以解决了! 不超过十行,但.....(C) 打到雍亲王 "准女朋友的胸太平了,我该如何取舍? " 准备结贴了,要顶的赶快顶呀,去晚了就没机会了 为什么我从数据采集仪采集到的数据是乱码? 请教:动态的下拉菜单怎样做?在线等待,答对就给分! 有谁知道用vb如何把bmp的文件转换为jpg格式?? sql server2000是不是不能在winxp 专业版下安装?? 请问大家 wait函数的使用问题(给100) 关于wait函数的使用问题(给100) 如何在xp下能够删除带子目录的文件夹? [求助]关于考试座位号随机分配问题! 无奈的我等你的帮助! 在delphi中如何建立一个doc文件? 有谁可以帮帮忙(在线等待) 请问大家如何防止DEDE的,我发现许多软件没有进行压缩也无法进行DEDE反编译,通常只能进行到一半 现代制造业企业管理系统的开发 (C++ builder) 线程设计,帮帮忙!!! 关于flash中的actionscript 如何做自动评分的考试系统?给点建议或意见! 告急!!!主从表的问题,怎样修改从表时,让主表的数据跟着变化? 刚刚在新闻组看到的东西, 让大家乐乐(转贴) 关于ASP.NET的讨论,欢迎大家指正. 再发:请教在Rave 报表中如何在每一页上都显示打印表头 关于视图的问题!!!很急,各位大哥帮帮忙!! CrystalReports(水晶报表)的版权问题 请看此贴!帮忙阿! 菜鸟问题,请问怎么让 点主from上的一个按钮就弹出另一个编好的窗体 请问能不能将网页页面内容保存为word文档输出?? 碰上大麻烦了,哥们们救救我吧!~ 请看此帖,帮忙啊! 中文打包问题 谁可以给我一个java的例子读excel的*.cvs文件,thanks 请看此帖,帮忙啊! 想请叫一个关于网站视频的问题 关于jre的2个问题 oracle错误 Memo字段(Access)的字符串搜索问题? 在线等待啊,高分!!对选题的判分。 请看此帖,帮忙啊! 我是新手 不知学习前端软件开发哪种好(vb.net / pb /?????????) 高手救急!win2000/xp安装棘手问题!在线等 我的小猫怎摸找不到了呢? 菜鸟一问:一个关于生成类似VC中WorkSpace的一个问题,救命用啊~~~请大家帮忙!! 如何在点击其他区域(非弹出菜单区域)时去掉弹出菜单? 请问可以将网页页面保存为word文档输出吗? 怎么做能得到一个文件的图标 关于英雄形像和秋天景色的成语 思维北征,宜先入南中思的意思 会议主席台领导坐位怎么排?按领导的左手向为大还是右手为大,总经理、党委书记、副总、工会主席位置怎么排? 急需英语单句改错题答案,并讲解理由, 臣受命之日 寝不安席 食不甘味 作文 今天我当家 2009年双子座流星雨在美国能看到么?加州.俄勒冈那里 “故五月渡泸,深入不毛”涉及到什么事件? 瞬间的感动作文600字初2水平今天就要自己写写得好给加分不得抄袭 请问、2010年的双子座流星雨在广东韶关能看到吗?几号能看到最多? 五月渡泸,深入不毛与什么战役有关 六年级清明作文,不是和同学一起去烈士陵园 , 2011英语作文改错试题 用‘小时’作‘单位时间’行吗? 汽车的车辆识别代号一个圈中间有一横的是什么符号啊?不是零啊. 2009国庆阅兵读后感,300字到400字之间.要300到400字之间 电功率的时间单位是秒吗?100W的时间单位是小时吗? 一个圈中间一个像A但没有下面一横的标志是什么车 09国庆阅兵读后感急死了 机械表是用什么方式对应时间单位:小时,和分钟的?如果说:时针从一个数字走到下一个数字经过的这个格子对应的是时间单位(一小时),那么分针同时间走的一圈是什么意思?如果再说:分 二班听我说作文小学300字 tourist products在有关旅游的英语文章中什么意思 西班牙语cuidarte el 以辛亥革命为开端的中华民族100年来伟大复兴的历史进程 products什么意思啊,英语真的实在不通了 要求初二水平 ,正方形ABCD中,边长为4,BE=1,P是线段AC上的以动点,当P在AC上运动是,PB+PE的最小值是多少? adopted hometown 怎么翻译 第二故乡吗? 英语广告:“Brand new w/warranty.”中的“w/”是什么意思?类似的还有:“Brown w/ ice maker.Excel.cond.Reasonably priced.”中的“w/”是什么意思? c 如何实现画抛物线 “但愿人长久,千里共婵娟.”意思相近的诗句 关于鲁滨逊漂流记的读后感字数500 急! 不讲诚信的人有什么危害? 动植物体内细胞的差异与细胞分化程度有关.这句话对吗? Brand products such as character是什么意思啊 求初2说明作文 from till,from to两个短语区别 帮我看看这改错题 One afternoon a girl set out in the coast in a small boat and was caught in a storm.答案说把in改成from,可这句话有另个in ,应该是该哪个呢? 2009国庆阅兵直播观后感600字要像初一写的 写事作文最好的方法是甚么?(初2作文)写实作文的最好方法是甚么?(初2作文) 求英语,这是道改错题,每条都有错, 求解一道高数的定积分题目 寻求初2英语短文解释In ten years,I think l’ll live in Shanghai,because l went to Shaihai last year and fell in love with it.I think it’s really a beautiful city.As a reporter,I think l will meet lost of interesting people.I think l’ll l 会议室座位安排领导10名,秘书1名,主持人1名,客人43名,大屏幕在门口那侧,如何安排座位? 因为男方连续多个月赌博,被女方发现赌博单据,并且事后还不承认错误,两人已经分居半年多,男方一直也没有诚意,以托时间为主,就是不同意离婚,还动手打人,辱骂女方,曾经说过:‘我就是不 治水必躬亲中第二段的写作手法,说明了什么 “第二故乡”英文怎么翻?、、RT、、 有一个与地面成30°角的斜坡,现要在斜坡上竖一电线杆,当电线杆与斜坡成( )度角时,电线杆与地面垂直.我同学都算得等于60°,我的疑惑是:为什么不能写120°?求大师解决 求一把很长的刀的符号长一点的啊 好看的 霸气的都太短 请帮解释一改错题 I was about to rush out of the train station when a well-dressed old man took me by my arm.“ Young lady,” said the gentleman,“Shouldn’t you find out the bus schedule before you rush out to catch the bus?”by my arm 出师表“五月渡泸,深入不毛”是三国演义中的什么故事 怎样搞一把刀的符号 例:风景——流连忘返 问:英雄——( ) 五月渡泸,深入不毛,. 英语翻译The economic consequences of relaxing fair value accounting and impairment rules on banks during the financial crisis of 2008-2009 If he hadn’t used his cellphone to make that SOS call ,all the passengers on boat would have left to die in the sea ,just like what happened to the people on the Titanic almost 100 years ago .would have left 改成would have been left为什么要 湿婆神发怒是什么意思 某会议厅主席台上方(2010•定西)某会议厅主席台上方有一个长12.8m的长条形(矩形)会议横标框,铺红色衬底.开会前将会议名称用白色厚纸或不干胶纸刻出来贴于其上.但会议名称不 2009年双子座流星雨2009年的双子座流星雨大不大?我家在黑龙江黑河具体的观测时间和观测地点需不需要带什么?如果没有天文望远镜看得到嘛?我刚等完狮子座流星雨就感觉俩字:上当这次看 五月渡泸,深入不毛 指的是三国演义中的哪个故事 会议室主席台后面墙上怎样布置 日民主党前干事长将建新团体 被批欲自德法将于年底前就电子监控问题与美举行皮尤研究称仅3成美国人通过Faceb新西兰传统信件大减 邮政送信工作日将波士顿高中教师惨遭谋杀 或系14岁男安倍曝吸烟史 称戒烟后才理解被动吸烟黎巴嫩商人因内线交易获1400万欧元奥斯卡影后赞与英王子跳舞“比亲热还爽韩国双胞胎整形“扭转命运” 戽斗脸变黎巴嫩商人因内线交易获1400万欧元法国征收75%富人税致LV老板移民 日议员提议给安倍出席国会次数设上限美媒:美情报机构曾针对俄中进行情报收报告称加拿大恐无法完成2020年减碳日本欲以“和食”申遗为契机吸引更多外瑞金创建“共和国摇篮”5A级景区 投马英九:过去5年实践九二共识内涵 未镇党委书记就拖欠猪蹄店70万致歉 称日民主党深刻反省野田内阁未根本解决福东京股市日经股指大跌2.75%中欧为推进经贸关系谋共识哈登:被雷霆交易那晚我哭了甘肃省委副秘书长唐兴和拟任省委政策研卢谈取得2比0: 做了我们该做的女子不喝酒有酒驾记录 罚款金额100带儿分歧多易毁婆媳关系:3招让婆婆听2200万!papi酱首个贴片广告成Papi酱视频贴片广告217000元把手机插进花盆里,居然就可以充电了.上车第一件事系好安全带 但安全带系对谢国忠谈风险管理​​小样的。。不脱衣服还真干不过你!!平煤股份被严重小瞧 成2016暴涨妖历史紧要关头 我们不能对美国流氓低头果酱音乐春季招聘开始啦!还不赶紧行动“五险一金”变“四险一金” 对你有什精心准备个股,随时备战悦美网宣布获1.1亿元B轮融资,想要携程网拟入股东航 参与150亿元定增奥多姆或时隔3年重返球场 他已收到一国产高端旗舰该如何抉择,小米5or乐澳洲留学SSVF学生签证新政策,柳橙
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘