随笔-68  评论-569  文章-4  trackbacks-32

摘要:

[OpenSource]ScriptLoader: 轻松管理你的js 类库一文发布后,有的园友反映,侵入性还是有点太强。昨天晚上半夜想到一个不错的点子,越想越睡不着,最终还是爬起来把ScriptLoader升级到了V2,这个版本将给你更便利的脚本文件组织体验,增加了自动关联、多语言支持途径、诱人的Syntactic Sugar,使用ScriptLoader将改变你以往的编程习惯^_^。

简介:

ScriptLoaderV2增加一些新特性:

  1. 对Aspx无侵入性的脚本引入机制。
  2. 多语言资源的支持途径。
  3. 让你更容易load module的Syntactic Sugar。

 

无侵入的脚本引入机制:

当前我们的脚本组织方式,一般是每个aspx都会通过script标签引入一些js核心类库,然后在aspx页面里面混杂一些当前页面所需的业务逻辑脚本。

image

这样子的写法导致js和我们的aspx进行了太紧密的结合,同时也不利于整个项目的维护。针对此,ScriptLoader提供了一个HttpModule来结合进行js的引入。当读入WebForm1.aspx的时候会自动帮你Load同目录下的WebForm1.aspx.js文件,因为是经过ScriptLoader导入的,所以具备ScriptLoader的特点,比如缓存,只要你的webForm1.aspx.js最后修改日期没有变,就可以一直利用客户端的缓存。

image

不过你可能会想到这样一种情况:

image

我们经常使用<%=this.TxtName.ClientID%>这种方法来获取服务端控件在客户端的唯一id,那这个情况在外部引入的js是没办法使用的,所以我引入了ScriptLoaderV2的第二个特性。

多语言资源的支持途径:

通过ScriptLoader.SetVariable方法进行赋值。

image

相关的方法还有

image

如果你用到了这个特性,那会产生侵入性了,如果你不想产生侵入性,你也可以使用Asp.Net原始的方法:

image

那这个特性跟多语言又有什么关系呢?

因为这其中有个方法是读取xml配置文件直接设置变量的,xml如下:

image

读入的代码:

image

因此,如果你想对这些变量做根据不同的语言做不同的赋值的话,就可以多写几个config,比如myVars-en-US.config,myVars-zh-cn.config,然后根据不同语言版本载入不同的变量,而js中需要做多语言的都用变量代替字符常量。

image 

当然这还有更好的集成方式,就是把页面组织结构改成如下形式

image

然后就像第一个特性一样,自动根据语言版本载入不同js或者config,目前未增加这个特性,因为还没有办法考虑到有些什么特殊情况,所以还不准备增加此特性,不过这个的修改也是很快的,如果你有需要可以自行下载代码,进行修改,如果能把你的应用情况反馈给我,那自然更好了。时机成熟,我会考虑直接集成进ScriptLoader的代码。

变量的问题解决了,但是每个业务逻辑的js不可能离开一些核心的js类库,比如例子中的image

我需要在当前页面引入jquery类库,那怎么办?为了解决这个问题,ScriptLoader增加第三个特性。

Syntactic Sugar:

所谓Syntactic Sugar,就是一种取巧的做法,有点像Vs2008中的自动属性

image

其实这不是标准的语言库支持的特性,是Vs2008这个IDE为我们提供的一种便利通道。在ScriptLoader中为了解决引入脚本的问题也加入类似的特性:

image

可以看到在WebForm2.aspx.js中的头部,使用了一个叫using的方法,引入了3个在我们lib.config中配置的js module。

这个Syntactic Sugar只能用在WebForm2.aspx.js这中类型的js中,不是所有js类库都可以使用,ScriptLoader会在为aspx页面注入ScriptLoader的时候,进行分析,然后自动帮你Load这些模块。核心的类库还是必须通过lib.config/user.config进行配置的,这样子你才可以使用using(moduleName)来引入这些脚本。

后记:

我是标题党,呵呵,不要批我的标题。

如果你使用ScriptLoader的这些特性,确实可以改善你的很多js文件组织体验。现在大部分js类库更加关心功能的封装,但是对于js文件的组织管理甚少关注,ScriptLoader就是为了填补这个空白而出现的。

后续的版本会增加更多让你心动的特性,比如ClientCacheManager :)

Examples包含在src发布包中,你也可以通过svn获取ScriptLoader最近的版本

Http://www.sourceforge.net/projects/scriptloader

posted on 2008-06-13 13:24 浪子 阅读(2316) 评论(15)  编辑 收藏 所属分类: ScriptLoader/SmartScript

评论:
#1楼  2008-06-13 14:00 | 巫云      
我也是标题档,沙发

  回复  引用  查看    
#2楼 [楼主] 2008-06-13 14:06 | 浪子      
唉,果然还是标题党比较吸引人,你啥都没注意到,就记得标题党了^_^
--引用--------------------------------------------------
巫云: 我也是标题档,沙发

