一向不喜欢追求刚刚新鲜出炉的事物的我,终于在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) 编辑