工作那些事儿(10)- 前端

    虽然我一直强调不是前端工程师,但这里还是要好好说前端的框架,因为这也是我得意的一个作品。

    EIP的前端一开始只是单纯地使用jquery。jquery被称为神器不为过,因为真的很好入手,扩展又多,可以实现的效果又好。我以前写过dephi,写过action script,类似这种事件驱动的动态语言再容易上手不过了。但是jquery用得多了,代码开始失控了,一段又一段的事件驱动回调函数,而且不好复用,有很多重复代码,想抽象,发现又凌乱了,总之,代码总体的逻辑结构性不强。如果只是一个jsp实现一些简单特效就没问题,但重前端应用中,这很容易混乱,代码的质量变得低下,可维护性大大降低。

    我想找一个帮助我将代码模块化结构化的框架,但一定要轻,要尽量低的迁入成本。然后找到了backboneJS,那时候backboneJS才0.9.1,什么AngularJS 都还没浦头,可以选择的不多,看到说很多国外网站都用backbone,包括linkined,于是就用了。这家伙,确实是好家伙。他封装了简单的OO方式,无需再用js那拗口的面向对象语法,这让我更好地封装了代码,并使用简单的方式实现继承复用。而backboneJS核心的MVC模式,也很好帮助我将逻辑分层,通过对页面的切割,模块化更清晰。而且它的一个好是,我对原代码的改动并不是很大,就实现了迁入,当时代码量大概有4000行JS的样子,一周时间就完成了升级并测试通过。

    网上后来很多在讨论,到底backbone是不是MVC框架,因为它很坏,它的C是Collection,而它并没有Controller类,这跟传统意义的MVC相差太大了。但我是这样理解的,其实backbone的View才是MVC里面的C,控制者,在View里其实是实现逻辑的,而模板引擎+CSS才是真正的V层,这里描述了html布局和样式,是真正的显示层,M层则是Model + Collection。其实,有时候,无需要过多去争论一些字眼上的定义概念问题,关键是,用它带来什么好处,是否满足得到自己的需要,有没有多余的东西。现在backbone就是很能满足我的需求,其他后来的MVC也没见到有特别的东西让我感觉需要替换,所以也一直用下来了。

    还要说说模板引擎,因为一开始在用jquery,所以就用了jquery-template这个官方库,没想到它这么没生命力了,没过多久就宣布不再升级维护了,NND,而backbone本身建议用underscore的tmpl,但我实在不想全部模板又写一次(两者语法不一致),所以,也一直用jq-template了,这不能不说是一个遗留的痛。

    当时做着个前端,很有冲劲,想做得极致,参考了很多优化建议,后面还采取了合并代码并压缩的做法,就是将所有js合并到一个js文件,css也合到一个,tmpl文件又合到一个,最后html中要加载的资源除了第三方库,就只有另外三个all.min.js, all.min.css, all.min.tmpl文件,这样下来html合共请求的资源数从50+降到了30+,进一步减轻了http服务器的压力,而由于企业内网网速无压力,所以下载大体积的资源文件,也是很快的。

    前端另一个特别的地方就是,我当时想参考spring Ioc的思想,将类的构造放到运行时来决定,实现配置化的策略模式。这是有需求的,不是为做而做。需求源于我想代码更漂亮一点,其实简单的实现就是不断地if else,但是我有一定洁癖,我不想这样if else,所以我想做类似Ioc的东西。JS不是Java,没有class loader,这么搞呢?这个当时花了相当时间去找资料研究,最后的实现方法确非常简单:JS是一个动态语言,原来他本身就具备了这种Ioc的动态性质。简单讲,举个例子,执行一个function,代码中可以写成


myFunc();


来调用,也可以将函数放到一个变量中,然后调用:


myArray = [];
func = 'myFunc';
myArray.push(func);
myArray[func]();


    如此下来,前端基本构建起来了。

你可能感兴趣的:(jquery,backbone)