YUI3设计中的激进和妥协

作者:拔赤 来源:Taobao.com UED Team 时间:2010-01-17 09:59:00 

相信每个前端工程师都有自己喜爱的javascript框架,说情感也好,道信仰也罢,javascript框架带给人的不仅仅是便捷的开发,更有一种纯粹的逻辑美感,不管是jquery曼妙的简洁,还是yui魔术般的沙箱,都使我们产生无穷的想象。然而,js框架却又必然无法做到面面俱到的完美无瑕,比如jquery在OO方面做出的让步,以及yui在性能上做的牺牲,无不给人传达一种缺憾美、一种理想的现实主义。今天,我们来看看yui3在框架设计中的这些牺牲和让步,以便让我们更加深刻的理解yui3的全貌,并将其优势发挥至最佳。

1、种子的一步到位 or 颗粒化

所谓种子一步到位是指只要在页面引入一个种子文件的script标签,比如prototype和jquery,只要引入一个prototype.js或jquery.js就可以了,他们将各自对dom操作和event的封装等等都囊括进一个文件中,并尽力将其做到最小,这样做的好处是显而易见的,使用框架非常简单。然而yui将这些功能做了级别划分和颗粒化设计,从概念上抽象出来“核心”、“工具”和“组件”,每个小功能放在一个文件当中,需要的时候则要自行去引用,yui文档中给出的大量demo都采用这种方法,这种设计显然不像jquery那样对初学者友好,而且使用起来不够傻瓜,为了实现一个小功能,甚至要引入三四个js文件。yui这样做的原因有两个,一是yui实在太大,把所有功能都搞进一个文件中确实有点不靠谱,二是为其动态加载的框架设计做铺垫。

2、手动引入 or 动态加载

往页面中写js的传统方法是,直接将js文件作为script标签路径写在页面中,使用yui也可以这样引入页面,但yui更推荐使用loader进行动态加载。动态加载脚本的渊源很复杂,目前来看主要原因有三,其一,页面中手写js标签无论如何都会占用一个http请求,即使这个请求是一个304,动态加载的文件缓存后则不必发起真实的http请求,其二,动态加载可以实现按需加载,而且可以根据js文件之间的依赖进行去重和排序,手写标签加载js文件则必须让开发者去额外关注一下文件的排序、重复等等,其三,动态加载有利于页面代码的语义化,这使得开发者只关心“需要什么”,而不用去在意“如何得到”。当项目变得越发臃肿,维护成本越来越高的时候,这中小技巧会有不小的好处的。

3、逻辑启动的单一入口 or 沙箱

我们在页面中启动一个js逻辑通常是放在一个类似onDomReady的方法中,如果页面中存在多个逻辑的时候怎么办呢?比如,a实现了逻辑A,页面代码是这样的

<script src="logicA.js" />
<script>
$.onDomReady(function(){
___LogicA.start();
});
</script>

这段代码通常写在页面的尾部,这段逻辑所伴随的html代码是埋藏在页面的某处,这时b要在页面中增加逻辑B,b的做法是首先找到尾部的这段代码,然后更改成如下模样:

<script src="logicA.js" />
<script src="logicB.js" />
<script>
$.onDomReady(function(){
___LogicA.start();
___LogicB.start();
});
</script>

同样,B逻辑所伴随的html代码也是埋藏在页面的某处,这样看来,js逻辑和其伴随的html代码如此分离,以至于到了删减功能的时候,往往删掉html却忘了删js,或者删掉js忘了删除html,在重用代码的时候也会是个麻烦。同样,在调试的时候,工程师也要打开两个窗口分别关注js和html,即使这两段代码在同一个文件当中。如此则不如把代码写成这样:


<!–A逻辑的html代码段–>
<script src="logicA.js" />
<script>
$.onDomReady(function(){
___LogicA.start();
});
</script>

<!–B逻辑的html代码段–>
<script src="logicB.js" />
<script>
$.onDomReady(function(){
___LogicB.start();
});
</script>

这种coding写法正是yui所提倡的,也就是所谓的沙箱,每个逻辑包含在一个沙箱中,各司其则互不干扰。当第三者浏览代码的时候也立即明白这就是一个独立的功能块,包含典型的html结构和启动逻辑的js,要重用,整块拷走即可。

标签:jquery,yui,prototype,JavaScript框架
0
投稿

猜你喜欢

  • MySQL Innodb表导致死锁日志情况分析与归纳

    2024-01-27 04:04:42
  • C#简单连接sql数据库的方法

    2024-01-14 09:01:27
  • django实现前后台交互实例

    2022-04-12 20:53:33
  • 关于Vue的异步组件

    2024-05-09 10:52:35
  • Python selenium爬取微博数据代码实例

    2023-07-01 02:46:49
  • 简单了解django索引的相关知识

    2021-10-01 14:55:43
  • 使用cx_freeze把python打包exe示例

    2021-06-10 05:36:20
  • .Net行为型设计模式之策略模式(Stragety)

    2024-05-13 09:18:07
  • 一文详解Go语言fmt标准库的常用占位符使用

    2023-08-07 01:57:56
  • ASP.NET程序中用Repeater实现分页

    2024-05-09 09:02:48
  • SQL Server 2008 安装和配置图解教程(附官方下载地址)

    2024-01-12 20:28:17
  • 推荐5款跨平台的PHP编辑器

    2023-10-18 12:49:40
  • Python使用matplotlib绘制三维参数曲线操作示例

    2021-03-30 05:55:31
  • 快速解决cv2.imread()读取图像为BGR的问题

    2023-03-11 12:13:16
  • Python实现将通信达.day文件读取为DataFrame

    2022-07-31 23:33:20
  • mysql MGR 单主多主模式切换知识点详解

    2024-01-28 00:13:00
  • 详解Python IO编程

    2021-06-26 08:40:48
  • Python set集合类型操作总结

    2023-10-26 03:35:15
  • django 2.2和mysql使用的常见问题

    2024-01-27 17:40:02
  • 新手程序员编程必不可少的工具

    2023-10-24 08:16:25
  • asp之家 网络编程 m.aspxhome.com