代码改变世界

随笔分类 - 06. 项目扩展

上周末Jscex项目介绍的幻灯片

2011-05-16 14:06 by Jeffrey Zhao, 16905 阅读, 收藏, 编辑
摘要:上周末,在风景秀丽的浙江大学校园内,举行了NodeParty杭州站的活动。我在活动上结合Node.js项目对Jscex进行了简单介绍,包括其设计目的,设计原则,使用方式,高级模式,组成部分等等。在场的许多朋友也提出了不少问题,我也一一作了解答或是演示。总体感觉还算不错,毕竟是亲手编写的项目,对其各方面还是了然于胸的。在此发布演讲用的幻灯片,希望能给不在现场的同学带来一些帮助。 阅读全文

Jscex使用BSD授权协议正式发布

2011-04-22 00:18 by Jeffrey Zhao, 12566 阅读, 收藏, 编辑
摘要:这次打算把Jscex好好搞一下了,其实很少会有技术方面的障碍能“轮到”我们去突破,但我觉得Jscex的确有机会,HTML 5、Node.js各个都是红火的玩意儿。前几天我花了两个晚上用半生不熟的中式英语写了一篇自认为比较完整的说明文字放到了Github上的项目首页上,没想到几个小时后便收到了StratifiedJS(一个与Jscex目标有些类似的项目)作者的邮件,提到了一些关于StratifiedJS的事情。我向他咨询了StratifiedJS的某些细节问题,也向他简单介绍了Jscex的实现原理。如今Jscex已经使用BSD授权协议正式发布(中文站也会在近期推出),再进行一些细节上的优化便要开始作推广了。 阅读全文

Jscex项目现状:UglifyJS解析器及AOT编译器

2011-04-15 02:09 by Jeffrey Zhao, 14481 阅读, 收藏, 编辑
摘要:Jscex项目是我为了简化JavaScript异步的一个类库,支持任意JavaScript(ECMASCript 3)引擎。Jscex小巧而强大,可以极大地改善前端的AJAX及动画等场景的编程体验,同样也可以用在node.js进行服务器开发。从产生Jscex的想法到现在也有几个月的时间了,也一直想设法进行推广。在思考过程也发现了它在实际生产中可能会遇到的问题,于是前两个星期的主要工作,便是针对这些问题进行优化。首先我将Jscex的JavaScript分析器从Narcissus换成了UglifyJS,并基于node.js开发了一个简单的AOT编译器。接下来我也打算写个稍微详细一点的介绍,然后在国外社区看看反响如何。 阅读全文

片段缓存的实际应用、延迟加载及Eazy类库

2009-09-22 14:54 by Jeffrey Zhao, 13606 阅读, 收藏, 编辑
摘要:片段缓存已经实现完整了,但好像还没有提到如何在项目中进行实际应用,那么现在就来谈一谈这方面。之前也有朋友提出,这个片段缓存难道节省的只是拼接HTML字符串的时间吗?这其实就涉及到片段缓存在实际项目中该如何使用的问题了。我们通过延迟加载来省下数据加载的开支,而且有了Eazy类库之后,定义延迟加载是件非常容易的事情。 阅读全文

适合ASP.NET MVC的视图片断缓存方式(下):页面输出原则

2009-09-22 11:05 by Jeffrey Zhao, 15274 阅读, 收藏, 编辑
摘要:上一篇文章里已经把Html.Cache打造成了非常具有可用性的API,需要缓存时我们只需在页面上做一个标记即可。标记内部的写法和普通视图的写法相同,RenderPartial等辅助方法输出内容也会被一并缓存下来。只可惜,上次文章末尾我提到有些效果是有前提的。这个前提就是必须修改RenderPartial的实现,让它遵守一个原则:如果您是在向页面输出内容,请务必将所有内容通过页面的Writer输出。 阅读全文

适合ASP.NET MVC的视图片断缓存方式(中):更实用的API

2009-09-21 15:49 by Jeffrey Zhao, 15506 阅读, 收藏, 编辑
摘要:上一篇文章中我们提出了了片断缓存的基本方式,也就是构建HtmlHelper的扩展方法Cache,接受一个用于生成字符串的委托对象。但是在实际开发过程中,我们最乐于看到的使用方法,应该只是使用某个标记来“围绕”一段现有的代码。不过这个方法并不实用,如果您要缓存大片的HTML,还需要准备一个Partial View,再用它来生成网页片段。这次我们会构建一个更为良好的API。 阅读全文

适合ASP.NET MVC的视图片断缓存方式(上):起步