--------------------------------------------------------

  回复  引用  查看    
#3楼  2008-06-13 14:14 | 9198 [未注册用户]
不赞同,还是直接写简便些。
  回复  引用    
#4楼  2008-06-13 14:35 | 化石 [未注册用户]
在开发富客户端应用的时候,脚本组织确实是一件比较麻烦的事情,楼主的这个东西不错。
不过在开发的时候,为了代码管理方便、或者方便并行开发,往往会生成比较多的js文件;而到了发布的时候,又需要将这些文件合并成几个文件。
您是不是可以考虑一下这样的需求?
  回复  引用    
#5楼 [楼主] 2008-06-13 14:38 | 浪子      
文件生成自动会做合并,你用HttpWatch监视下就知道了

如果你想要把小文件合并,只要配置成依赖关系,保证是在一次性下载的,而且不会重复下载相同的小片段。

如果你没有依赖关系,可以利用ScriptLoader引入js的第三个方式,使用虚拟的聚合文件。
比如我之前的例子中:


只要通过引入XML就实现了将core和burshxml合并的目的,但是xml.js是不存在的,会自动生成一个虚假的空白js文件。


--引用--------------------------------------------------
化石: 在开发富客户端应用的时候,脚本组织确实是一件比较麻烦的事情,楼主的这个东西不错。
不过在开发的时候,为了代码管理方便、或者方便并行开发,往往会生成比较多的js文件;而到了发布的时候,又需要将这些文件合并成几个文件。
您是不是可以考虑一下这样的需求?
--------------------------------------------------------

  回复  引用  查看    
#6楼 [楼主] 2008-06-13 15:15 | 浪子      
@化石 [未注册用户]
其实你的问题很好解决,比如你将WebForm1.aspx.js,分成很多个小文件
假设为
WebForm1.aspx.1.js
WebForm2.aspx.2.js

如果你要实现合并,只要在user.config 里面配置这讲几个节点
Script Name=''WebForm1.aspx.1" Inherit='WebForm1.aspx.1.js'
Script Name=''WebForm1.aspx.2" Inherit='WebForm1.aspx.2.js'

然后在WebForm1.aspx.js中使用以下代码:
using(''WebForm1.aspx.1");
using(''WebForm1.aspx.2");

则他们就会合并在一起下载,而且可以做缓存,除非其中任何一个文件的最后修改时间改变,否则可以一直不要再下载。


  回复  引用  查看    
#7楼  2008-06-13 16:08 | 小生      
樓主的IDE環境不錯﹐能否共享~
  回复  引用  查看    
#8楼 [楼主] 2008-06-13 16:15 | 浪子      
这个是园子里下的vsstylemanager1.0.6 ,你可以search下。

--引用--------------------------------------------------
小生: 樓主的IDE環境不錯﹐能否共享~
--------------------------------------------------------

  回复  引用  查看    
#9楼  2008-06-13 16:56 | 坏人      
多关注核心功能,少做花哨的功能会更好。
  回复  引用  查看    
#10楼 [楼主] 2008-06-13 17:11 | 浪子      
我没有想过做花哨的功能,或许只能说你暂时没有这种需求而已,这些功能都来自实际开发项目的需求。

谢谢!

--引用--------------------------------------------------
坏人: 多关注核心功能,少做花哨的功能会更好。
--------------------------------------------------------

  回复  引用  查看    
#11楼  2008-06-13 19:13 | 红马天下      
一句话,太复杂了!
  回复  引用  查看    
#12楼  2008-06-13 20:55 | 超晨      
上篇文章不知道这个东西要干嘛,这下清除了,很不错的东西啊!
最后合并发布的JS文件有没有压缩?
  回复  引用  查看    
#13楼 [楼主] 2008-06-13 23:25 | 浪子      
现在没有提供压缩,以前的SmartScript有,但是js的压缩无法保证100%正确,有时候会出现问题.所以还是考虑不加入压缩机制,等到有好的算法出现,才考虑.

因为现在对缓存的控制已经很精确了,所以我觉得不压缩也可以接受:)

如果你觉得需要加入压缩可以将SmartScript里面的那个压缩代码拷贝到ScriptLoader的ReadText方法内就可以了:)


--引用--------------------------------------------------
超晨: 上篇文章不知道这个东西要干嘛,这下清除了,很不错的东西啊!
最后合并发布的JS文件有没有压缩?
--------------------------------------------------------

  回复  引用  查看    
#14楼  2008-06-14 08:51 | BruceZhou      
偶菜菜,還不懂,留名收藏
  回复  引用  查看    
#15楼  2008-06-14 10:40 | 4330 [未注册用户]
#11楼 2008-06-13 19:13 | 红马天下

一句话,太复杂了!

确实,简单问题复杂化,垃圾就是这么制造的
  回复  引用    

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-07-01 09:36 编辑过


相关链接: