Javascript开源库/框架
浏览器
Web标准
热门话题
前端会议
09年前端领域着实涌现不少令人惊喜的技术和事件,对于前端开发者来说要不断更新自己的知识否则很快就Out了。同时,也可以看出前端技术的发展那是相当的快。2010年这种发展势头不会减缓,期待经历更精彩的一年!
09年前端领域着实涌现不少令人惊喜的技术和事件,对于前端开发者来说要不断更新自己的知识否则很快就Out了。同时,也可以看出前端技术的发展那是相当的快。2010年这种发展势头不会减缓,期待经历更精彩的一年!
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的原文更详细,我只是用更直白的话解读了一下。建议看原文。
今天连着看了两个视频。一个是“扩展现实”技术(出自这里)。
“大家看得像神一樣的某項硬體功能,在成本上不過是幾塊錢、甚至幾毛錢美金的東西;但只要能跟軟體搭配流暢、能引發全新的應用模式,就是好東西。” -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。前端创新的根本是人协作贡献智慧。
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导致前面白的时间比较长。
比如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下是标准的)
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)
Step3: 正常写CSS。比如,有这么一段:
Step4: 加了SmartSprites的注释后:
注释的格式/** 属性:值 */。
首先声明一个sprite图片(根据需要也可声明多个):
在想合并的背景图后面加注释,如:
Step5: 执行SmartSprites:
处理过程会显示出来:
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: ![]()
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:”,如:
执行完后会生成一个新的文件:common-sprite.css。css变成:
SmartSprites在开发阶段用很方便,图片有修改,只需执行一下命令。将它编入Ant里就更方便了,它提供了现成的build script。当然,它肯定不是最优化的,毕竟是自动生成的。但平衡开发效率和易维护性,还是值得用的。现在前端开发的各个任务,基本都有对应的命令行工具,酷!
平静的告别2009。现在是2010年1月1日凌晨1点30,鼓足劲再折腾一年。
摸黑从杭州回来了。一个字“累”。及时记录一下这次D2的感受。
近500人坐满了阿里巴巴新园区最大的会议厅。 来自全国各地的前端同行聚在一起,我在中间能感受到这种“气场”。
D2正成为国内前端行业的风向标。 因为平时不可能接触到来自那么多公司的同行,他们在做什么,他们在关注什么,他们的状态怎么样,这500人足以反映现在国内前端行业发展的现状。至少对于我来说,更加看清了一些问题。
D2提供了一个更大范围交流的机会。你闷头研究的东西,你的理解,你的困惑,在充分的交流中,能得到更好的验证或新的启发。
本届D2分享的话题:有讲大前端的架构(金大为的“模板语言与大前端”)、框架应用的新理念(我的“从YUI2到YUI3看前端的演变”)、 成功的技术应用案例(shadow的“SilverlightQQ项目实践——Silverlight架构思考”)、生动的前端安全攻防实战(明城的“前端安全概览及防范”)、到追求更完善的前端开发方式(秦歌的“前端性能优化与自动化”)。这些话题覆盖面很广,也很新。底下聊得知嘉宾们都很尽心的提前做了准备。至少我感觉我的语言没有100%表达出我想表达的东西,所以建议大家回头再仔细看看幻灯片,回味一下会有更多的收获。
自由分享环节让我印象深刻。 大家在枯燥工作中展现出的对技术的热情和实打实的PK是最牛逼的。我要说主动上台分享的都是好样的。前端开发者需要这种passion和分享精神。而不是冷冰冰的技术和孤傲的大牛姿态。
自费参加本届D2的同行们太难的了,讲的不好都觉得对不住你们。出钱派人参加D2的公司是真正重视前端的,找工作可以考虑这些公司。感谢所有参加D2的朋友们,希望那天你们爽了。最后必须感谢阿里巴巴砸钱砸人出场地,义务承办此次D2,并以卓越的组织工作把D2推向一个新高度。不夸了,确实不容易。明年D2不论在中国哪儿办,我会去,相信你也会去!明年见!
资料下载: 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.
产品设计和技术只有紧密的配合才有可能创新。
PDF: http://hikejun.com/sharing/lsm-practice-kejun.zip
2.
分层语义化模板的简称LSM
分层其实指的就是展现层的MVC结构
语义即指语义化标签和命名,又指结构化数据。目的是更合理定义信息架构。
4.
其实设计师和前端工程师都是信息的传达者。前端工程师并不是完全follow设计。看个例子:
http://hikejun.com/work/qq/spec/example_mod_compare.html
wireframe是交互设计师的语言,视觉是设计师的语言,代码是工程师的语言。其实三者要表达的东西是一致的。
5.
先看看传统的前端开发方式。设计师follow产品经理,前端工程师follow设计师
6.
这种串行方式,当某个环节出问题都会影响后面的环节。实际上,模糊的产品定义导致善变的设计再导致混乱的代码,这种糟糕的连锁效应是经常发生的。
7.
更合理的关系是这样。设计师依据PRD进行视觉设计,同时前端工程师依据PRD设计html结构,当视觉设计完成后再开发CSS。
8.
显然,这种方式最大的特点就是串行变成并行。
9.
从产品设计角度讲,分层就是:信息架构 > 视觉表现 > 交互行为
从开发的角度讲,分层就是:M(模型)V(展现)C(控制)。这个又是和后端完全对应的。
10.
前端的开发过程就像“洋葱皮”似的。从最原始的内容(或数据)一层一层的增强。
11.
所以UI的开发过程应当是渐进的过程。我们看一个实际页面的例子。
12.
第一步根据wireframe和统一的页面布局、模块结构搭建HTML
page_base_style_0.png
第二步实现核心样式。核心样式是全站的统一风格,包括:标签reset,字体,链接,模块容器,通用模块样式(提示、列表、按钮等),页面布局,以及常用的rules(高亮、隐藏、清浮动等)。
page_base_style_1.png
第三步实现模块的统一样式。产品(或频道)级模块通常都会有自己的统一风格。
page_base_style_2.png
第四步实现页面级的专有样式。
page_base_style_3.png
第五步实现页面上的动态效果和数据交互。
17.
这种渐进式开发的优点,首先是可以很好的控制每一级UI的的一致性,全站级 > 产品(或频道)级 > 栏目和页面级。
开发和设计可以同步进行。像刚才的例子2到4步对UI样式的实现完全通过CSS实现。
每一级都有很多通用的部分被规范出来。基于统一规范和模式,会使开发效率大大提高。
18.
第一步是最关键的,就是HTML的搭建。
通过代码是可以想象出信息的结构和形式。
22.
LSM可以实现更灵活的前端。这种灵活性除了体现在应对展现形式灵活的变化,另一个方面就是“重用”。
重用是信息的重用,不要误解为风格的重用。
23.
网站重构中很重要的一点就是规范标准的结构和模式。
24.
标准的页面布局结构。这个通常都会做。
标准的模块结构。虽然模块的表现形式多种多样,但仍然可以抽象出一致的结构。
对于模块完全可以进一步归纳和分类,形成标准模块。
27.
新的模块从标准模块组合和派生出来。
28.
最后总结一下。分层使前端更灵活。模块化使前端更有秩序。语义化使信息的重用和二次开发变得轻而易举。建立面向LSM的规范和标准,可以使团队批量生产质量均等的页面,
29.
产品的UI可以得到统一的控制,
30.
同时使团队的协作程度更高,代码更可控,开发效率更高。
用例源码: http://hikejun.com/work/qq/share_8.4/example2/article.html