2009-09-17 17:19 by Jeffrey Zhao, 19782 阅读, 收藏, 编辑
摘要:说到网站性能优化,没有什么比“缓存”更重要了。即便是某些朋友口中念念不忘的“静态页”,说到底也只是缓存了整张页面内容而已。但是,显然这样大粒度的缓存策略,在如今“牵一发而动全身”的Web 2.0站点中几乎是无法使用的。视图片断缓存,缓存的也是页面内容,它比更低级别的缓存更有效率,也比静态页等整页内容缓存的适用面要大得多。在Rails或Django中都有类似的功能,但ASP.NET MVC甚至在2.0的Road Map中还没有包含这一功能,我们只能自己动手丰衣足食了。不过有了ASP.NET WebForm作为强大的视图引擎,加这样的功能简直是举手之劳。 阅读全文

WebFormView的标准修改办法及MvcPatch项目

2009-09-15 12:11 by Jeffrey Zhao, 12205 阅读, 收藏, 编辑
摘要:上一篇文章中我提到WebFormView的实现破坏了IView对象设计思路,它会把视图内容直接生成至HttpContext.Current而不是Render方法指定的TextWriter中。之前我提出了一种非常临时,非常山寨,非常简陋,绕弯,但是可行,或者说是可以“表现出解决问题的方法”的代码,而这次我们来做一次“标准”的修改。此外,我还创建了一个MvcPatch项目来保存这些内容。 阅读全文

应该算是WebFormView的一个Bug

2009-09-14 15:33 by Jeffrey Zhao, 12314 阅读, 收藏, 编辑
摘要:最近需要搞一些重要的功能,结果又遇到了意料外的障碍。于是又仔细地看了看ASP.NET和ASP.NET MVC的源代码,又发现了以前不曾知道的一些细节。其实ASP.NET为我们留下了不少切入点,但几乎没什么书会提到这些切入点,我们只能从微软自己的框架中一探究竟。不过这次我想谈的是ASP.NET MVC框架中的一个Bug,这个Bug在一般情况下不会出现问题,但是这的确违反了ASP.NET MVC自身的设计。这个问题就出在WebFormView对象的实现上。 阅读全文

通过表达式树构造URL时忽略部分参数

2009-09-03 11:37 by Jeffrey Zhao, 4728 阅读, 收藏, 编辑
摘要:您的使用ASP.NET MVC的时候,一定遇到过使用Post接受数据的Action方法。为了实现这个功能,我们必须在客户端准备一个form,并填写它的Action——也就是Post的目标URL。按照传统的做法,我们会使用表达式树来构造这个URL,但因为ASP.NET Routing在处理配置规则中没有标明的Route Values时,会将它们作为Query String拼接在URL后面。因此,我们需要得到一种“忽略”某个参数的方式。 阅读全文

优化通过表达式树构造URL的性能

2009-09-01 19:29 by Jeffrey Zhao, 4875 阅读, 收藏, 编辑
摘要:我们继续改进通过表达式树构造URL的方式。在上一篇文章中,辅助方法可以正确地识别了ActionNameAttribute,而这次改进的则是性能方面的问题。原先的代码使用了传统计算一个表达式树的方式:“使用LambdaExpression对象封装,再编译,最后执行”来获得一个Expression对象的值。但是,Compile方法的性能是比较低下的,如果密集地执行会对性能产生一定影响。我们可以使用FastLambda中的组件来优化这部分操作的性能。 阅读全文

通过表达式树构建URL时正确识别ActionNameAttribute

2009-09-01 14:25 by Jeffrey Zhao, 5377 阅读, 收藏, 编辑
摘要:在MvcFutures项目中提供了一个辅助方法,可以将一个表达式树对象转化成一个RouteValueDictionary集合。只可惜,这个辅助方法的毛病比较多。例如,它直接把方法名作为action的值,而忽略了其上标记的ActionNameAttribute。这导致了某个被“改名”的Action方法一旦用在了表达式树中,最终得到的URL便是错误的。不过只需寥寥数行代码便可改变这个情况。 阅读全文

使用表达式树构建DomainRoute的URL

2009-08-31 15:48 by Jeffrey Zhao, 4812 阅读, 收藏, 编辑
摘要:由于DomainRoute支持针对URL域名的捕获和构造,这有些破坏了ASP.NET Routing所制定的“协议”(ASP.NET Routing只支持Path),因此在上一篇文章中,我们需要自己构造一个辅助方法来获得一个“包含域名”的URL。不过根据尽可能强类型的原则,我们应该使用的是类似于MvcFutures中定义的基于表达式树的辅助方法。由于MvcFutures已经提供了非常充足的辅助功能,因此这其实并不需要耗费我们多少代价。 阅读全文

