Prever Start

示例 http://prever.vilic.info/
因发现空间不稳定,正在转移,请暂时访问 http://prever.a62.huyi5.com/

没钱续费啦… 所以Demo就没啦…

话说前段时间发生了一件很尴尬的事情… 当时Chrome版本号是10, 但是打开Prever的时候却提示浏览器版本太低… 因为当年在写UA的正则的时候, 完全没有考虑到这版本号跑得那么快, 就直接\d没有+, 悲痛… 不过除此之外, Prever还是非常令人欣慰的, 在09年就兼容了IE9, 目前为止在主流浏览器上还不存在什么大问题.

GitHub https://github.com/vilic/prever-start

Prever Start是我高中时期JavaScript方面的代表作,以下为截图及简介。

截图

start

desktop

filemanager1

filemanager2

unzip

upload

imageviewer

简介

运行环境

服务器:

  • ASP.NET2.0

客户端:

  • Internet Explorer 7+(如果机器性能不错,推荐IE8)
  • Chrome 2+
  • Safari 4+
  • Firefox 3+

配置及安装

将“Prever Start”文件夹中的内容复制到网站根目录,并将默认页面设置为Index.htm即可。也可以根据需要在App_Code/Settings.cs文件中修改。

引子

Prever Start是一款以“网页操作系统”为准线开发的基于JS和ASP.NET2.0的Web应用程序。如同此版本的名称Start一样,Prever Start是一次探索。截止目前,Prever Start经过了4个多月的开发,虽然没有达到预期的完成度,但它的大部分构想已经得到了实现。下面就Prever Start中一些我认为比较有价值的创意举例说明。

文件系统

在文件系统中,文件夹不再只是一个简单的目录,它们同文件一样,可以拥有扩展名。其中最常见的文件夹扩展名是psp,它的含义是Prever Script Program。同时,如果分析代码,会发现,Prever Start并没有对扩展名是psp的文件在打开时进行特殊判断,但它仍能被正确运行。因为Prever Start的注册文件中,以“#psp”的形式储存了扩展名为psp的文件夹的打开方式,并且调用了相应的程序进行来运行目标程序。也就是说,通过文件系统打开一个程序,实际上通过了几个步骤:

  • 匹配类型及扩展名,通过注册信息获得打开方式。
  • 以包含程序目录的参数打开“‘程序加载’程序”。
  • 由“‘程序加载’程序”打开目标程序。

看起来似乎有点繁琐,但因为尽量避免特殊化,Prever Start被赋予了更多的扩展性。lnk(快捷方式)文件也使用了类似的方式打开。与psp文件夹类似的,可以通过修改注册文件定义更多类型的文件或文件夹的打开方式和图标。另外,还可以通过修改注册信息给特定,或者非特定的文件或文件夹添加右键菜单项。比如Prever Start中的文件解压就是用了这一功能。

除此之外,Prever Start还使用了一种我称之为“虚拟目录”的目录表示方式(类似于“System:\XXX”和“Disk:\XXX”)。几乎所有的文件处理都通过了这种表示方式,使得目录更加清晰明了。同时,这些目录可以指向非网站目录,保护了其中的文件安全。

程序-窗口

在前面的说明中,已经透露了Prever Start中的可执行文件(夹),*.psp,那么,下面就Prever Start中的程序来说一下。一开始,Prever Start中的窗口是随程序被创建时自动添加的,一次偶然看到了OOS(国外的一款WebOS)的示例程序的代码,突然意识到在以后的开发中,这种窗口创建方式会使程序的扩展十分被动,特别是当需要多个窗口时。所以痛下决心,对Prever Start进行了一次大规模的重写,使得窗口与程序获得较为完美的融合。Prever Start目前拥有三种类型的窗口(分别是Normal、Popup和Elementary),它们都继承于同一个“基窗口”,所以,都拥有一个窗口基本的属性、方法与事件。而窗口的最大亮点在于次序模式和定位模式。次序模式的不同使得不同次序等级的窗口之间不会出现前后顺序的交换。这样以来便可以通过简单的设置做出悬浮窗口或是紧贴桌面的窗口(其实,桌面也是一个普通的窗口,只是它的次序模式为最底层)。另外,Prever Start还为窗口提供了9种定位模式,默认为中心。这一点可以在参见“时间与日期程序”的设置。

程序-控件

