关于新框架的使用体会

       此次通过一个新增模块的业务,尝试了用全新的方式去实现。个中波折感悟,以下一 一表述。

       总的来说,新框架的核心思路还是模块化,架构上通过目录结构的形式,利用RequireJs,业务逻辑和通用模块的设计上去做到模块的独立性,降低模块间的耦合。模块化一直也是我们最近前端架构调整的一个方向,新旧对比而言,在模块化的思路上我感觉主要有以下几个区别:

旧:
      1,模块划分上,主要以大的功能区块来划分,模块的体量比较大,通常会包含几个页面;
      2,模块内没有或较少再去细分模块,导致模块内部的公用css、img、js方法等复用度参差不齐;
      3,优点是目录相对精简,大模块内部的结构符合习惯的目录放置方式,理解上没有门槛,可以快速在团队中形成规范;

新:
      1,模块划分上,视觉上通过页面小模块为单位来划分;业务逻辑上,结合视觉模块,通过base模块/全局业务模块/部分通用模块/单模块来划分;
      2,划分上层级明晰,在大模块的划分内部有小模块的划分,通过requireJs来解决依赖加载和明确模块间的关系;
      3,模块划分单位较小,导致模块会较多,此时处理目录结构可以改进;模块内部html,css,js的引入应该更具模块化的思路,让模块内部各文件联系更紧密。

       下面主要就新框架的思路以及具体做法来展开说明一下。

一,模块划分及目录结构

我们以自助报修和24小时托管的蒙层来说明模块划分的思路。

两个页面的蒙层相似度很高

       显而易见的,两个页面的蒙层的共同特征决定了他们应该是一个模块,不管是页面样式,还是底部按钮的js,还是数字动画,都是一样的。所以,蒙层应该是独立出一个模块,然后两个页面的蒙层来继承这个蒙层模块的样式与js方法;目录结构如下:

模块划分的目录结构示例

        在文件放置位置上,通过页面名称来放置同一页面的不同模块。如报修页Maintenance下,有三个不同模块,蒙层模块,报修弹窗模块,报修原因弹窗模块,表明了这三个模块的作用页面;如此具体模块的页面结构关系便清晰了;
       在文件命名规则上,通过命名来表明模块的继承关系,如Hour24文件夹下的 H24Matte,通过后半部分单词来表明其继承的模块的名字;如此,模块的功能上的从属关系也会很明确;

二,模块继承的具体实现

        我们还是以蒙层为例,分别来说css和js的复用与继承;
1,CSS
        当前H24Matte和报修蒙层RepairMatte的公用样式文件就是Matte模块下的main.css,引入方式依旧是如以往的方式----放置于global.css中,全局引用;我认为当前的方式有两方面的弊端:其一,只是两个蒙层的公用样式,放置于全局的css中一并压缩,很多不需要用到这些css的页面也引入了这些代码,增加了css的代码量,影响性能,也增加了样式覆盖、相互影响的风险(当然我们有做防覆盖的措施,可以杜绝);其二,公用放全局,没有实现模块的高移植、快速复用的特性;如果不放在global中全局引用,而是通过页面<link>标签的方式引入,这样也无疑增加了模块复用的麻烦;因为你必须要记得给你继承模块的每个页面去添加一行link引入。
        我认为,要实现模块css的快速移植复用,不应该去过多考虑我继承的模块的公共css在哪儿引入;而应该通过继承的js方法动态的将公共的css插入到所继承的页面模块中;如此,只需要在模块的公共js写一个公共的插入css的方法即可;

2,JS
       
H24Matte和报修蒙层RepairMatte的公用js文件就是Matte模块下的main.js,引入方式不同以往。如下所示:

公共蒙层模块的js
继承了公共蒙层模块的24小时托管蒙层模块;

        通过这种依赖关系,就实现了js内部方法的继承,requireJs会根据依赖模块自动去请求js文件,所以我们不需要将Matte/main.js通过<script>标签来引入。那么当前页的js又是如何跟当前蒙层的html页面关联起来的呢?看下图:

蒙层子模块的html和js文件绑定

三,新框架的其他使用体会

1,dom操作
       
在日常开发中,我们经常会碰到这样的问题:我们给一个div加了某个class,并在js中对class绑定了事件操作;忽然有一天你发现这个div上的事件操作没有了,不执行了;最后你debug才发现原来其他同学不小心改了这个class名字,导致绑定失效了。
         这种事情绝对是多发的,会降低我们的开发效率;当然我们也可以在团队内部约定一些规范来减少此类事情的发生,比如要对某个class去做增删改样式操作时,只增加class,不改不删;但是如此一来同样有弊端,就是项目一大,时间一长,会产生很多冗余的class和css代码,降低性能。在我们的新框架中是如何去解决这一痛点的呢?看下图:

dom操作

2,事件绑定
         除了在js中获取dom来操作,绑定事件;我们也可以直接在html元素上通过属性去绑定事件操作。例如<a href="#" onclick="doSomething()"></a>,在新框架中主要是通过下面的方法来绑定事件操作:

事件绑定html写法


事件绑定的js写法

       

