钉钉(工作协同)应用之前端源码赏析

这几天在兴趣下翻看了钉钉(工作协同)应用的前端源码,分析其目录结构、构建工具及框架使用等,进行前端技术研究,分享我的总结成果。

PS:不知道这应用的没关系,因为总结出来是前端通用的东西。

PS:其应用样子。

前言

我研究的是PC桌面版的钉钉应用,应用是由“chrome内核容器+ web页面”构成的,也就是桌面的混合应用(跟手机Hybrid应用的原理一样),针对分析的也是其web页面部分。

首先它是一个单页面的应用,主体框架是用AngularJS,页面路由也是由AngularJS完成。由于框架是会主导着项目的开发方式,所以它的目录划分会以AngularJS的模块进行。

我将分析的部分放到我的Github上,主要是这四个文件:https://github.com/codingforme/code-learn/tree/master/dingding

js依赖库分析

看别人用的依赖库的好处在于,你知道有什么可以用,什么可以借鉴。

PS:人最怕是不知道,而不是你不会。

1. jQuery

钉钉使用了1.9.1版本的jQuery,jQuery作为一个最为广泛使用库,已经不用说明它是什么了。

学习地址:http://jquery.com/

PS:Includes Sizzle.js

2. jQuery Hotkeys

jQuery插件,可用来监听键盘事件,几乎支持所有的组合键。

学习地址:https://github.com/jeresig/jquery.hotkeys

3. jQuery Caret

jQuery插件,处理文本框的插入位置。

学习地址:https://github.com/accursoft/caret

4. jQuery atwho

jQuery插件,自动完成提示插件(autocomplete mentions),类似微博的@功能。

学习地址:https://github.com/ichord/At.js

演示地址:http://ichord.github.io/At.js/ (支持Textarea、ContentEditable、CKeditor等富文本编辑器)

PS:基于Caret.js

5. jQuery tooltips

jQuery插件,一个简单的提示插件,风格挺舒服的。

学习地址:https://formstone.it/components/tooltip/

PS:这只是formstone其中一个库,还有其他有意思的。

6. jQuery mousewheel

jQuery插件,用于添加跨浏览器的鼠标滚轮支持。

mousewheel事件的处理函数有一点小小的变化,它除了第一个参数event 外,还接收到第二个参数delta。通过参数delta可以获取鼠标滚轮的方向和速度。

学习地址:https://github.com/jquery/jquery-mousewheel

7.  QR Code Generator

二维码生成器,纯前端生成。

学习地址:https://github.com/kazuhikoarase/qrcode-generator/tree/master/js

PS:其他语言的该作者也有提供。

8. libphonenumber

Google的JavaScript库,用于解析,格式化和校验国际电话号码。

学习地址:https://github.com/googlei18n/libphonenumber/tree/master/javascript

9. Underscore.js

Underscore一个JavaScript实用库,提供了一整套函数式编程的实用功能,但是没有扩展任何JavaScript内置对象。

学习地址:http://www.css88.com/doc/underscore/

PS:这个真是个不错的库。

10. AngularJS

AngularJS是一个框架(不是库),在我印象里最大的特点是双向数据绑定。

学习地址1: http://angularjs.org

学习地址2: http://www.apjs.net/

AngularJS拓展指令

1. angular-qrcode

An AngularJS directive to creates QR Codes using Kazuhiko Arase’s qrcode-generator library.

学习地址:https://github.com/monospaced/angular-qrcode

2. angular-ui/ui-select2

This directive allows you to enhance your select elements with behaviour from the select2 library.(这个指令已经过时。)

学习地址:https://github.com/angular-ui/ui-select2

