也谈谈前端,架构,框架与库

2010年03月15日

今天裕波发了一链接给我是周爱民老师在淘宝做的一个分享的视频:“前端,架构,框架与库” (http://v.youku.com/v_playlist/f4262628o1p0.html)又看了淘宝玉伯的感想(http://lifesinger.org/blog/2010/03/thinking-of-architecture/)。看的我也想说两句。

无论是大公司还是小公司,创业公司还是成熟公司的前端开发都需要一个“架构师”的角色。理由很简单就是我在这些公司都呆过。但大家对“前端架构师”的理解,我怎么听都觉得太高深了,太玄了,像普通的前端工程师,产品经理,设计师一样它是一个很具体的工作,具体到每天应该做什么都可以列出来。另外它并不深,甚至说看起来简单。

前端架构师的工作:
1. 他需要制订一套跟上下游环节更高效配合的技术方案。具体说有改进模板(视图层)的开发方式,团队内部开发方式,维护和测试方式等。

2. 他要把关各种技术的实施方案。哪种好,哪种有风险,哪种还不成熟,哪种成本高。需要“把握问题的关键,平衡设计”的能力。

3. 他要主动联合相关部门,从性能、易用性、安全性等方面提升产品的价值和竞争力。

4. 他要正确选择适合产品的框架和库(或设计这样的框架和库),建立建全规范体系。保证代码风格的一致性(解决开发效率的问题)。

5. 他要有前瞻性。引入先进的前端技术落地到具体的产品中。

6. 他要负责团队成员的甄选。

7. 他要能做PPT,向高层布道。

大致就想到这些。可见,干这个怎么也要方方面面知道的多,技术的理解准确,直觉(经验丰富),有一堆成形的或实践过的理论和方法论(我虽然鄙视理论高手,但干这个比须是理论高手),沟通能力强,有资历(有一定的个人影响力)。一下子就想成为前端架构师不是说技术上有多难,而是缺失经验累积的过程,这让你缺少某种敏感性和直觉,对技术的理解也不能真正准确。所以这基本上是老帮菜,老油子们干的事。

框架本质上就是为解决各种问题提供的一套可复用的模式。像具体的应用开发框架、模板框架、组件框架、类模板,模式库等。我们在做任何项目时,不用想先拽过来,再按照它提供的线索一块一块填上具体的内容。而库是指一堆可复用的具体功能的集合。二者区别显而易见,侧重亦完全不同。现在市面上各种库的讨论和介绍都很多,框架则很少。框架很容易被混淆在语言的设计模式里,我认为这不是重点。我在豆瓣正尝试通过一个很轻量的框架,组织现有的javascript开发,日后有机会再做详细分享。它可以灵活置换核心库,和组织各种库及组件的应用。我认为这是框架该干的最主要的事。当然,框架可以扩展出很多种,凡事事先有个框架框一框,可以更高效的产出结果。

最后再次强调前端架构是有很具体的和丰富的内容的,它正成为整个公司技术架构的重要一环。希望在下次D2或其他前端技术交流中,看到更多更具体的前端架构的分享和交流。

2009年前端技术领域回顾

2010年02月8日
在过去的2009年,如果你关注前端技术发展动态的话,可能会积累一大堆信息,有的保存在书签里,有的在推特上,有的在你的博客里。整理整理挺有意思,当初看到那些文章那些事儿的小小兴奋,又会油然而生。或许,经过一年的沉淀,再次回顾会有新的思考和启发吧。

Javascript开源库/框架

09年,Javascript框架发展到了成熟期,几个老牌库都发布了新版本:
2月 - jQuery 1.3.2发布,YUI 2.7.0发布
9月 - Prototype 1.6.1发布,YUI 2.8.0发布,YUI 3.0.0 GA发布
10月 - Script.aculo.us 1.8.3发布,MooTools 1.2.4发布
12月 - Dojo 1.4发布,jQuery 1.4 alpha 1发布
随着Javascript库越来越成熟,库的自身发展也面临难以突破的瓶颈。大多只是继续修复bug,兼容新版的浏览器,提升性能,功能的增加变得越来越有限。这里面变化最大的要算YUI 3,和传统的库不同YUI 3更注重前端开发的组织和结构。这种框架思想的转变,也许是未来发展的方向。基于开源Javascript库的开发模式已经被普遍接受,所以09年很少再出现像jQuery、YUI这样的公用库,但是越来越多的专用库纷纷出现,像图形处理和3D的库,如
GLGE(http://www.glge.org, 一个WebGL库)、Raphaël(http://raphaeljs.com,一个跨浏览器操作SVG的库)、SVG Web(http://code.google.com/p/svgweb,一个提供SVG跨浏览器支持的库)等。像手机应用方面的库,如PhoneGap(http://phonegap.com)、jQTouch(http://www.jqtouch.com)等。
1月,白宫网站(http://www.whitehouse.gov)改版,使用开源的jQuery库,华丽的交互效果,成为史上最酷的政府网站。
7月,BBC开源了内部的库Glow(http://www.bbc.co.uk/glow/),很像jQuery的库,向后兼容IE5.5。发布后立刻遭到jQuery作者John Resig的猛烈批评。
11月,Google也开源了内部的库Closure Library(http://code.google.com/closure/library)。虽然随后陆续有人批评它的代码细节有不少低效的地方,但丝毫不影响它是一个功能强大的库,而且在库的模块化设计方面很有特点。

浏览器

新的浏览器大战实际上成了Javascript引擎大战。从08年Chrome的V8挑起“事端”开始,09年各个浏览器厂商纷纷换新的引擎。6月,Firefox3.5携新的Javascript引擎TraceMonkey发布,同期Safari4.0.1正式版发布,引擎换成Nitro。12月,Opera10.5 alpha版发布,引擎换成Carakan。纷纷叫板V8。作为前端开发者还是很乐意看到这么激烈的竞争场面。相反,09年初众人瞩目的IE8发布,全面兼容CSS2.1,在标准支持方面进步不少。但仍对HTML5、CSS3、Canvas紧闭大门。IE6的市场占有率虽然持续下滑,但仍占据很高的比例,越来越成为前端开发的障碍。Facebook、Youtube和Twitter等热门网站相继抛弃对IE6的支持,提示用户升级浏览器。

Web标准

7月,W3C终止XHTML2.0的工作,转向HTML5。HTML5并不是一套完全不同的标准,而是在HTML的基础上扩展了更多有用的标签,如video、audio等,同时增加新的离线存储、跨文档通讯等机制,这些都有利于开发更强大的Web应用,所以受到广大开发者和浏览器厂商的青睐。虽然HTML5的草案还在制订中,但几乎所有最新的浏览器都有不同程度的支持,IE8也开始支持跨文档通讯。2010年HTML5势必还会有更大的发展,围绕它的话题不会中断。
12月,ECMA-262正式命名为ECMAScript,ECMAScript第5版标准几乎全票通过。

热门话题

1.网站性能优化的讨论进一步深入。之前只是讨论如何让页面下载更快,09年讨论的话题已经延伸到页面的渲染速度、图片无损优化技术、Ajax性能、CSS选择器性能,Javascript执行速度、手机性能优化等。Steve Souders的新书《更快的网站》(Even Faster Web Sites)很有代表性。09年出现很多很好很强大的网站性能优化方面的工具,像MySpace的MSFast、Aol的WebPageTest、微软的Doloto、雅虎的YSlow2.0、Google的PageSpeed、Speed Tracer、dynaTrace等。另外,使用dataURI实现内联图片的技术是前端性能优化的一个突破。

2.由于HTML5和CSS3不同浏览器支持的程度不同,相应的出现了各种兼容的技术。这个网站统计了目前浏览器支持的情况:http://a.deveria.com/caniuse。针对浏览器的这种现状,向前兼容同时向后优雅退化的理念被提出。针对不同浏览器有不同的设计方案,像针对Firefox、Safari、Chrome、Opera可以基于CSS3设计网站的UI,对于IE6设计一版可以接受的退化方案。这样可以引导用户逐渐放弃低端浏览器。

3.服务器端的Javascript前两年也讨论过,但只是实验性质的,并没有突出的优势。09年JSConf欧洲大会爆料的Node.js不同,它很好的利用了Google的高速引擎V8,可以实现一个非堵塞的事件驱动的Web Server,具有很高的性能。很适合做像comet这种长链接应用的服务器端。对于前端开发者来说,只是Javascript加上一组服务器端操作的API库,所以很容易掌握。也许2010年可以看到更多基于Node.js开发的应用。

4.Javascript开发越复杂,就越需要借鉴传统语言的更严谨的开发方式。于是Javascript单元测试的讨论频频出现在09年一些技术大会上,如:

Ron Adams在YUIConf2009大会上的主题:Automated Integration Testing with YUITest, Selenium and Hudson

http://yuilibrary.com/yuiconf2009/#yuitest
John Resig在雅虎所做的演讲:Testing, Performance Analysis, and jQuery 1.4
http://developer.yahoo.com/yui/theater/video.php?v=resig-testing
Jason Huggins在JSconf2009上的主题:Hacking Selenium
http://www.slideshare.net/hugs/hacking-selenium-jsconf
老牌Javascript单元测试框架JSUnit太老了,目前流行用jQuery的Qunit或YUI的YUITest。同时再结合Selenium实现自动化的Javascript单元测试是目前比较好的方案。我之前也也过一篇文章:命令行方式执行YUITest单元测试(http://hikejun.com/blog/?p=499

5.Google在9月发布一款插件-Chrome Frame。IE安装这个插件后,基本上就等于切换到Chrome了,这样IE就可以支持Chrome所支持的HTML5、CSS3、Canvas等标准。Chrome Frame的开发者是Alex Russell,他也是著名框架Dojo的作者。Chrome Frame的出现对IE是一个不大不小的冲击。

6.Palm Pre 6月份正式发售好评如潮。它使用的操作系统是WebOS。WebOS上的应用完全是用Html、CSS和Javascript开发的,这给前端开发者提供了更大的空间。9月,著名前端技术网站Ajaxian的创始人、Bespin的开发者Ben Galbraith和Dion Almaer加入Palm,我相信会进一步推动WebOS的发展。

7.前端大牛PPK09年做了大量手机浏览器的兼容性测试。详细见:http://quirksmode.org/m/table.html。随着3G的普及手机开发注定会成为热门技术,09年无论国内国外iPhone应用开发和Android应用开发都很热,但随着手机浏览器越来越强大,会不会重蹈N年前Web2.0和桌面软件的覆辙呢。无论怎样前端开始向更多元化的终端延展,这对前端开发者是件好事。

前端会议

09年给我留下深刻印象的一些技术会议:
2009/3/18-20,Mix09
官网:http://visitmix.com
视频资料:http://videos.visitmix.com/MIX09
2009/4/24-25,JSConf 2009
官网:http://jsconf.us/2009
2009/11/7-8,JSConf(柏林) 2009
官网及会议资料:http://jsconf.eu/2009
2009/6/22-24,Velocity 2009
官网:http://en.oreilly.com/velocity2009
2009/9/14-16,Ajax Experience 2009
官网:http://ajaxexperience.techtarget.com/conference/index.html
会议资料: http://www.slideshare.net/ajaxexperience2009/slideshows
2009/10/28-29,YUIConf 2009
官网:http://yuilibrary.com/yuiconf2009/
2009/11/20,FullFrontal 2009
官网:http://2009.full-frontal.org/
2009/12/19,第四届D2前端技术论坛
官网:http://www.d2forum.org/d2/4/

09年前端领域着实涌现不少令人惊喜的技术和事件,对于前端开发者来说要不断更新自己的知识否则很快就Out了。同时,也可以看出前端技术的发展那是相当的快。2010年这种发展势头不会减缓,期待经历更精彩的一年!

我会随时把我的所见所闻分享在我的推特上-@kejunz,敬请关注。

Zakas解答Baranovskiy的JavaScript小测试

2010年01月27日

Zakas 1/22在twitter上分享了Baranovskiy的一篇文章“So, you think you know JavaScript?”(你认为你够了解javascript吗)标题很叫板。结果5小段代码做的稀里哗啦。

今天Zakas专门撰文解答了这几道题(http://www.nczonline.net/blog/2010/01/26/answering-baranovskiys-javascript-quiz/)。不愧是大师,很深刻。

第1题: 是否真的理解声明变量
if (!(”a” in window)) {
var a = 1;
}
alert(a);

知识点:一是变量声明和初始化是分开的。二是Javascript引擎仅仅是把变量的声明提到当前scope的最前面解释。三是所有全局变量都是window对象的成员。所以这段代码实际是:
var a;
if (!(”a” in window)) {
a = 1;
}
alert(a);
答案就很清楚了-‘undefined’。

第2题:是否真的理解声明function
var a = 1,
b = function a(x) {
x && a(–x);
};
alert(a);
声明function只有两种一种是: function声明
function a (x) {
// do something.
}

另一种是: function表达式
var a = function (x) {
// do something.
}

function声明必须有方法名,而出现在表达式里的方法名都会被忽略。第二种function表达式就是一种赋值表达式,里面的方法名将被忽略。原文回复中提到的这篇文章(http://yura.thinkweb2.com/named-function-expressions/)写的很详细。

第3题:是否理解function声明的优先级
function a(x) {
return x * 2;
}
var a;
alert(a);
function声明会覆盖掉同名的变量声明,无论变量声明在前还是在后。但当变量赋值后,function就无效了。如:
var a = 1;
function a(x) {
return x * 2;
}
alert(a); //结果是 1

第4题:考是否理解参数对象
function b(x, y, a) {
arguments[2] = 10;
alert(a);
}
b(1, 2, 3);
答案是10。arguments相当于对应x, y, a建立的副本,Javascript引擎实现它们对应的值同步。所以arguments[2]的值变化了,a也随之变化。

第5题:是否真的理解call方法
function a() {
alert(this);
}
a.call(null);
ECMA262第3版标准里有明确说明:
“If thisArg is null or undefined, the called function is passed the global object as the this value. Otherwise, the called function is passed ToObject(thisArg) as the this value.”
可见,如果call的第一个参数是null或undefined,被调用的function将被传入全局对像作为this。全局对象就是window对象。所以,这道题的答案就很清楚了。

Zakas的原文更详细,我只是用更直白的话解读了一下。建议看原文。

前端创新思考(二)

2010年01月10日

今天连着看了两个视频。一个是“扩展现实”技术(出自这里)。

“大家看得像神一樣的某項硬體功能,在成本上不過是幾塊錢、甚至幾毛錢美金的東西;但只要能跟軟體搭配流暢、能引發全新的應用模式,就是好東西。” -Fred

制造业中软件和硬件的完美结合,即在相同的核心技术下会创新出各种惊人的产品,像苹果的iphone、air、magic mouse到马上露面的tablet,其核心不都是multi-touch吗。这些创新产品其实都是同一种技术的不同应用模式。放到互联网行业里,就是前端创新。底层技术再如何牛逼,用户接触不到,一定要通过前端的各种应用模式让用户用到。

所谓应用模式大到一个产品模式,小到一个功能。像twitter就是典型的产品模式创新。产品级别的事我们说了不算,那就在产品细节的应用模式上挖掘吧。前两天看到的youtube链接暗藏的功能,让我一惊,链接还能玩出这么多的花样。比如,我想告诉我的朋友这个视频2分18秒开始很精彩,就可以直接发这样的链接给他:http://www.youtube.com/watch?v=-Tdk60viEzA#t=2m18

另一个是“第六感”装置(出自这里)。当手机追求越来越小,笔记本追求越来越薄的时候,这个印度人只是通过一个摄像头和一个麦克风就可以把一张纸变成一个笔记本。他的创新不是硬件的创新,而是从人的日常生活出发,把现实生活的信息导入到虚拟的网络中,再将处理结果带回到现实生活中。按他说的硬件成本只有300美元,主要是硬件上的软件系统是最厉害的,这项技术足以让他成为最富有的人,但他准备开源。

他的创新是典型天才型的。突破传统模式的条条框框,巧妙的寻找出一条全新的途径。像这个视频前面表达的,为了获取信息,人们是不得以坐到电脑前的。他创新的灵感是源于如何更human。前端工作的创新也一样,应该源于如何让交互跟人性化,让展现更人性化,其它都不靠谱。不要听什么产品策略啊,定位啊,跳出这些限制吧。前端要善于创造性的应用后端的技术,才能引发新的应用模式。常听前端工程师抱怨没时间研究Javascript,不要把所有时间都仍在这上面。成为一个“学究”似的工程师没什么好处,主要价值就丧失了,那就是创新。前端工程师提倡跨界学习。

反对崇拜和追捧。我记得以前看过一个国内网站,简直就是雅虎和淘宝的混和体。很多人崇拜苹果啊、崇拜Google啊、崇拜xxx人啊…以至于表面的“借鉴”,教条式的追捧。身处这个高速发展的时代,任何权威都是有一定“有效期”的。

注重人的应用能力和创造力。前不久看了Zakas谈如何面试前端工程师(翻译版),他反对问很偏的技术问题,或问太多的问题,最好从一个开发实例谈起,一一会涉及技术细节,设计思想,方式方法。实际上是考察对方的应用能力和想法(know why和know how)。的确这两点是前端工程师最宝贵的素质,同时也是财富。

总结,前端创新是在应用层面上,不是技术层面上。前端创新要以用户为本不是以老大为本。前端创新要拒绝copy。前端创新的根本是人协作贡献智慧。

本地安装WebPageTest

2010年01月9日

AOL内部使用的网站测试工具-WebPageTest,想必早已为人熟知。WebPageTest的介绍:http://www.slideshare.net/ericgoldsmith/aol-page-test。直接在线使用(http://www.webpagetest.org)可以看到最新的“可视化页面比较”功能,它能捕捉页面渲染过程中各个阶段的截屏。像慢镜头回放似的比较和对手的细微差别,很酷!

和其它测试工具相比WebPageTest最大的好处是可以生成很全很详细的网站性能测试报告(这是我最想要的)。在线使用相当于用国外的服务器测试,具体数据肯定都是慢的。还好他们开放了源代码,我们就可以在本地安装WebPageTest了。

两种安装方式:
1.WebPageTest服务器和测试机装在同一台机器上。省事,便于学习。局限是只能装在xp或2003 server这些windows系统上。
2.WebPageTest服务器可以装在任何系统上只要能跑Apache和php5就成。测试机还只能是windows系统。分开的好处是,不同的测试机可以选在不同的地区,不同的浏览器(目前只能是IE6/7/8)下测试,适合企业级应用。我没这条件,只能玩玩第一种方法。

安装WebPageTest的基本条件:Apache 2.2+/PHP 5。装个最新的WAMP就齐了(http://www.wampserver.com/en/download.php

目前WebPageTest最新版是1.7,可以从这里下载:http://www.webpagetest.org/forums/showthread.php?tid=66 。注意在下面的回复里,再下一个pagetest 217。

解开文件包,一个“Web Site”目录,里面有一个“content”目录和几个文件。“content”目录就是WebPageTest的主程序了。说说那几个文件:httpd.conf是Apache系统配置文件的范例,让你参考的别直接覆盖。urlBlast.exe是测试机用的,测试前先打开它。PageTest.exe和pagetest.dll都是执行测试用的。解开217那个文件包,它修复了测试IE6的bug,覆盖旧文件。

“Web Site”目录随便放哪都行,如C:\下。下面开始配Apache。
WAMP的安装目录\bin\apache\Apache2.2.11\conf下,修改httpd.conf文件。
找到下面3行,解除注释:
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule expires_module modules/mod_expires.so
LoadModule headers_module modules/mod_headers.so

我们把虚拟主机的配置放在外部,找到这行:
#Include conf/extra/httpd-vhosts.conf在它下面再加一行:
Include conf/extra/httpd-webpagetest.conf

在WAMP的安装目录\bin\apache\Apache2.2.11\conf\extra下建个httpd-webpagetest.conf,它的内容可参考我的:
NameVirtualHost *
<VirtualHost *>
DocumentRoot “C:/Web Site/content”
ServerName webpagetest
ServerAlias webpagetest
<Directory “C:/Web Site/content”>
AllowOverride All
</Directory>
</VirtualHost>

修改host文件:C:\WINDOWS\system32\drivers\etc\hosts加上一行
127.0.0.1 webpagetest

打开浏览器输入http://webpagetest测一下。如果不幸看到403 Forbiden错误,还得改一下Apache的httpd.conf。找到<Directory />把里面的Deny from all注释了。再测就应该能看到WebPageTest的界面了。如果不行,就是我没遇到的问题了,你需要认真看Apache的error log了。

开始测试。首先打开前面介绍过的urlBlast.exe。然后“Start Testing”吧。我试了试WebPageTest的测试是基于本地的IE测试的,settings目录下的locations.ini文件是测试机的配置文件,感觉它只是描述测试机的测试环境,不能真的改变带宽和浏览器。

WebPageTest 1.7 虽没有在线版的可视化对比功能,但新增的录制Video和截屏功能功能也不错。
先看截屏功能,下面是豆瓣首页的测试结果:

录制Video是把渲染过程存为一系列图片,同时生成一个.avs脚本。直接看需要装avs插件,可以到这里下载:http://sourceforge.net/projects/avisynth2/。也可以用这个软件转成MP4观看:http://sourceforge.net/projects/megui/

有视频有真相,很明显过重的head导致前面白的时间比较长。

可选闭合标签

2010年01月2日

比如google搜索结果页的td都是不闭合的,但它是符合标准的。之前有人发现过这个问题。那到底哪些标签可以不闭合呢.

html4.01 strict或html5下,即doctype声明为
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01//EN” “http://www.w3.org/TR/html4/strict.dtd”>

<!DOCTYPE html>
下面的标签都是可以不闭合的:
<html>
<body>
<colgroup>
<thead>
<tr>
<tbody>
<td>
<p>
<dt>
<dd>
<li>
<option>
<tfoot> (html5下是标准的)

测试: http://validator.w3.org/check?verbose=1&uri=http%3A%2F%2Fhikejun.com%2Ftmp%2Ftest_optional_closing_tags.html

SmartSprites - 命令行形式的CSS Sprites生成器

2010年01月1日

SmartSprites(http://csssprites.org/)是一个基于java开发的命令行形式的CSS Sprites生成器。它根据CSS文件中的特别注释自动合成图片,然后自动替换原来的图片,最后生成一个新的CSS文件。显然比手工上传、下载,再手工修改CSS方便多了。

它可以指定生成-个或多个sprites图片,要合并哪些图片也是由你指定的。这一点要比SpriteMe(http://spriteme.org/)好。SpriteMe本身不是开发阶段的工具。

简单介绍一下怎么用:

环境要求:JRE 1.5+。java -version 试一下。

Step1: 下载文件包(目前最新版是0.2.6,http://csssprites.org/download.html?v0.2.6

Step2: 解压到任意目录。smartsprites-0.2.6下的文件:
windows下用的 - smartsprites.cmd
linux下用的 - smartsprites.sh
Ant的配置示例 - build.xml
建议先修改smartsprites.sh(windows下改smartsprites.cmd),找到这行:
java %OPTS% -Djava.ext.dirs=lib org.carrot2.labs.smartsprites.SmartSprites 将lib改成绝对路径。

Step3: 正常写CSS。比如,有这么一段:

.item1,.item2,.item3,.item4,.item5 { padding:2px 20px;margin-bottom:10px;border:1px solid #7D94CC;background:#A6ADFF no-repeat right; }
.item1 { background-image:url(../icons/feed_add.png); }
.item2 { background-image:url(../icons/feed_delete.png); }
.item3 { background-image:url(../icons/feed_edit.png); }
.item4 { background-image:url(../icons/feed_link.png); }
.item5 { background-image:url(../icons/feed.png); }

Step4: 加了SmartSprites的注释后:

/** sprite:sp_all; sprite-image:url(../imgs/sp_all.png); sprite-layout:vertical; */
.item1,.item2,.item3,.item4,.item5 { padding:2px 20px;margin-bottom:10px;border:1px solid #7D94CC;background:#A6ADFF no-repeat right; }
.item1 {
background-image:url(../icons/feed_add.png);/** sprite-ref:sp_all;sprite-alignment:right;sprite-margin-bottom:20px; */
}
.item2 {
background-image:url(../icons/feed_delete.png);/** sprite-ref:sp_all;sprite-alignment:right;sprite-margin-bottom:20px; */
}
.item3 {
background-image:url(../icons/feed_edit.png);/** sprite-ref:sp_all;sprite-alignment:right;sprite-margin-bottom:20px; */
}
.item4 {
background-image:url(../icons/feed_link.png);/** sprite-ref:sp_all;sprite-alignment:right;sprite-margin-bottom:20px; */
}
.item5 {
background-image:url(../icons/feed.png);/** sprite-ref:sp_all;sprite-alignment:right;sprite-margin-bottom:20px; */
}

注释的格式/** 属性:值 */。

首先声明一个sprite图片(根据需要也可声明多个):

/** sprite:sp_all; sprite-image:url(../imgs/sp_all.png); sprite-layout:vertical; */
sprite:sp_all, sp_all必须唯一
sprite-image:url(保存的路径和文件名);
sprite-layout:vertical|horizontal(默认),sprite布局形式。

在想合并的背景图后面加注释,如:

background-image:url(../icons/feed_delete.png);/** sprite-ref:sp_all;sprite-alignment:right;sprite-margin-bottom:20px; */
sprite-ref:spriteID, 指定要合入哪个sprites图片中。
sprite-alignment:right|left(默认),指定x轴的对齐方式。如果sprite-layout:horizontal则值为top(默认)|bottom,指定y轴的对齐方式。
sprite-margin-bottom:20px,指定留白。同样还可以指定sprite-margin-(left | right | top | bottom)。
更多选项见http://csssprites.org/

Step5: 执行SmartSprites:

$ ~/Library/smartsprites-0.2.6/smartsprites.sh –css-files ~/Desktop/icons/css/common.css
–css-files 指定要处理的css文件
$ ~/Library/smartsprites-0.2.6/smartsprites.sh –root-dir-path ~/Desktop/icons/
–root-dir-path 指定一个根目录,执行时会处理根目录(包括子目录)下所有*.css。
更多选项见http://csssprites.org/

处理过程会显示出来:

INFO: Reading sprite image directives from /Users/kejun/Desktop/icons/css/common-sprite.css.
INFO: Reading sprite image directives from /Users/kejun/Desktop/icons/css/common.css.
INFO: Reading sprite reference directives from /Users/kejun/Desktop/icons/css/common-sprite.css.
INFO: Reading sprite reference directives from /Users/kejun/Desktop/icons/css/common.css.
INFO: Reading image from /Users/kejun/Desktop/icons/icons/feed_add.png. (/Users/kejun/Desktop/icons/css/common.css, line: 5)
INFO: Reading image from /Users/kejun/Desktop/icons/icons/feed_delete.png. (/Users/kejun/Desktop/icons/css/common.css, line: 8)
INFO: Reading image from /Users/kejun/Desktop/icons/icons/feed_edit.png. (/Users/kejun/Desktop/icons/css/common.css, line: 11)
INFO: Reading image from /Users/kejun/Desktop/icons/icons/feed_link.png. (/Users/kejun/Desktop/icons/css/common.css, line: 14)
INFO: Reading image from /Users/kejun/Desktop/icons/icons/feed.png. (/Users/kejun/Desktop/icons/css/common.css, line: 17)
INFO: Writing sprite image of size 16 x 180 for sprite ’sp_all’ to /Users/kejun/Desktop/icons/imgs/sp_all.png.
INFO: Creating CSS style sheet: /Users/kejun/Desktop/icons/css/common-sprite.css.
INFO: Reading CSS from /Users/kejun/Desktop/icons/css/common.css.
INFO: Writing CSS to /Users/kejun/Desktop/icons/css/common-sprite.css.
STATUS: SmartSprites processing completed in 372 ms.

失败会出现“WARN:”,如:

WARN: No ‘background-image’ CSS rule next to sprite reference comment: .item2 { background-image:url(../icons/feed_delete.png);/** sprite-ref:sp_all;sprite-margin-bottom:20px; */ . (/Users/kejun/Desktop/icons/css/common.css, line: 7)
现在这个版本对写法有一定限制。background-image一定要单独指定,这样会报错:
background:url(../icons/feed_delete.png);/** sprite-ref:sp_all;sprite-margin-bottom:20px; */
加注释的background-image要独立一行,这样会报错:
padding:10px;background-image:url(../icons/feed_delete.png);/** sprite-ref:sp_all;sprite-margin-bottom:20px; */

执行完后会生成一个新的文件:common-sprite.css。css变成:

.item1,.item2,.item3,.item4,.item5 { padding:2px 20px;margin-bottom:10px;border:1px solid #7D94CC;background:#A6ADFF no-repeat right; }
.item1 {
background-image: url(’../imgs/sp_all.png’);
background-position: right -0px;
}
.item2 {
background-image: url(’../imgs/sp_all.png’);
background-position: right -36px;
}
.item3 {
background-image: url(’../imgs/sp_all.png’);
background-position: right -72px;
}
.item4 {
background-image: url(’../imgs/sp_all.png’);
background-position: right -108px;
}
.item5 {
background-image: url(’../imgs/sp_all.png’);
background-position: right -144px;
}

SmartSprites在开发阶段用很方便,图片有修改,只需执行一下命令。将它编入Ant里就更方便了,它提供了现成的build script。当然,它肯定不是最优化的,毕竟是自动生成的。但平衡开发效率和易维护性,还是值得用的。现在前端开发的各个任务,基本都有对应的命令行工具,酷!

告别2009

2009年12月31日
09年终于过去了。似乎经历一次痛苦的蜕变。人情冷暖,现实的残酷,抉择,纠结,爱…百般滋味啊。
09年最幸福时刻
初为人父。
09年最高效的事
学车/考本/买车/练车,3个月内完成。社会上那些操蛋事,在学车过程中集中体验了一下。
09年最曲折的事
工作变动(细节不提了)。
重新思考个人成长,工作和生活。过于安逸,会让人产生错觉。还是很庆幸有这段经历。
09年参加的技术交流
图灵组织的“ajax群英会”
w3ctech的10月交流
webrebuild北京交流会
第四届D2论坛
不要做一个闭塞、狭隘的工程师。开放,包容,深度,跨界。不断积聚,不断激发,不断向前。今年的专业发展还算满意。
09年看过的现场
3/7赌鬼新专辑发布
4/9纪念Kurt专场
4/19反光镜纪念无聊军队专场
5/2草莓音乐节
5/15 FunFair音乐节
6/26痛仰不插电@微薄之盐
7/4痛仰十年专场
8/16张北草原音乐节
9/18阴三儿专场@星光现场
10/2Skid Row北京现场
10/5-7摩登音乐节

10/24的迷笛十年颁奖活动
12/12扭机新专辑发布专场

12/18许巍杭州演唱会
12/31崔健跨年夜
特别好的释放,现场的活力,年轻的感觉,独立,坚持,不妥协,纯粹。这些东西会不断纠正我的价值观,垃圾的东西再粉饰也是垃圾,正确的事再不被人理解也值得坚持。

平静的告别2009。现在是2010年1月1日凌晨1点30,鼓足劲再折腾一年。

D2! D2!

2009年12月20日

摸黑从杭州回来了。一个字“累”。及时记录一下这次D2的感受。

人气

近500人坐满了阿里巴巴新园区最大的会议厅。 来自全国各地的前端同行聚在一起,我在中间能感受到这种“气场”。

风向标

D2正成为国内前端行业的风向标。 因为平时不可能接触到来自那么多公司的同行,他们在做什么,他们在关注什么,他们的状态怎么样,这500人足以反映现在国内前端行业发展的现状。至少对于我来说,更加看清了一些问题。

交流

D2提供了一个更大范围交流的机会。你闷头研究的东西,你的理解,你的困惑,在充分的交流中,能得到更好的验证或新的启发。

分享

本届D2分享的话题:有讲大前端的架构(金大为的“模板语言与大前端”)、框架应用的新理念(我的“从YUI2YUI3看前端的演变”)、 成功的技术应用案例(shadow的“SilverlightQQ项目实践——Silverlight架构思考”)、生动的前端安全攻防实战(明城的“前端安全概览及防范”)、到追求更完善的前端开发方式(秦歌的“前端性能优化与自动化”)。这些话题覆盖面很广,也很新。底下聊得知嘉宾们都很尽心的提前做了准备。至少我感觉我的语言没有100%表达出我想表达的东西,所以建议大家回头再仔细看看幻灯片,回味一下会有更多的收获。

热情

自由分享环节让我印象深刻。 大家在枯燥工作中展现出的对技术的热情和实打实的PK是最牛逼的。我要说主动上台分享的都是好样的。前端开发者需要这种passion和分享精神。而不是冷冰冰的技术和孤傲的大牛姿态。

自费参加本届D2的同行们太难的了,讲的不好都觉得对不住你们。出钱派人参加D2的公司是真正重视前端的,找工作可以考虑这些公司。感谢所有参加D2的朋友们,希望那天你们爽了。最后必须感谢阿里巴巴砸钱砸人出场地,义务承办此次D2,并以卓越的组织工作把D2推向一个新高度。不夸了,确实不容易。明年D2不论在中国哪儿办,我会去,相信你也会去!明年见!

第四届D2分享 - 从YUI2到YUI3看前端的演变

2009年12月19日

资料下载: http://hikejun.com/sharing/yui-evolve.zip
2.
回顾javascript的历史,1996年3月javascript的第一个版本1.0发布,那时候NS2和IE3就开始支持了。距现在已经10多年了。现在普遍使用的javascript1.5是2000年11月发布的。距现在也将近十年了。
3.
我们看个比较。05年的yahoo首页基本上都是静态内容的展现,到了09年yahoo最新的首页不仅有非常丰富的表现形式,同时像个平台一样,集成了各种服务,甚至包括第三方的应用。
4.
再看我们国内的淘宝。03年的淘宝首页同样完全是静态内容展现,设计风格也颇具那个时期的特色。现在的淘宝首页内容的表现形式非常丰富多彩。
从这个比较中你会发现,Javascript在相当长的一段时期内充当一个什么样的角色呢?只是用它来显示广告,做做网页特效而已。它基本上是个龙套的角色。
5.
Javascript真正广泛应用起来是在05年。05年初一位用户体验专家James Garret将Javascript在google产品的应用方式总结为AJAX。Ajax的深远意义是对传统产品设计理念的颠覆。由原来的浏览网页,变成和网页互动。同年天才程序员兼著名投资人的Paul Graham在那篇著名的文章“Web 2.0”里宣布“Javascript now works”。Javascript摇身一变成为世界上最流行的语言。
反思的问题:“Javascript在05年以前为什么没有发挥作用?”产品设计和技术的结合的经典案例。设计和技术结合带来产品上的创新。那时侯设计和技术很紧密,现在随着各自的专业化反而有些疏远,是一个不好的现象。
6.
Web2.0实际上同时带动了前端各个学科的发展。看看这些Web2.0的相关关键字,有产品的,有技术的,有设计的。像前端技术的热门关键词有ajax,Web标准,openAPI等,设计方面呢,有易用性,设计标准化,用户为中心等等。
7.
05年以前,有个流行说法“设计80%的工作是排版”,前端开发那个时候主要工作就是“切图”,但确实当时的实际需求就是这样的。05年以后,各个公司都开始做Web2.0的产品,前端开发的需求也就越来越复杂。为了降低复杂度,提高开发效率,各种Javascript库在05年左右纷纷出现。 大约在05年年初雅虎专门成立一个“表现平台”小组开发内部用的库,这就是YUI的前身。
8.
这是前不久统计的现在最流行的几个Javascrip开源库。你会发现现在用的最广泛的库都是05/06年出来的。
9.
所有Javascript库无一例外的都会解决这5个方面的问题。1.建立浏览器的标准接口层,解决兼容性的问题;2.实现复杂的交互和动态效果;3.Ajax开发组件;4.提供一个RIA控件(Widget)库;5.增强Javascript的语言特性,在原生方法基础上扩展更多方法。这些也反映出前端开发的最基本需求。
10.
那么我们看YUI的发展过程。06年初,YUI的第一个beta版本对外发布。当时提供了5个公用功能组件(Utilities)和3个Widget。dom和event实现浏览器统一的接口层,animation和dragdrop实现动态交互效果,connection实现Ajax应用。几乎所有的库的都提供这些功能,只是内部的代码结构设计不一样。方式不一样。YUI从一开始就把每个功能组件独立为一个文件,再按需引用。
11.
07年初的时候,这两个方面继续丰富。特点是Widget增加很多。回想一下那个时期,这些表现层的组件很受欢迎。像产品设计中用的最多的就是tabview。
12.
到了08年,Widget组件的规模继续扩大。但同时,你会发现utilities这块也增加了很多。这反映出当时的一个现象,随着UI设计和UE研究的深入,开始追求更符合自身产品定位的表现形式。所以,现成的Widget越来越不能满足产品设计的需求。开发者对库的基础功能的需求增加了。对代码的品质和维护性有了更高的要求,所以像YUI的单元测试和性能分析工具,包括像现在常用的代码压缩工具YUICompressor,都是哪个时期出来的。
13.
到09年9月14日YUI 2.8.0的发布。提供了本地存储的组件,增加了新的Widget。看看这两块已经发展的相当完善了。随后还会发布2.8.1一个修订版。YUI2的发展就终结了。后面就是YUI3的发展了。
14.
一个好的库就是一堆很全很好用的工具加上一本详细的说明书。我觉的YUI2是一个优秀的库。唯一遗憾的是没有中文的书。国内阿里系的公司基本都在用YUI,腾讯的有些产品也在用YUI,VeryCD用的也是YUI。
15.
比较一下YUI和jQuery这两个库的特点。jQuery把公用功能集中在一个文件中。YUI采用的是“点菜”的方式,每个组件是一个文件,然后按需加载。从jQuery的源文件里看到jQuery也增加了requires的方法。
16.
基于库的开发方式是这样的。现在的前端开发模式基本都是这样的。但是当开发越来越复杂,页面维护的周期越来越长时,这种库风格开发的问题就逐渐暴露出来了。
17.
这是开心登录后的首页在头部引了十多个Javascript文件。且不说性能的问题,维护成本我想会相当高。
18.
就像堆积木。当规模小的时候可以很快,很方便。但当规模越来越大,结构越来越复杂后,这种方式就会变的很危险。前端开发也会面临软件危机的风险。
19.
前端开发演变到今天有那些新的特点呢?原来的单兵作战变成多人轮流维护和协作开发。产品设计的创新需求越来越多。就地解决问题变成系统解决问题,对外联文件和inline代码就需要系统管理。现在的代码生命周期越来越长复杂度越来越大,需要一种可持续性的开发方式,像在开发流程里整合版本管理和单元测试。
20.
从09年开始我觉得“库”开始向“框架”演变了。
21.
从字面上区别一下“库”和“框架”。“框架”侧重组织和结构。“库”是存放东西得地方。库是功能集。
22.
再看维基百科上对“框架”的解释:“框架是一个基本的概念结构,主要是被用来解决或应付复杂的问题”。
23.
下一代YUI-YUI3的定位就是一个纯粹的框架。08年发布了一个预览版开始尝试全新的框架理念,到09年9月29日,发布了YUI3的正式版。经过一年的探索,包括听取来自社区的反馈意见,最终YUI3的框架理念彻底形成。
24.
简单看一下YUI3的框架特点。YUI3的功能模块,会按照具体功能进一步细化成更小的子模块。如图所示。这样可以根据具体的开发需求,选择加载最小功能单位的模块。就像吃自助餐一样,这种方式最节约。
25.
YUI3内部有一个插件机制。YUI3的结点对象或是基于Base类和Widget类创建的对象都会有一个Plug方法,通过它可以绑定插件。如,给所有图片安一个动画插件,图片就有了动画功能。同样,增加一个拖拽功能,直接装个拖拽的插件。(Demo)
26.
另外YUI3的类还有一个扩展机制,可以很快拼一个新类。比如,YUI3的Overlay组件,它的源文件只有一行。
YUI3内部提供的这些机制使模块的重用度非常高。
27.
要学习YUI3强烈建议大家看今年YUI大会的幻灯资料。都很精彩。
28.
我觉得现在比较好的开发架构是“框架”加“库”的模式。首先将所有功能模块化,然后利用YUI3建立模块间的依赖关系,将所有模块系统管理起来。原有的库也可以整合到框架中。最后统一用YUI3的基础组件框架开发组件。
29.
就好比,把一个庞大复杂的应用析构成若干小的模块开发。然后再有序的组织在一起。
30.
Demo: 利用YUI3组织代码
网易新闻频道首页的问题:Javascript代码是采用集中管理,你会看到当代码非常多的时候,可维护性就会变的很差,很难区分那些代码服务那些模块。当内容模块撤换时,代码就很容易遗留在页面中,造成冗余。另外像统一的头部导航,为了方便重用js代码只能直接写在页面内。
利用YUI3组织的话。首先把所有的功能做成模块,然后把模块的配置对象放到全局js文件里。这样head里只需要统一加载一个全局文件(15K)。在每个内容模块后面跟上相应的处理。由于是异步方式,所以不会对性能造成太大的影响。
31.
每个人写代码都会有自己的习惯和风格。尤其是不好的风格,会给协作开发带来了很大的问题。每个人都会有RTFS(read the fucking source)的经历。YUI3提供了3种基础的组件框架:Base, Widget和Plugin。基于统一的组件框架开发就会很一致。
32.
Demo: 自定义组件。我们看一个具体的例子。
一个基础的Widget框架模板是这样的,开发任何Widget直接copy它。它规定了一个统一的组件生命周期:初始化,渲染UI,在UI上绑定事件,同步UI,销毁。如果基于它开发组件都必须按照这个套路。
看看具体的代码。
34.
产品设计和技术只有紧密的配合才有可能创新。