<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>刘钢的博客 - 我是UED &#187; JS库</title>
	<atom:link href="http://www.iamued.com/tag/js%e5%ba%93/feed" rel="self" type="application/rss+xml" />
	<link>http://www.iamued.com</link>
	<description>http://www.IamUED.com</description>
	<lastBuildDate>Wed, 18 Jan 2012 02:51:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Jquery1.4正式版发布了 JS库时代就是这样快</title>
		<link>http://www.iamued.com/qianduan/1180.html</link>
		<comments>http://www.iamued.com/qianduan/1180.html#comments</comments>
		<pubDate>Sat, 16 Jan 2010 09:32:18 +0000</pubDate>
		<dc:creator>RichieLiu</dc:creator>
				<category><![CDATA[JavaScript脚本]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[JS库]]></category>
		<category><![CDATA[前端]]></category>

		<guid isPermaLink="false">http://www.iamued.com/?p=1180</guid>
		<description><![CDATA[记得前几天看了D2的视频 kejun兄讲的库时代和框架时代 让我感同身受 因为我所做的项目用的是Jq库 不知不觉的一个个插件让页面的已经一大排了~ 所带来的另一个问题 是库的升级问题 公司目前的项目貌似有用jquery1.2.6的 有用jquery1.3.2的 还没有完全的更新到新版 这不是Jquery1.4又出来了么 看了一下新版的API还是不错的 New or Changed in 1.4 部分 点击查看 vfresh兄弟已经写了一个新版的概述 我就直接转载过来了 修改内容： .add() 支持 .add( selector, context ) 方式 以下增加支持处理function方式：.addClass() .after() .before() .append() .css() .html() .prepend() .removeAttr() .removeClass() .replaceWith() .text() .toggleClass() .val() .wrap() .wrapAll() .wrapInner() .bind() 支持批量绑定事件 .closest()支持第二个参数(筛选元素的容器)，优化效率。用法：.closest( selector, [ context ] ) .data() 支持批量设值 [...]]]></description>
			<content:encoded><![CDATA[<p>记得前几天看了D2的视频 <a href="http://hikejun.com">kejun</a>兄讲的库时代和框架时代 让我感同身受 因为我所做的项目用的是Jq库 不知不觉的一个个插件让页面的<script src=" "></script>已经一大排了~<br />
所带来的另一个问题 是库的升级问题 公司目前的项目貌似有用jquery1.2.6的 有用jquery1.3.2的 还没有完全的更新到新版<br />
这不是<a href="http://jquery14.com">Jquery1.4</a>又出来了么 看了一下新版的<a href="http://jquery14.com/pre-release-1/new-jquery-api-site">API</a>还是不错的 New or Changed in 1.4 部分 <a href="http://api.jquery.com/category/version/1.4/">点击查看</a></p>
<p><a href="http://www.vfresh.org/">vfresh</a>兄弟已经写了一个新版的概述 我就直接转载过来了<br />
<span id="more-1180"></span></p>
<h2>修改内容：</h2>
<ol>
<li><code>.add()</code> 支持 <code>.add( selector, context )</code> 方式</li>
<li>以下增加支持处理function方式：<code>.addClass()</code> .<code>after()</code> <code>.before()</code> <code>.append()</code> <code>.css()</code> <code>.html()</code> <code>.prepend()</code> <code>.removeAttr()</code> <code>.removeClass()</code> <code>.replaceWith()</code> <code>.text()</code> <code>.toggleClass()</code> <code>.val()</code> <code>.wrap()</code> <code>.wrapAll()</code> <code>.wrapInner()</code></li>
<li><code>.bind()</code> 支持批量绑定事件</li>
<li><code>.closest()</code>支持第二个参数(筛选元素的容器)，优化效率。用法：<code>.closest( selector, [ context ] )</code></li>
<li><code>.data()</code> 支持批量设值 <code>$('body').data({one: 1, two: 2});</code></li>
<li><code>.index()</code> 如果无参数，则返回在它兄弟级元素集合中的索引值；并支持使用选择器(selector)过滤</li>
<li><code>jQuery()</code> 如果无参数，会返回一个空的数组（旧版本返回document）<br />
用 <code>jQuery()</code> 创建DOM时，可以使用第二个参数来设置属性值、绑定事件 <a href="http://api.jquery.com/jQuery/#entry-examples">查看示例</a></li>
<li><code>.offset()</code> 新增功能可以直接设置元素相对于document的坐标，并支持function参数</li>
<li><code>jQuery.param()</code> 第二个参数(布尔值)，可以设定是否进行URI编码</li>
</ol>
<h2>新增内容：</h2>
<ol>
<li><code>.clearQueue()</code> 清除.queue()生成的队列，如无参数将清除fx中的队列；类似于.stop(true)</li>
<li><code>jQuery.contains()</code> 检测是元素否包含目标</li>
<pre class="brush: jscript; title: ; notranslate">
jQuery.contains(document.documentElement, document.body); // true
jQuery.contains(document.body, document.documentElement); // false
</pre>
<li><code>.delay()</code> 延迟执行队列</li>
<pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;style&gt;
div { width: 60px; height: 60px; float: left; }
.first { background-color: #3f3; }
.second { background-color: #33f;}
&lt;/style&gt;
  &lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;p&gt;&lt;button&gt;Run&lt;/button&gt;&lt;/p&gt;
&lt;div class=&quot;first&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;second&quot;&gt;&lt;/div&gt;

&lt;script&gt;
    $(&quot;button&quot;).click(function() {
      $(&quot;div.first&quot;).slideUp(300).delay(800).fadeIn(400);
      $(&quot;div.second&quot;).slideUp(300).fadeIn(400);
    });
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<li><code>.detach()</code> 返回从元素数组中移除的匹配元素。</li>
<li><code>.focusin()</code> 是.bind(‘focusin’, handler)的简写方式。</li>
<li><code>.focusout()</code> 是.bind(‘focusout’, handler)的简写方式。</li>
<li><code>.has()</code> 筛选出包含有指定元素的集合</li>
<pre class="brush: xml; title: ; notranslate">
&lt;div id=&quot;a&quot;&gt;&lt;strong&gt;这个会被选中&lt;/strong&gt;&lt;/div&gt;
	&lt;div id=&quot;b&quot;&gt;这个选不中&lt;/div&gt;
	&lt;script type=&quot;text/javascript&quot;&gt;
	$('div').has('strong').css('color','red');
	&lt;/script&gt;
</pre>
<li><code>jQuery.isEmptyObject()</code> 检测对象是否为空值</li>
<pre class="brush: xml; title: ; notranslate">
jQuery.isEmptyObject({}) // true
jQuery.isEmptyObject({ foo: &quot;bar&quot; }) // false
</pre>
<li><code>jQuery.isPlainObject( object )</code> 检测是否为pain object</li>
<pre class="brush: xml; title: ; notranslate">
jQuery.isPlainObject({});	//true
	jQuery.isPlainObject('{}');	//false
</pre>
<li><code>.nextUntil([ selector ])</code> 查找当前元素之后到selector(参数)之间的同辈元素</li>
<pre class="brush: xml; title: ; notranslate">
&lt;div id=&quot;a1&quot;&gt;3232323&lt;/div&gt;
&lt;div id=&quot;a&quot;&gt;&lt;strong&gt;这个会被选中&lt;/strong&gt;&lt;/div&gt;
&lt;div id=&quot;b&quot;&gt;这个选不中&lt;/div&gt;
&lt;div id=&quot;c&quot;&gt;ccc&lt;/div&gt;
&lt;div id=&quot;d&quot;&gt;ccc&lt;/div&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
$('#a').nextUntil('#d');	//取得[#b,#c]
&lt;/script&gt;
</pre>
<li><code>.prevUntil([ selector ])</code> 查找当前元素之前到selector(参数)之间的同辈元素</li>
<li><code>.parentsUntil( [ selector ] )</code> 取得一个包含着所有匹配元素的祖先元素（直到找到selector截止）的元素集合</li>
<li><code>jQuery.noop</code> 空函数，当想定义一个空函数时可以用这个。</li>
<li><code>.toArray()</code> 取得所有匹配的 DOM 元素集合，有点类似于.get()</li>
<li><code>.unwrap()</code> 移除匹配元素的父级</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.iamued.com/qianduan/1180.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>YUI3设计中的激进和妥协</title>
		<link>http://www.iamued.com/qianduan/1176.html</link>
		<comments>http://www.iamued.com/qianduan/1176.html#comments</comments>
		<pubDate>Wed, 13 Jan 2010 04:51:04 +0000</pubDate>
		<dc:creator>RichieLiu</dc:creator>
				<category><![CDATA[JavaScript脚本]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[JS库]]></category>
		<category><![CDATA[YUI]]></category>

		<guid isPermaLink="false">http://www.iamued.com/?p=1176</guid>
		<description><![CDATA[相信每个前端工程师都有自己喜爱的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，页面代码是这样的 这段代码通常写在页面的尾部，这段逻辑所伴随的html代码是埋藏在页面的某处，这时b要在页面中增加逻辑B，b的做法是首先找到尾部的这段代码，然后更改成如下模样： 同样，B逻辑所伴随的html代码也是埋藏在页面的某处，这样看来，js逻辑和其伴随的html代码如此分离，以至于到了删减功能的时候，往往删掉html却忘了删js，或者删掉js忘了删除html，在重用代码的时候也会是个麻烦。同样，在调试的时候，工程师也要打开两个窗口分别关注js和html，即使这两段代码在同一个文件当中。如此则不如把代码写成这样： 这种coding写法正是yui所提倡的，也就是所谓的沙箱，每个逻辑包含在一个沙箱中，各司其则互不干扰。当第三者浏览代码的时候也立即明白这就是一个独立的功能块，包含典型的html结构和启动逻辑的js，要重用，整块拷走即可。 4，代码污染 or 沙箱 刚才提到的沙箱可以解决一部分代码污染的问题，新人阅读代码不用再看着乱码般的源码，“瞻前顾后”小心翼翼的寻找html和js的对应关系。但这种写法也存在隐患，现在的前端开发越来越复杂也更多的使用分层，比如底层使用yui，中间层是自定义的工具库，或者再加一个项目的widget组件库，写页面逻辑则是基于这些库进行开发。这样的话，每段逻辑可能写成这个样子： 尽管我们可以约定，将项目用到的所有的组件都统一加载进页面中，但当组件越来越多的时候，就出现了上文所说的一步到位和颗粒化之间的矛盾，当每个控件单独占用一个js文件和与之相伴随的css皮肤，一个相对复杂的逻辑就变成了上文所说的手动引入js文件，并随之引入一些显而易见的弊端： 首先，手写大量的js文件会各自占用单独的http请求，在者，这个场景中，slider.js继承自tabview.js，因此要着重关注他们的顺序，第三，如果别人在页面的其他地方也使用了日历或者幻灯，还要再加两个相同的js标签？其实，说到这里，我们已经可以隐约看到大项目团队开发的影子了，在一个迭代及其频繁的项目中，开发者需要在短的时间内完成一个复杂页面的某个功能的开发，而且不能影响到页面的其他功能，毕竟，每添加一个功能，QA mm们都要将与之牵连的所有功能都要回归，可辛苦了我们的QA mm们。在这种情况下，一个功能的开发可能和同一个页面其他功能的开发相互并行。互相不属于同一个项目组，也不知晓对方的实现。这种模式则是我们经常遇到的多人开发，冲突也大都由此产生，每个功能单独看来是正确的，合并到一起会产生冲突和bug，这时调试bug则需要两个工程师同时进行，很麻烦。甚者，当组件升级了，比如，tabview.js再继承自tab.js，则又要去联系各个工程师，将每个引用tabview.js的地方之前再加上一个tab.js，很麻烦。我们说，这种多人协作模式所带来的冲突也是代码污染的一种，因为每个人只能掌控类似tms区块那么巴掌大的地方，所组成的最终页面是什么样，都不知道。更何况，这种生猛的引用js，也会阻塞页面加载，占用http请求，影响性能。 鉴于此，yui将js的动态引入机制也并入其沙箱设计之中，我要引用的只是一个名字，比如slider.js，他依赖tabview.js，tabview.js依赖tab.js，这样我只需引用一个名叫”slider”的东西即可，不用操心他依赖什么，更不用管如何引入到页面中，yui都帮我们搞定： 当我们看最终组成的页面的时候，看到的只是埋藏在页面各个角落的这些简短的结构一致的js代码段。很易理解，这点代码也不用像长的代码块压成一行。（更多细节可参照 前端弱架构导致的代码污染 ） 5，颗粒化 or http请求数 这的确是一对矛盾，颗粒化带来了项目开发、管理、和代码重用的高效率，却又引入了更多的http请求数，好在yui提供了combo，可以将所有的http请求合并成一个。只需在YUI引入的时候配置下combo属性即可，高颗粒化的请求数瞬间降低一倍以上。在之前做雅虎关系的时候，在yui2和yui3pre并存的情况下，可以将请求降低到4个，yui2和3各一个种子，各自一个combo。当然这是在hack掉yui的loader的前提下。yui默认不会合并非yui文件（更多细节可以阅读基于yui的团队开发）。即使这样，我们仍然可以控制我们的http请求数，在不hack yui的情况下，可以解决部分性能问题。 6，懒惰加载 or 即时加载即时执行 上文提到，逻辑依赖沙箱，沙箱依赖的js文件则是延时加载的，这样就导致一个问题，当页面比较庞大的时候，会等待页面js加载完毕才会渲染动作，这样的用户体验不佳，而即时加载即使运行则可以渲染出模块后随即渲染动作，当网速一定的时候，两者看似是一对不可调和的矛盾，yui 动态加载的机制比较折中的处理了这个问题，A逻辑需要a.js，B逻辑需要b.js，A逻辑则只会在a.js加载完成后执行，而不管b.js是否加载完成，而当A需要a.js和b.js的时候，A则需要等待a.js和b.js都加载完成才会执行，B逻辑只需判断当前是否已经加载b.js，如果b.js已经在其他模块中引入进来，B则可以立即执行。但确定的是，所有的js的引入一定是在domReady后执行的，也就是说，不管怎样，动作的渲染一定是在页面html结构出来后才开始执行的，用户体验上还是会有损失。 7，面向接口的设计 or 面向dom的设计 我们知道jquery的插件习惯将所有的动作都加载到一个$(‘#id’)上，使用的时候只要执行类似$(‘#id’).init()即可。这看起来简洁明快，开发者的逻辑的思路也始终没有离开“节点”，很方便理解，而对yui3 的node扩展就不那么方便，从yui3的pre版到正式版，对node扩展的方法在不断的修改（更多细节看这里：扩展yui3 node的定时器），这也可以看出yui设计者在对node扩展性设计时的纠结和苦恼：要不要允许开发者去扩展node节点呢？大概是因为设计者们对prototype先天的弊端心有余悸。目前看来，设计者还没有完全走出纠结，尽管对node扩展相比yui3第一个预览版方便了很多，开发者仍然不能像写jquery插件那样优雅自如的对node进行扩展。相反，zakas却将更多的精力放在了widget接口的设计上，在这一点上，相比jquery，yui3则具有无可限量的优越性，因为在yui3中，组件不仅仅是组件，而是一个有血有肉的生命体，他可以出生，可以成长，可以被改造，可以死亡，组件在这些复杂的运行时环境中自我锤炼，因此，一个复杂页面在yui3的技术体系中，变成了一个由无数组件链接而成的生态系统，这种生物链所带来的设计创新和新视野是其他js框架无论如何也无法超越的。关于yui3的组件开发更多细节可以参照：基于yui3的组件开发1 和 克军在D2上的分享《从yui2到yui3看前端的演变》 8，苗条的身材 or 庞大的身躯 说到这里，大概会有很多人拍砖。其实jquery和yui同属两类不同的js框架，一个苗条纤细，一个身重如山，两者之间其实没有什么水深火热，只是使用范围不同罢了，类似jquery的轻框架的使用范围是博客级别的小网站，尤其适合单人开发，代码写一次不再修改，而且很适合初学者学习使用，给初学者带来自信。yui则使用与企业级的项目中的团队开发，项目维护周期远远超过开发周期，因此yui性能一定比不过jquery，jquery的续航能力也一定不如yui，没有最优秀，只有最适合。当然这自然也挡不住我个人对迷人的jquery的喜爱，只要我们能从各个js框架学到东西，能提高自己做前端架构的能力，就ok。 说了这么多，其实只有一个观点，人无完人，框架无完框架，缺憾之处必有权衡。以上YY，欢迎拍砖！ 原文：http://ued.taobao.com/blog/2010/01/11/yui3%e8%ae%be%e8%ae%a1%e4%b8%ad%e7%9a%84%e6%bf%80%e8%bf%9b%e5%92%8c%e5%a6%a5%e5%8d%8f/]]></description>
			<content:encoded><![CDATA[<p>相信每个前端工程师都有自己喜爱的javascript框架，说情感也好，道信仰也罢，javascript框架带给人的不仅仅是便捷的开发，更有一种纯粹的逻辑美感，不管是jquery曼妙的简洁，还是yui魔术般的沙箱，都使我们产生无穷的想象。然而，js框架却又必然无法做到面面俱到的完美无瑕，比如jquery在OO方面做出的让步，以及yui在性能上做的牺牲，无不给人传达一种缺憾美、一种理想的现实主义。今天，我们来看看yui3在框架设计中的这些牺牲和让步，以便让我们更加深刻的理解yui3的全貌，并将其优势发挥至最佳。</p>
<p><strong>1，种子的一步到位 or 颗粒化</strong><br />
所谓种子一步到位是指只要在页面引入一个种子文件的script标签，比如prototype和jquery，只要引入一个prototype.js或jquery.js就可以了，他们将各自对dom操作和event的封装等等都囊括进一个文件中，并尽力将其做到最小，这样做的好处是显而易见的，使用框架非常简单。然而yui将这些功能做了级别划分和颗粒化设计，从概念上抽象出来“核心”、“工具”和“组件”，每个小功能放在一个文件当中，需要的时候则要自行去引用，yui文档中给出的大量demo都采用这种方法，这种设计显然不像jquery那样对初学者友好，而且使用起来不够傻瓜，为了实现一个小功能，甚至要引入三四个js文件。yui这样做的原因有两个，一是yui实在太大，把所有功能都搞进一个文件中确实有点不靠谱，二是为其动态加载的框架设计做铺垫。<br />
<span id="more-1176"></span><br />
<strong><br />
2，手动引入 or 动态加载</strong><br />
往页面中写js的传统方法是，直接将js文件作为script标签路径写在页面中，使用yui也可以这样引入页面，但yui更推荐使用loader进行动态加载。动态加载脚本的渊源很复杂，目前来看主要原因有三，其一，页面中手写js标签无论如何都会占用一个http请求，即使这个请求是一个304，动态加载的文件缓存后则不必发起真实的http请求，其二，动态加载可以实现按需加载，而且可以根据js文件之间的依赖进行去重和排序，手写标签加载js文件则必须让开发者去额外关注一下文件的排序、重复等等，其三，动态加载有利于页面代码的语义化，这使得开发者只关心“需要什么”，而不用去在意“如何得到”。当项目变得越发臃肿，维护成本越来越高的时候，这中小技巧会有不小的好处的。</p>
<p><strong>3，逻辑启动的单一入口 or 沙箱</strong><br />
我们在页面中启动一个js逻辑通常是放在一个类似onDomReady的方法中，如果页面中存在多个逻辑的时候怎么办呢？比如，a实现了逻辑A，页面代码是这样的</p>
<pre class="brush: jscript; title: ; notranslate">
&lt;script src=”logicA.js” /&gt;
&lt;script&gt;
$.onDomReady(function(){
   LogicA.start();
});
&lt;/script&gt;
</pre>
<p>这段代码通常写在页面的尾部，这段逻辑所伴随的html代码是埋藏在页面的某处，这时b要在页面中增加逻辑B，b的做法是首先找到尾部的这段代码，然后更改成如下模样：</p>
<pre class="brush: jscript; title: ; notranslate">
&lt;script src=”logicA.js” /&gt;
&lt;script src=”logicB.js” /&gt;
&lt;script&gt;
$.onDomReady(function(){
   LogicA.start();
   LogicB.start();
});
&lt;/script&gt;
</pre>
<p>同样，B逻辑所伴随的html代码也是埋藏在页面的某处，这样看来，js逻辑和其伴随的html代码如此分离，以至于到了删减功能的时候，往往删掉html却忘了删js，或者删掉js忘了删除html，在重用代码的时候也会是个麻烦。同样，在调试的时候，工程师也要打开两个窗口分别关注js和html，即使这两段代码在同一个文件当中。如此则不如把代码写成这样：</p>
<pre class="brush: jscript; title: ; notranslate">
&lt;!–A逻辑的html代码段–&gt;
&lt;script src=”logicA.js” /&gt;
&lt;script&gt;
$.onDomReady(function(){
___LogicA.start();
});
&lt;/script&gt;

…

&lt;!–B逻辑的html代码段–&gt;
&lt;script src=”logicB.js” /&gt;
&lt;script&gt;
$.onDomReady(function(){
   LogicB.start();
});
&lt;/script&gt;
</pre>
<p>这种coding写法正是yui所提倡的，也就是所谓的沙箱，每个逻辑包含在一个沙箱中，各司其则互不干扰。当第三者浏览代码的时候也立即明白这就是一个独立的功能块，包含典型的html结构和启动逻辑的js，要重用，整块拷走即可。</p>
<p><strong>4，代码污染 or 沙箱</strong><br />
刚才提到的沙箱可以解决一部分代码污染的问题，新人阅读代码不用再看着乱码般的源码，“瞻前顾后”小心翼翼的寻找html和js的对应关系。但这种写法也存在隐患，现在的前端开发越来越复杂也更多的使用分层，比如底层使用yui，中间层是自定义的工具库，或者再加一个项目的widget组件库，写页面逻辑则是基于这些库进行开发。这样的话，每段逻辑可能写成这个样子：</p>
<pre class="brush: jscript; title: ; notranslate">
&lt;!–A逻辑的html代码段–&gt;
&lt;script src=”widget.js” /&gt;&lt;!–项目的widget库–&gt;
&lt;script src=”logicA.js” /&gt;
&lt;script&gt;
$.onDomReady(function(){
   LogicA.start();
});
&lt;/script&gt;
</pre>
<p>尽管我们可以约定，将项目用到的所有的组件都统一加载进页面中，但当组件越来越多的时候，就出现了上文所说的一步到位和颗粒化之间的矛盾，当每个控件单独占用一个js文件和与之相伴随的css皮肤，一个相对复杂的逻辑就变成了上文所说的手动引入js文件，并随之引入一些显而易见的弊端：</p>
<pre class="brush: jscript; title: ; notranslate">
&lt;!–复杂的A逻辑的html代码段，使用了日历，弹层，幻灯–&gt;
&lt;script src=”calendar.js” /&gt;&lt;!–日历–&gt;
&lt;script src=”box.js” /&gt;&lt;!–弹层–&gt;
&lt;script src=”tabview.js” /&gt;&lt;!–幻灯原型–&gt;
&lt;script src=”slider.js” /&gt;&lt;!–幻灯–&gt;
&lt;script src=”logicA.js” /&gt;
&lt;script&gt;
$.onDomReady(function(){
   LogicA.start();
});
&lt;/script&gt;
</pre>
<p>首先，手写大量的js文件会各自占用单独的http请求，在者，这个场景中，slider.js继承自tabview.js，因此要着重关注他们的顺序，第三，如果别人在页面的其他地方也使用了日历或者幻灯，还要再加两个相同的js标签？其实，说到这里，我们已经可以隐约看到大项目团队开发的影子了，在一个迭代及其频繁的项目中，开发者需要在短的时间内完成一个复杂页面的某个功能的开发，而且不能影响到页面的其他功能，毕竟，每添加一个功能，QA mm们都要将与之牵连的所有功能都要回归，可辛苦了我们的QA mm们。在这种情况下，一个功能的开发可能和同一个页面其他功能的开发相互并行。互相不属于同一个项目组，也不知晓对方的实现。这种模式则是我们经常遇到的多人开发，冲突也大都由此产生，每个功能单独看来是正确的，合并到一起会产生冲突和bug，这时调试bug则需要两个工程师同时进行，很麻烦。甚者，当组件升级了，比如，tabview.js再继承自tab.js，则又要去联系各个工程师，将每个引用tabview.js的地方之前再加上一个tab.js，很麻烦。我们说，这种多人协作模式所带来的冲突也是代码污染的一种，因为每个人只能掌控类似tms区块那么巴掌大的地方，所组成的最终页面是什么样，都不知道。更何况，这种生猛的引用js，也会阻塞页面加载，占用http请求，影响性能。</p>
<p>鉴于此，yui将js的动态引入机制也并入其沙箱设计之中，我要引用的只是一个名字，比如slider.js，他依赖tabview.js，tabview.js依赖tab.js，这样我只需引用一个名叫”slider”的东西即可，不用操心他依赖什么，更不用管如何引入到页面中，yui都帮我们搞定：</p>
<pre class="brush: jscript; title: ; notranslate">
&lt;script&gt;
TB.addmoudle({
   logicA:{
      fullpath:’logica.js’,
      requires:['slider']
   }
}).use(‘logicA’,function(Y){
   LogicA.start();
});
&lt;/script&gt;
</pre>
<p>当我们看最终组成的页面的时候，看到的只是埋藏在页面各个角落的这些简短的结构一致的js代码段。很易理解，这点代码也不用像长的代码块压成一行。（更多细节可参照 <a href="http://uedmagazine.com:86/ued/comments.php?y=09&amp;m=09&amp;entry=entry090905-051322">前端弱架构导致的代码污染</a> ）</p>
<p><strong>5，颗粒化 or http请求数</strong><br />
这的确是一对矛盾，颗粒化带来了项目开发、管理、和代码重用的高效率，却又引入了更多的http请求数，好在yui提供了combo，可以将所有的http请求合并成一个。只需在YUI引入的时候配置下combo属性即可，高颗粒化的请求数瞬间降低一倍以上。在之前做雅虎关系的时候，在yui2和yui3pre并存的情况下，可以将请求降低到4个，yui2和3各一个种子，各自一个combo。当然这是在hack掉yui的loader的前提下。yui默认不会合并非yui文件（更多细节可以阅读<a href="http://uedmagazine.com:86/ued/comments.php?y=09&amp;m=06&amp;entry=entry090612-094816">基于yui的团队开发</a>）。即使这样，我们仍然可以控制我们的http请求数，在不hack yui的情况下，可以解决部分性能问题。</p>
<p><strong>6，懒惰加载 or 即时加载即时执行</strong><br />
上文提到，逻辑依赖沙箱，沙箱依赖的js文件则是延时加载的，这样就导致一个问题，当页面比较庞大的时候，会等待页面js加载完毕才会渲染动作，这样的用户体验不佳，而即时加载即使运行则可以渲染出模块后随即渲染动作，当网速一定的时候，两者看似是一对不可调和的矛盾，yui 动态加载的机制比较折中的处理了这个问题，A逻辑需要a.js，B逻辑需要b.js，A逻辑则只会在a.js加载完成后执行，而不管b.js是否加载完成，而当A需要a.js和b.js的时候，A则需要等待a.js和b.js都加载完成才会执行，B逻辑只需判断当前是否已经加载b.js，如果b.js已经在其他模块中引入进来，B则可以立即执行。但确定的是，所有的js的引入一定是在domReady后执行的，也就是说，不管怎样，动作的渲染一定是在页面html结构出来后才开始执行的，用户体验上还是会有损失。</p>
<p><strong>7，面向接口的设计 or 面向dom的设计</strong><br />
我们知道jquery的插件习惯将所有的动作都加载到一个$(‘#id’)上，使用的时候只要执行类似$(‘#id’).init()即可。这看起来简洁明快，开发者的逻辑的思路也始终没有离开“节点”，很方便理解，而对yui3 的node扩展就不那么方便，从yui3的pre版到正式版，对node扩展的方法在不断的修改（更多细节看这里：<a href="http://uedmagazine.com:86/ued/comments.php?y=09&amp;m=09&amp;entry=entry090919-054842">扩展yui3 node的定时器</a>），这也可以看出yui设计者在对node扩展性设计时的纠结和苦恼：要不要允许开发者去扩展node节点呢？大概是因为设计者们对prototype先天的弊端心有余悸。目前看来，设计者还没有完全走出纠结，尽管对node扩展相比yui3第一个预览版方便了很多，开发者仍然不能像写jquery插件那样优雅自如的对node进行扩展。相反，zakas却将更多的精力放在了widget接口的设计上，在这一点上，相比jquery，yui3则具有无可限量的优越性，因为在yui3中，组件不仅仅是组件，而是一个有血有肉的生命体，他可以出生，可以成长，可以被改造，可以死亡，组件在这些复杂的运行时环境中自我锤炼，因此，一个复杂页面在yui3的技术体系中，变成了一个由无数组件链接而成的生态系统，这种生物链所带来的设计创新和新视野是其他js框架无论如何也无法超越的。关于yui3的组件开发更多细节可以参照：<a href="http://ued.taobao.com/blog/2009/12/16/yui/">基于yui3的组件开发1</a> 和 <a href="http://hikejun.com/blog/?p=503">克军在D2上的分享《从yui2到yui3看前端的演变》</a></p>
<p><strong>8，苗条的身材 or 庞大的身躯</strong><br />
说到这里，大概会有很多人拍砖。其实jquery和yui同属两类不同的js框架，一个苗条纤细，一个身重如山，两者之间其实没有什么水深火热，只是使用范围不同罢了，类似jquery的轻框架的使用范围是博客级别的小网站，尤其适合单人开发，代码写一次不再修改，而且很适合初学者学习使用，给初学者带来自信。yui则使用与企业级的项目中的团队开发，项目维护周期远远超过开发周期，因此yui性能一定比不过jquery，jquery的续航能力也一定不如yui，没有最优秀，只有最适合。当然这自然也挡不住我个人对迷人的jquery的喜爱，只要我们能从各个js框架学到东西，能提高自己做前端架构的能力，就ok。</p>
<p>说了这么多，其实只有一个观点，人无完人，框架无完框架，缺憾之处必有权衡。以上YY，欢迎拍砖！</p>
<p>原文：<a href="http://ued.taobao.com/blog/2010/01/11/yui3%e8%ae%be%e8%ae%a1%e4%b8%ad%e7%9a%84%e6%bf%80%e8%bf%9b%e5%92%8c%e5%a6%a5%e5%8d%8f/">http://ued.taobao.com/blog/2010/01/11/yui3%e8%ae%be%e8%ae%a1%e4%b8%ad%e7%9a%84%e6%bf%80%e8%bf%9b%e5%92%8c%e5%a6%a5%e5%8d%8f/</a></p>
<p><!-- .entry-content --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iamued.com/qianduan/1176.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

