国庆几天因计划变故未出游, 在家对javascript作了一些研究,产生了一个有趣的想法。我写了一个迷你的 javascript 库(基于prototpye)实现了它。我称这个库为Jscp - javascript client page。使用 Jscp, 可以把 render 页面模版与数据以生成最终页面的工作移到客户端进行,也就是说,在浏览器中进行这项工作。
传统的服务模型:
1. client --- 发送请求 ---> server
2. client(等待) server (服务请求,产生结果数据)
3. client(等待) server (将数据与页面模版进行rendering)
4. client <--- 接收结果页面 --- server
使用 Jscp,服务模型变成:
1. client --- 发送请求 ---> server
2. client <--- 接收页面模版 --- server (页面模版可以被缓存以多次使用)
3. client --- 发送请求---> server
4. client(等待) server (服务请求,产生结果数据)
5. client <--- 接收结果数据--- server (数据使用 JSON 格式)
6. client (将数据与页面模版进行rendering) server
我想这个模型在服务端与客户端之间提供了更清晰的接口。运行在服务端的代码集中于完成请求,产生正确的结果数据,用标准的JSON格式返回。与页面模版融合并显示的代码则运行在客户端(虽然代码的部署仍然是在服务器上)。我不清楚是否已经有某个javascript库实现了该特性,我找了但没有发现。(Prototype 虽然对JSON有简单支持,但其并没有用来实现Jscp中的特性)
下面是一个简单的例子对比两种模型下的代码:
使用 PHP, .php中代码类似如下:
... <? for i=0; i<3; ++i { ?>
... <? echo res[i].'/r/n' ?>
... <? } ?>
使用 Ruby on Rails, .rhtml中代码类似如下:
... <% 1.to(3) do { |i| %>
... <%= @res[i] %>
... <% } %>
使用 Jscp, 模板页面(.jscp.html)中的代码类似如下: (使用javascript)
... <%INC ../layout_header.htm %>
... <% var r=_RENDER_DATA; %>
... <% for i=0; i<3; ++i { %>
... <%= r.res[i] %>
... <% } %>
... <%INC ../layout_foot.htm %>
通过把rendering的工作移到浏览器端,许多效果可以很容易的实现,比如浏览器端分页,列表排序等。Jscp并不与其它的Ajax技术冲突,因为它是位于它们的底层的。
我在sourceforge.net上为JSCP注册了项目,源码、文档、及例子可以访问以下网页获得。