PS:这个指令依赖的jQuery select2库(https://select2.github.io/),这个库非常不错,效果如下:

3. others

还有使用到其他AngularJS拓展指令, 可在这查看:http://angular-ui.github.io/

PS:上面的只是简写,完整的可以看我另外一篇文:【钉钉js依赖库学习

css分析

查看钉钉的样式文件(压缩合并后)后,我觉得其样式内容可以分为5大种(分文别类是为了开发更加清晰)。

1. reset.css | 重置样式

2. base.css | 基础样式

3. common.css | 通用样式

4. module.css | 模块样式

5. unit.css | 元件样式

reset.css

(0-49行)重置样式,消除默认样式和浏览器差异。

这个已经是约定俗成的,sass工具也有库可直接使用,或者在网上寻找别人总结好的来用也可,例如:

【HTML css reset 】http://www.zhangxinxu.com/wordpress/2010/08/html5-css-reset/

base.css

(50-529行)基础样式,含HTML标签的初始样式、字体图标、显隐样式。

例如:body、a、input、button、.visiable、.hide等。

common.css

(530-1441行)通用样式, 全局通用样式、布局(与业务无关)等。

例如:

1. 布局(将页面分割为几个大块,通常有头部、主体、主栏、侧栏、尾部等)

2. 滚动条(progress)

3. 进度条(loading)

4. 表单 (form-area、checkbox、radiobox)

.....

modules.css

(1442-3465)模块样式,业务相关的模块样式(一个语义化的可以重复使用的较大的整体!)

例如:

1. 菜单(menu-pannel )

2. 内容区域(content-pannel)

3. 搜索栏(search-wrapper )

4. 遮罩层(ding-modal)

5. 对话框、弹出框(dialog、unpop-modal)

6. Tab

7. 提示语(tip-menu)

8. 音频(audio-player)

9. 下拉菜单(dropdown)

10. 消息提示框(Toast)

11. 表情(emotion-container)

.....

unit.css

(3465-end ) 元件样式,通常是一个不可再分的较为小巧的个体,通常被重复用于各种模块中!

例如:

1. 登录Tab(login-tab)、登录表单(login-form)、密码加强(pwd-strength-panel)

2. 文件对话框(file-area )

3. 群组(ding-group-pannel)、群组联系人(contact-group-pannel)

4. 好友请求(friend-request-pannel)

6. 组织列表(org-list-pannel)、详情(org-detail-pannel)

7. 小应用列表(micro-app-list-pannel)

8. 个人资料卡(profile-card)

9. 没有内容(nocontent)

10. 预览文件(preview-file-modal )

......

值得学习地方

1. 命名简约而不失语义。

它的样式的命名很清晰明了,特别是模块、小元件部分,上面括号里就是其样式名。

2. 样式划分清晰,在该在的地方。

它按照 reset->base->common->module->unit,把代码写在该在的地方。有时某些开发人员可能没把通用抽出来,而是在每个模块业务代码写,例如:把button样式写在业务代码里面,而它明显是通用的。

所以,能往上提的样式,就往上提,这样利于复用。

js业务代码分析

在js业务代码里,我发现了使用的构建工具是browserify,于是我决定将其目录结构还原出来。

PS:怎么还原可以看我另一篇文章【browserify压缩合并源码反编译】。

目录结构

顶级目录:

directive:

filter:

module:

service:

由于篇幅关系,就只看到二级目录。另外由于代码是压缩合并后,不好看逻辑,而且这样翻别人源码感觉不大好,所以就不解析具体源码。

值得学习地方

1. 目录分类

前言里面说了,框架影响了开发套路,所以属于AngularJS的service、directive、 filter是肯定存在的,module目录放置每个模块的入口js,目录看来是简单合理的。

另外就是模块(service、module)的细化程度,我以前的前端代码分类从没这么细化,就变成了某些业务逻辑文件变得很长。

2. 单页开发方式

单页的模块开发,使用browserify构建工具,页面路由用AngularJS的router。

总结

js依赖库部分里面一些库就很好用,这点以后可以用上。

样式部分着重命名和抽象(复用)。

js业务逻辑并没有细看,我觉得学习别人前端源码,目录结构已经够用了,毕竟项目的骨架搭好了,其他的也就是添砖加瓦而已(虽然可能某些砖瓦非常好)。

PS:中秋节好无聊~~~

本文为原创文章,转载请保留原出处,方便溯源,如有错误地方,谢谢指正。

本文地址 :http://www.cnblogs.com/lovesong/p/5875230.html

时间: 2024-12-24 23:19:59

钉钉(工作协同)应用之前端源码赏析的相关文章

前端源码安全

今天思考下前端源码安全的东西(不是前端安全,只是针对于源码部分).在我看来,源码安全有两点,一是防止抄袭,二是防止被攻破.实际上讲,前端的代码大多是没有什么可抄袭性,安全更是形同虚设的(任何前端输入都是不能相信的).但如果还是想防止源码被查看,HTML.CSS并不能做什么,最终都会用露出来(最简单用Chrome开发者工具就可以看到),所以只能针对JS做文件的压缩合并和混淆. 关于抄袭 其实就前端来讲,代码没有什么好抄袭的,大多人都是抄UI设计(这个是躲不了),还有一些富前端的控件和算法,重要之处

Cocos2dx源码赏析(1)之启动流程与主循环

Cocos2dx源码赏析(1)之启动流程与主循环 我们知道Cocos2dx是一款开源的跨平台游戏引擎,而学习开源项目一个较实用的办法就是读源码.所谓,"源码之前,了无秘密".而笔者从事的也是游戏开发工作,因此,通过梳理下源码的脉络,来加深对Cocos2dx游戏引擎的理解. 既然,Cocos2dx是跨平台的,那么,就有针对不同平台运行的入口以及维持引擎运转的"死循环".下面,就分别从Windows.Android.iOS三个平台说明下Cocos2dx从启动到进入主循环

Cocos2dx源码赏析(2)之渲染

Cocos2dx源码赏析(2)之渲染 这篇,继续从源码的角度来跟踪下Cocos2dx引擎的渲染过程,以此来梳理下Cocos2dx引擎是如何将精灵等元素显示在屏幕上的. 从上一篇对Cocos2dx启动流程的梳理中可知,Cocos2dx依靠通过各平台的入口启动引擎,并在循环中调用Director::mainLoop方法来维持引擎的各种逻辑: void Director::mainLoop() { if (_purgeDirectorInNextLoop) { _purgeDirectorInNext

Fresco源码赏析 之 图片显示流程

转载请注明出处:http://blog.csdn.net/u014614038/article/details/51498068 上文大概将Fresco的基本流程通了一遍,就是Frosco是如何实现了只是简单调用了setImageUrl的方法后自动将所有事情做好,这里包含很多的流程,上文大概把这些流程过了一遍,这篇文章打算将接说一下上文没有说到的一些东西,就是拿到数据后它是如何处理的,是怎么显示出来的. 上文 Fresco源码赏析 之基本流程可以看这里: http://blog.csdn.net

前端源码-部分资源

然后下面链接分享一下,是目前阅读研究源码的一部分资源:jQuery source viewerjquery源码查询这些年.我收集的JQuery代码jquery1.6中的.prop()和.attr()异同第三章<遍历DOM元素>jquery选择器javascript笔记:临摹jQuery(一)jQuery 的原型关系图jquery选择器[原创]jQuery1.8.2源码解析之jQuery.Callbacks[原创] jQuery1.6.1源码分析系列(停止更新)jQuery event(上)jq

Mahout 协同过滤 itemBase RecommenderJob源码分析

来自:http://blog.csdn.net/heyutao007/article/details/8612906 Mahout支持2种 M/R 的jobs实现itemBase的协同过滤 I.ItemSimilarityJob II.RecommenderJob 下面我们对RecommenderJob进行分析,版本是mahout-distribution-0.7 源码包位置:org.apache.mahout.cf.taste.hadoop.item.RecommenderJob Recomm

Spark Executor内幕彻底解密:Executor工作原理图、ExecutorBackend注册源码解密、Executor实例化内幕、Executor具体工作内幕

本课主题 Spark Executor 工作原理图 ExecutorBackend 注册源码鉴赏和 Executor 实例化内幕 Executor 具体是如何工作的 Spark Executor 工作原理图 第一步:Master 发指令给 Worker 启动 Executor: 第二步:Worker 接收到 Master 发送过来的指令通过 ExecutorRunner 远程启动另外一个线程来运行 Executor: 第三步:通过发送 RegisterExecutor 向 Driver 注册 E

详解postfix邮箱服务器安装、配置及其工作原理(内附源码包)

简介 postfix是Wietse Venema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件.postfix是Wietse Venema想要为使用最广泛的sendmail提供替代品的一个尝试.在Internet世界中,大部分的电子邮件都是通过sendmail来投递的,大约有100万用户使用sendmail,每天投递上亿封邮件.这真是一个让人吃惊的数字.Postfix试图更快.更容易管理.更安全,同时还与sendmail保持足够的兼容性. 工作原理 客户端通过Outlook软件,向邮件

10款精美的web前端源码的特效

1.HTML5侧滑聊天面板 很酷的聊天界面 这是一款基于HTML5和SVG的侧滑聊天面板,初始化的时候聊天面板是锁定的,当你拖动白色区域时,即可解锁展开聊天面板,显示所有好友.点击面板中的好友即可切换到聊天模式.无论界面美化还是动画特效,这款HTML5聊天面板都非常不错,当然具体的聊天功能仍需你自己实现. 在线演示 源码下载 2.jQuery 美化界面的下拉框 之前我们介绍过一款基于jQuery多级联动美化版Select下拉框,很多朋友都非常喜欢,可见经过美化过的下拉框的确可以让你的网页更为精妙