支持DomainRoute的URL构造辅助方法

2009-08-26 12:18 by Jeffrey Zhao, 6352 阅读, 收藏, 编辑
摘要:上一篇文章中我们构造了DomainRoute类,这是一个将URL Routing扩展至域名的Route组件,于是现在我们便可以轻易地从一个URL的Domain部分中捕获数据并在程序中使用。不过作为URL Routing的另一个重要部分,在URL构建方面,我们还需给DomainRoute补充额外的支持。 阅读全文

配合域名作URL Routing

2009-08-25 16:00 by Jeffrey Zhao, 10412 阅读, 收藏, 编辑
摘要:经常有朋友问我,如何对域名作URL Routing,他们可能希望根据域名(或自域名)来获得一些值,最终影响Controller,Action或某些参数的选择。之前我只是简单地说“扩展一下ASP.NET Routing吧”,而现在由于自己也正好需要使用这个功能,便实现了一个扩展。使用下来,效果不错。 阅读全文

基于ParsedRoute的Domain Parser

2009-08-24 18:27 by Jeffrey Zhao, 5129 阅读, 收藏, 编辑
摘要:之前谈了不少关于ASP.NET Routing中ParsedRoute的内容,例如它的设计以及如何调用它的功能,其目的便是为了如今的使用作准备。现在我们就基于它构建一个Domain Parser,而这个Parser也是为今后的功能打基础的。 阅读全文

再谈ASP.NET Routing中的ParsedRoute

2009-08-24 14:10 by Jeffrey Zhao, 4918 阅读, 收藏, 编辑
摘要:ParsedRoute是ASP.NET Routing中的内部类,作用是根据既定模式将一段URL解析为一个RouteValueDictionary。上次的文章中我主要谈了如何利用反射使用类库的内部成员,而这次则想分享一些使用ParsedRoute时产生的一些想法。 阅读全文

支持Area的ControllerFactory

2009-08-20 11:33 by Jeffrey Zhao, 5427 阅读, 收藏, 编辑
摘要:由于项目需要,把ASP.NET MVC 2中的Area功能搬到1.0上来吧……其实只是借用个Area名头而已,根本不是那么一回事。有时候,我们就为自己的项目做一点简单的扩展,不是很合适吗? 阅读全文

复用类库内部已有功能

2009-08-19 18:59 by Jeffrey Zhao, 7815 阅读, 收藏, 编辑
摘要:经常看我博客的人可能会知道,我是一个喜欢搞点小技巧来实现某个功能的人。例如博客的皮肤,自己花了不少时间定义,也是为了效果丰富一些。当然,搞得最多的是从框架或类库内部取出一点小功能来用用,节省自己开发的时间。 阅读全文

将Windows Live Writer打造为“所见即所得”编辑器

2009-08-18 00:14 by Jeffrey Zhao, 5973 阅读, 收藏, 编辑
摘要:Windows Live Writer的最大优势之一,便是可以自动获取目标博客的样式,然后让用户在特定的样式环境下编写文章。我们可以利用它在特定样式环境下编写HTML内容,这篇文章将会提供一个指南,希望可以帮助您打造一个合适的编辑环境。 阅读全文

为ASP.NET MVC扩展异步Action功能(下)

2009-02-04 09:04 by Jeffrey Zhao, 15415 阅读, 收藏, 编辑
摘要:续上篇:异步请求处理是ASP.NET 2.0中引入的高级特性,它依托IO Complete Port,对于提高IO密集型应用程序的吞吐量非常重要(详见原理描述和性能测试)。但是目前ASP.NET MVC框架缺少异步Action功能,这也就是老赵经常挂在嘴边的那个“目前ASP.NET MVC所缺少的非常重要的功能”。我在春节休假期间仔细思考了一下这方面的问题,得出了一个相对不错的扩展:完整,方便,并且非常轻巧——核心逻辑代码只有200行左右,这意味着绝大部分功能将会委托给框架中现成的内容,确保了扩展的稳定,高效并且拥有较好的向后兼容性。 阅读全文

为ASP.NET MVC扩展异步Action功能(上)