我想这是一个不错的想法,Prever Start中的控件类似于普通程序,文件夹扩展名为psc,它的含义是Prever Script Control。如果你愿意,psc可以像psp一样运行(前提是编写是考虑了这一点),因为psc的结构和psp是完全一样的。只不过从期望上,psc需要psp作为“容器”才能运行。另外,很多时候,它们拥有更多共享属性、方法和事件来与其宿主程序保持通讯。目前我写了两个控件,一个是Prever.FileManager.psc,另一个是Prever.FileSelector.psc,这两个控件在Prever Start中都被多次使用,减少了不少代码量,自然也就节约了不少开发时间。

注册信息

在前文中已经提到过了Prever Start中的注册信息。从广义上讲,Prever Start的注册信息分为文本方式的和文件方式的。比如,图标、打开方式、右键菜单、控件以及程序的注册都是通过文本的方式保存的(其实一直打算换成mdb来保存,但光阴不等人啊),而启动项则是以文件的形式来保存的,类似于Window里的“启动”文件夹。在Prever Start完成基本的加载后,就会依次打开其中的文件(绝大多数时候使用lnk文件,当然,要直接使用可执行的psp或者一般的文件也是可以的)。就目前,Prever Start的注册信息还比较简单,也还没有写操作注册信息的类库,当然主要是时间问题,相信以后会得到改进。

非原创部分

Prever Start中使用了以下一些非原创内容(如有遗漏,请见谅)。

  • ICSharpCode.SharpZipLib.dll 用于实现文件解压
  • Newtonsoft.Json.dll 用于处理JSON
  • Prever.IdentifyEncoding 类,用于文本文件编码判断
  • JSON.js 用于处理JSON
  • 部分图片(部分壁纸和“图片浏览器”图标中的风景画)

致谢

在Prever Start的开发过程中,查阅了不少资料,而这些资料,多数来自Google和Baidu,所以,首先感谢这两个搜索引擎,它们使Prever Start一次次地跨过了困难。然后,感谢QQ群里及其他方式接触到的热心的大牛和非大牛们,因为你们的帮助,我才能够高效地解决遇到的疑难问题。特别要感谢Wait、刘春龙、Franky,是你们让我的Web技能一步步攀升。接着是聂爱明同学,感谢你在学校暑假补课期间借给我笔记本电脑,让我顺利完成Prever Start的一次大改。另外,感谢我的老师,感谢你们对我的理解和支持,让我能够将更多的精力投入到Prever Start中来。最后,感谢我的家人,在这样一个以分数论成败的教育下,感谢你们能体谅我的选择,让我可以坚持自己的做法。

设计及开发者:Vilic Vane

2009.10.2

36 thoughts on “Prever Start”

  1. @耗子:
    嗯, 谢谢, 我也不谦虚了. 其实也觉得挺可惜的, Prever Start的开放性没能得到体现, 就那几个应用程序, 还有我那没有完成的类库… 如果有机会做Prever的下一个版本的话, 希望能更好~

  2. 做的挺好的,不过我有一个建议。当时我也做过类似的产品,前面当然也会有Loading条,加载一些图片、JS等等资源,但是第二次打开时,若使用了缓存,立即就进入了桌面,没有了“华丽的”加载界面,因此全部设置了禁止缓存(或者服务器本身就自己禁止了所有缓存),这样即有了华丽的加载界面,要是文件更新了,也不同告诉用户去更新缓存。实际上,用户并不希望看到Loading界面,他们希望越快越好,甚至没有Loading..所以我的建议时,使用缓存技术。可以在最初获取个无缓存的文件列表,对比文件版本,如果不同,则重新从服务器获取,若相同,就不再再次下载,这样进入速度能快很多,甚至没有加载界面。虽然没有了加载界面,但是软件最终是为了用户着想,咱们也不能强加给用户每次都要看加载界面吧(希望Prever Start 可以使用浏览器缓存技术) :)

  3. @宇博 嗯, 谢谢提醒. 之前也有朋友说过这一点, 不过后来没有继续开发了, 如果Prever有机会出第二版的话, 会使用的. 呵呵.

  4. Vilic同学你好,因有人推荐你,所以找到了你的博客,我是腾讯WebQQ和Q+团队的,是否有兴趣来我们团队实习和工作?有兴趣请发简历到我邮箱Kinvix[a]QQ.com

Leave a Reply

Your email address will not be published. Required fields are marked *

Note: You can reply a specific commenter by using "@+user+blank" grammar (case sensitive), and then an email will be sent to notify he/she that you have replied.