此种事件绑定方法和传统绑定方法出入不大,只是用另一种方式实现罢了;但是这种方式的绑定也是有必要的;因为新框架的js都是通过面向对象的方式来写的,通过类的封装方式;如此情况下再用传统的方式绑定,就需要在js中写function方法。如此的话,代码整体性和易读性上都会有缺损,也不利于继承;

3,三种函数格式

三种书写格式

        这是新框架中约定的三种函数格式的写法规范,分别对应不同的功能或范围;当然这只是命名规则上的规范,并没有对于方法的暴露与私有做限定操作。当然规范依然是有意义也是有必要的,这样的代码规范有利于代码的阅读和查找操作;有利于代码块的整理,比如所有的事件绑定操作的函数都置于底部事件操作区块,利于查找;私有方法放一块,置于事件绑定之上;会向外提供操作的方法则放于顶部;

4,模块的独立性

        新框架中的模块划分,模块间的独立性是给我印象比较深刻的一点;接下来我将以报修页面的点击自助报修按钮这个事件来说明这一特性。

自助报修按钮及弹窗

我们先来看看点击自助报修按钮做了一些什么事情(假设用户已登录):
1,点击按钮,发送ajax请求用户屏幕详情;
2,判断请求到的数据,提取出可保修的屏幕及其信息;
3,插入相关数据到可报修屏幕列表框,并弹出窗体;
4,检测弹窗是否弹出,弹出则隐藏蒙层上的元素,保持视觉上的干净;

        这里涉及到两个模块,一个是报修页蒙层模块;另一个是可报修屏幕的列表弹窗模块;如此,我们可以再来分析上述事件分别属于哪个模块。
事件一,发生在按钮操作上,显然属于 ---->蒙层模块;
事件二,发生在按钮点击后对数据的操作,也属于---->蒙层模块;
事件三,数据来源于蒙层模块的ajax请求并操作后的数据,属于---->蒙层模块;
             把数据插入弹窗内容区,属于---->弹窗模块;
             弹出弹窗---->属于全局的modal模块的方法;
事件四,弹窗弹出,属于---->属于全局的modal模块的方法;弹窗模块;隐藏蒙层的某些元素,属于---->蒙层模块;

        由此,我们可以看出,一二都是模块单独的内部事件,不涉及不同模块之间的交涉,暂不表;我们主要看看事件三、四这种交叉的逻辑怎么去实现,以保证模块间的界限和独立性。以事件三为例:

蒙层模块内部的方法
报修弹窗内的方法

1,因为数据来源于蒙层模块的操作结果,所以应该是在蒙层模块中操作;
2,而获取数据后怎么去使用数据插入模板,写入弹窗内容区,都不属于蒙层模块,所以这一块操作应该放在报修模块内部去操作;
3,于是报修模块内部实现了数据接收后的插入模板的操作;
4,但弹窗事件属于全局事件,所以报修弹窗模块也只是插入模板内容,模板写入后并不负责弹出事件;
5,弹窗后的回掉事件根据不同模块,操作也不同,所以全局弹窗只提供弹窗打开/关闭的毁掉事件,具体操作由调用的模块去完成;

这种模块js操作的方式,很好的保持了模块的独立性。内部方法内部实现,有交叉操作的地方通过get/set方式来提供操作的入口和出口,分工明确,互不牵扯;如此,模块的移植也就非常的便利了,复用的简便性大大提高。

四,总结

        此次通过新框架来开发新的业务模块,个中虽有困难,但也算顺利完成了预期目标。所以,新框架有一定的学习成本,但是并不高,相对于中间获得的感悟,还是非常值得尝试。
        我们原有的方式,是大家一直习惯的开发方式,包括思维方式和代码书写方式。在开发速度、相互交流、代码阅读上是有优势的;而且对于定位快速开发迭代的公司业务,短期内的优势也是比较明显的。缺陷在于,项目逐渐前行增大之后,由于模块间的粘连较多,代码混杂度较高,可维护性较差;模块间相互交叉多,导致补丁式代码增多,包括css等冗余代码也会一直增加,降低性能;易读性差。
        新框架的构建方式以及代码规范,在构建前期会有大量底层工作要做;但是基本框架完善后,这种优越性是显而易见的;目录和命名清晰,模块间耦合降低,复用方便,后期开发速率的提升等等。当然,新框架是有一定的学习成本,包括使用规范,命名规则,引入规范,模块划分,业务模块分割思路,以及面向对象的理解,还有requireJs的使用以及框架的base方法的熟悉等等。但是改革总是如此,没有牺牲和付出的改革是不值得去做的。阵痛过后,就是春天。





     

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,231评论 25 707
  • 在线阅读 http://interview.poetries.top[http://interview.poetr...
    程序员poetry阅读 114,192评论 24 450
  • 1.几种基本数据类型?复杂数据类型?值类型和引用数据类型?堆栈数据结构? 基本数据类型:Undefined、Nul...
    极乐君阅读 5,485评论 0 106
  • 我就像一丛野草, 远看绿意盎然,点缀山间 走近一点,杂乱 粗糙 我会舞动着,寻找属于自己的风 但请别靠太近, 会失...
    发表感想阅读 199评论 5 5
  • 前言和目录 上一章 自打接手127班取得一点成绩后,感觉好运连连,随后学校又安排我接了一个高三,成绩也还不错。 2...
    亦农阅读 773评论 3 6