2009-02-02 09:22 by Jeffrey Zhao, 25962 阅读, 收藏, 编辑
摘要:异步请求处理是ASP.NET 2.0中引入的高级特性,它依托IO Complete Port,对于提高IO密集型应用程序的吞吐量非常重要(详见原理描述和性能测试)。但是目前ASP.NET MVC框架缺少异步Action功能,这也就是老赵经常挂在嘴边的那个“目前ASP.NET MVC所缺少的非常重要的功能”。我在春节休假期间仔细思考了一下这方面的问题,得出了一个相对不错的扩展:完整,方便,并且非常轻巧——核心逻辑代码只有200行左右,这意味着绝大部分功能将会委托给框架中现成的内容,确保了扩展的稳定,高效并且拥有较好的向后兼容性。 阅读全文

Fast Reflection Library

2009-02-01 09:25 by Jeffrey Zhao, 17880 阅读, 收藏, 编辑
摘要:这是我在CodePlex上创建的一个项目,它的网址是http://www.codeplex.com/FastReflectionLib,使用Microsoft Public License (Ms-PL),您可以随意在自己的产品中使用它的全部或部分代码。这个项目用到了我在《方法的直接调用,反射调用与Lambda表达式调用》和《这下没理由嫌Eval的性能差了吧?》两篇文章里用到的做法,并加以提炼和扩展发布的项目——随便搞搞,留个印记,也供以后参考。 阅读全文

StyledAutoComplete - 支持丰富样式的自动补全

2007-06-12 18:15 by Jeffrey Zhao, 6957 阅读, 收藏, 编辑
摘要:几个月前,我扩展了Atlas CTP时期的的AutoCompleteBehavior,到了ASP.NET AJAX正式版之后这个扩展自然就不能用了。其实这段时间内有不少朋友问我该如何做到像Google Suggest那样带丰富样式的自动补全功能,但是由于各种原因,我没有深入地研究它,更别提对它的扩展了。最近手头正好有些时间,也就逼迫自己耐着性子读了读AutoCompleteBehavior的代码,并作了这个扩展。 阅读全文

让UpdatePanel支持文件上传(5):支持页面重定向的HttpModule

2007-04-12 11:51 by Jeffrey Zhao, 7952 阅读, 收藏, 编辑
摘要:在最后,我们还必须编写一个HttpModule来支持异步刷新时页面的重定向。 阅读全文

让UpdatePanel支持文件上传(4):数据传输与解析机制

2007-04-11 15:02 by Jeffrey Zhao, 6151 阅读, 收藏, 编辑
摘要:现在就要开始整个项目中最有技巧的部分了。如果我们的组件需要在多种浏览器中正常的运行,我们必须好好考虑一下发送和解析数据的方式。如果我们把这部分的机制完全交给ASP.NET AJAX原有的行为来执行,则会遇到问题。 阅读全文

让UpdatePanel支持文件上传(3):客户端组件

2007-04-06 10:10 by Jeffrey Zhao, 5067 阅读, 收藏, 编辑
摘要:我们的UpdatePanelIFrameExecutor继承了WebRequestExecutor,因此需要实现许多方法和属性。但是我们事实上不用完整地实现所有的成员,因为客户端的异步刷信机制只会访问其中的一部分。 阅读全文

让UpdatePanel支持文件上传(2):服务器端组件

2007-04-05 11:55 by Jeffrey Zhao, 6284 阅读, 收藏, 编辑
摘要:我们现在来关注服务器端的组件。目前的主要问题是,我们如何让页面(事实上是ScriptManager控件)认为它接收到的是一个异步的回送?ScriptManager控件会在HTTP请求的Header中查找特定的项,但是我们在向IFrame中POST数据时无法修改Header。所以我们必须使用一个方法来“欺骗”ScriptManager。 阅读全文

让UpdatePanel支持文件上传(1):开始

2007-04-04 12:16 by Jeffrey Zhao, 15666 阅读, 收藏, 编辑
摘要:UpdatePanel从一开始就无法支持AJAX的文件上传方式。Eilon Lipton写了一篇文章解释了这个问题的原因。文章中提供了两个绕开此问题的方法。不过,我们为什么不使UpdatePanel兼容FileUpload控件(<input type="file" />)呢?如果可以这样,一定能够受需要使用UpdatePanel上传文件的用户欢迎。 阅读全文

UpdatePanel终于可以上传文件了!

2007-03-26 20:23 by Jeffrey Zhao, 37464 阅读, 收藏, 编辑
摘要:UpdatePanel终于可以上传文件了!我们要做的,只是在页面上添加一个控件而已。 阅读全文

ModalUpdateProgress控件

