一向不喜欢追求刚刚新鲜出炉的事物的我,终于在node js出来一年后开始迈出脚步。
废话少说,先把环境给配置好。google "mac node",出来几条结果,提供的方法基本一样,遂开始实践之。附google后的安装步骤:
1、安装xcode、git;
2、使用git将node源码拉到本地 git://github.com/ry/node.git
3、./configure
4、make
5、make install
还好之前有装过xcode、git,要不然光下载安装个xcode,今天晚上的时间完全报销(托网络不给力的福)。有了这两个玩意,安装应该轻松搞定。然而却出来几个问题,首先./configure的时候,有几个东西没有: openssl -> not found, library -> not found, fdatasync(2) with c++ -> no。然后make的时候悲催的报错了:build failed: -> task failed(err #1):...。
之后,我又重复了好几遍,都是没有成功,开始怀疑是否是openssl, library rt缺失导致的,准备装openssl神马的,顺便群里面问了句,有朋友建议使用node 0.6.1,然后跑到github上,download了最新版本的源码,重复google上的安装步骤,'build' finished successfully, 'install' finished successfully,搞定!原来是版本问题,当然具体是版本内部的什么问题,这里先不深究了,helloworld先出来再说。
安装成功后,将官网上的helloworld程序copy一份保存为helloworld.js到node安装目录下,
var http = require('http');
http.createServer(function(req, res){
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(8808, '127.0.0.1');
console.log('Server running at http://127.0.0.1:8808');
运行node helloworld.js,就能在命令窗口中(控制台)下看到"Server running at http://127.0.0.1:8808"的信息,在浏览器中输入localhost:8808,页面不能连接,悲催了,怎么回事。跑到控制台下看,报了一个错:The 'sys' module is now called 'util'. It should have a similar interface.貌似是要实现某个接口,可是不对啊,这可是官方提供的helloworld啊,还能出错。肿么回事?莫非又是版本问题?node -v之,版本为node-v0.6.2 pre,乖乖,0.6.2的最新版本,而我跑的是0.6.1的helloworld,出错了。既然官网目前提供了0.6.1的文档,还是先看看0.6.1吧。
好吧,又有重装了。这次吸取教训,从官网上把0.6.1版本驼下来,然后重复以上步骤,make install的时候又出错了,需要删除刚才安装的0.6.2 pre版本,因为它扎用了usr/local/include/node目录,其下的config.h不能重写。乖乖,没有sudo,没有权限,那就sudo拿到管理员权限,重新sudo make install,安装成功了。
继续跑node helloworld.js,console正常,并能访问localhost:8808,OK,终于搞定。也算一波三折。
留心一下,如果你的程序中有代码错误,控制台还是会先打印出console信息,然后再给你报出错误信息,比如使用0.6.2 pre版本报的那个错The 'sys' module is now called 'util'. It should have a similar interface,再比如你把res.writeHead携程rs.writeHead。
posted @ 2011-11-13 22:27 慢热君Kevin 阅读(231) 评论(0)
编辑
概述
使用
优点
缺陷
实际应用
总结
概述
css expression(css表达式)又称Dynamic properties(动态属性)是早期微软DHTML的产物,以其可以在Css中定义表达式(公式)来达到建立元素间属性之间的联系等作用,从IE5开始得到支持,后因标准、性能、安全性等问题,微软从IE8 beta2标准模式开始,取消对css expression的支持。
使用
微软提供了4个css expression方法:getExpression、recalc、removeExpression、setExpression。有兴趣可以参考msdn。
一般最常用的是直接在css中使用expression,例如:
1 .toTop{
2 top:expression(eval(document.documentElement.scrollTop + document.documentElement.clientHeight - 60)));
3 }
这是一个返回顶部按钮css代码的截取,用css来将元素定位到屏幕底部的位置。
优点
css exprssion技术达到了可以使用表达式或公式来定义css属性的目的,msdn上给出了它的几个优点:减少页面上的代码,使设计师无需学习javascript就能实现一些DHTML的效果。个人认为,减少页面上的代码实际上只是减少了相关javascript的代码,而css expression中的代码本身与js是及其类似,设计师无需学习js就能实现DHTML效果这个优点也很牵强,或曰鸡肋。
缺陷
- .不符合web标准
css表达式这种在表现(css)中插入行为(js)代码,有悖于web标准的结构、表现、行为相分离的理念。
- .效率低下
一个css表达式会反复执行,甚至执行成百上千次。这会大大消耗计算机的硬件资源,极端情况下会导致浏览器的崩溃。
- .带来安全隐患
css表达式暴露了一个脚本执行的上下文,可能带来脚本注入的隐患。
基于以上原因,微软最终从IE8 beta2(标准模式下)开始放弃对css表达式的支持。
实际应用
早期很多开发人员利用css expression实现了许多效果,比如将元素相对鼠标指针进行定位,根据一个定时器来移动元素等等。当然这些效果能够使用js来实现。
虽然css表达式问题很多,但是我们依然能够在网上看到它们的影子,甚至在一些成熟的商业网站上。最常见的一个应用就是悬浮在页面上的某个模块(比如导航、返回顶部)。
我们来看一个常见的返回顶部按钮的代码实现:
html:
<!doctype html>
<html>
<head>...</head>
<body>
<div id="top">...</div>
...
<a href="#top" id="toTopBtn">返回的顶部</a>
</body>
</html>
css:
#toTopBtn{
position:fixed;
bottom:10px;
right:10px;
_position:absolute;
_top:expression(eval(document.documentElement.scrollTop + document.documentElement.clientHeight - 60));
...
}
_position和_top是对IE6的hack,因为IE6不支持position:fixed。这里的css表达式的作用是模拟position:fixed,即在将返回顶部按钮固定在页面的底部,不管页面是否滚动、缩放。正是因为css exprssion会执行多次,所以这个按钮元素才会一直定位在页面的底部。当然,我们可以使用javascript来模拟ie6的position:fixed,但细心的同学可能会发现这样一个问题,IE6下的返回顶部按钮会在你滚动页面的时候有较为明显的抖动。而我们使用css expression,这要在css加入以下规则,抖动的现象就会消失:
html{
_background-image:url(about/blank);
_background-attachment:fixed;
}
而使用js来模拟的,加上这句css规则也是没有效果的。这也应该是很多成熟商业网站现在还在使用css expression的原因。若有较好的实现方案,欢迎讨论。
但是,根据YSlow提供的网页优化建议:Avoid CSS Expressions,也由于css expression的各种问题,个人不建议使用css表达式。可以和产品人员协商,容忍ie6下这点抖动的瑕疵,或者采用动画来美化这个抖动效果,或者使用另外的一种方式来实现position:fixed,比如:固定页面的高度,让页面内部的内容可滚动,然后将返回顶部按钮绝对定位到底部(采用这种实现方式要慎重,因为或对页面布局和结构造成较大的影响)。
总结
CSS expression作为web时代临时解决方案的产物,在被其创建者无情的抛弃后,我们更应该摈弃这种较为丑陋的代码方式,采用更优的解放方案。
参考
About Dynamic Properties
Ending Expressions
posted @ 2011-11-13 14:39 慢热君Kevin 阅读(1319) 评论(3)
编辑