2007-03-26 02:33 by Jeffrey Zhao, 8293 阅读, 收藏, 编辑
摘要:在之前的一篇文章中,我谈了如何在页面中“轻量级地”实现了模态的UpdateProgress。这次,我带来了一个“重量级”的实现:ModalUpdateProgress控件。 阅读全文

可能是最漂亮的非静态Page Method解决方案

2006-12-28 13:38 by Jeffrey Zhao, 7768 阅读, 收藏, 编辑
摘要:在我前一片文章《浅谈实例Page Method到静态Page Method的移植》中,我提到了两种属于work around的解决方案,的确有效,如果可以的话我也建议尽可能地改成那样,尤其是第一种“在客户端获得参数信息”的做法,性能很高,值得推荐。不过从“技术”方面来考虑,这两个做法都不如现在这种来得漂亮。我尝试着实现了一个HttpModule,只要使用了它就能轻松使用原来的“非静态Page Method”了,这几乎完全解决了ASP.NET AJAX中无法使用非静态Page Method的问题,CTP时期程序的移植也变得再容易不过。 阅读全文

InteWidgetTookit现有三个控件的使用方法

2006-12-02 23:07 by Jeffrey Zhao, 3050 阅读, 收藏, 编辑
摘要:在我之前的文章《我的开源项目:InteWidgetTookit》里,对InteWidgetToolkit进行了的简单介绍。现在我已经开始使用CodePlex进行开发和管理,它的地址是:http://www.codeplex.com/InteWidget,欢迎感兴趣的朋友关注。在之前的基础上,我改进了基于Dojo开发Extender所以使用的DojoExtenderControlBase与BaseScripts.js,现在使用它们开发基于Dojo的Extender只需简单地在服务器端编写一个类,使用CustomAttribute进行一些标记即可,几乎不要写任何客户端代码,并且能够在UpdatePanel中执行。现在我基于Dojo简单地开发了三个不同类型的Extender:ColorPalatteExtender、TooltipExtender和SplitContainerExtender。这次我将描述一下它们的使用方式。 阅读全文

我的开源项目:InteWidgetTookit

2006-11-27 20:03 by Jeffrey Zhao, 4212 阅读, 收藏, 编辑
摘要:“InteWidgetToolkit”很明显是一个Toolkit,也就是工具包。“Inte”是“Integrate”的缩略。而Widget的含义则是“小工具”。其实这个名字的本意是“一个集成第三方脚本类库中Widget的ASP.NET AJAX工具包”,但是目前的决定是“一个集成第三方脚本类库的ASP.NET工具包,提供了各种Widget”。InteWidgetToolkit的目的是提供各种控件,目前想法是以Extender的方式为主,但是不排除今后会加入普通WebControl的类型。目前第三方脚本控件暂且定位在Dojo和Yahoo! UI Library。 阅读全文

出于对Atlas自带AutoCompleteBehavior的不满,自定义了一个支持模版的AutoCompleteBehavior

2006-10-20 03:05 by Jeffrey Zhao, 2724 阅读, 收藏, 编辑
摘要:AutoCompleteBehavior只能作出最简单的提示,其它什么功能也没有。无法设置样式,无法自定义信息,这就是我们想要的功能吗?这就是所谓的“桌面级”体验吗?很显然,这远远不够。豪不夸张地说,我是怀着对于AutoCompleteBehavior的强烈不满(其实这是前几天我在向别人介绍Atlas时被人Challenge的结果),决定自定义一个加强的AutoCompleteBehavior,不过其实唯一的增强也就是提供了用户自定义模版的能力。 阅读全文

Book List Gadget for Windows Live Spaces - Usage Instructions

2006-10-08 16:30 by Jeffrey Zhao, 1007 阅读, 收藏, 编辑
摘要:An advanced book list for Windows Live Spaces. 1. The text to show can be given by the owner or from Amazon if ISBNs are provided. 2. All the texts will link to some place - if you need them to do so. 3. The format of texts can be defined by the ower by 'template'. 4. The owner can give a title to the book list. 5. The owner can set the position of images - left or right. 6. The details can be show/close by a switch for each book. 阅读全文

一个我在研究Atlas Control Toolkit时做的尝试:ImageGalleryExtender

2006-09-21 07:37 by Jeffrey Zhao, 2330 阅读, 收藏, 编辑
摘要:ImageGalleryExtender是我在研究Atlas Control Toolkit代码时的一个尝试。这个Extender的作用是能够轻松地制作一个相册浏览的功能。 阅读全文