K_Reverter的网页开发记录

要么不做,要么就当作艺术品来做!

Jla框架介绍(二) 核心和基本规范

    这一篇将介绍Jla框架的核心,在此之前,先要介绍"Jla"这个名称,全称是"JavaScript Lazy App",这个框架的核心是将一系列代码单元组合起来,在页面上按需加载,也就是通俗提到的"懒载入",这也就是这个名字的由来。
    当我们来仔细审视JavaScript相对于其他语言的特点时,我们会发现,安全性和对懒载入的支持是我们不能忽视的特性,安全性是指用户通常会信任JavaScript脚本的运行,因此运行的平台非常广泛,而懒载入则使得我们在开发之中,可以灵活的控制程序单元从服务端流向客户端的过程,这样,就为使用JavaScript进行大型项目的开发提供了可能。
    在现在,越来越多的桌面应用程序正在改为BS模式,原来的程序可能是几十兆甚至上百兆,这种情况下,如果通过BS模式一次加载所有的功能到页面上,会给客户端带来非常不好的用户体验,对服务器的压力也挺大,而且其中的大部分功能未必用户真正能用得上,因此我们最好是将程序进行分拆,任何功能都是在需要的时候再加载,例如点击按钮之后执行的操作等。
    Jla框架正是为解决这个问题而设计的框架,我们先看看该框架是怎么定义的:
    在Jla框架之中,一个程序由众多的代码单元组成,每个代码单元应该是这样的模式:

 1     Jla.require(["namespace.ClassA","namespace.ClassB"],2,function(ClassA,ClassB)
 2     {
 3         //code of ClassD start
 4         function App()
 5         {
 6         }
 7         App.prototype.onClick=function()
 8         {
 9             Jla.require(["namespace.ClassC"],1,function(ClassC)
10             {
11                 //调用ClassC.完成点击之后执行的操作
12             })
13         }
14         //code of ClassD End
15         Jla.set("namespace.ClassD",App);
16     })

 

 

    从上面的代码单元来看,这个代码单元是定义了一个类,这个类的命名空间是namespace.ClassD,通过Jla.set来向框架之中注册这个命名空间,这个类使用到了两个Jla.require方法,代表这个类在运行时会依赖其他的类。
    当一个类需要调用其他类的时候,要求使用Jla.require模式,该模式有三个参数:
    参数1是一个命名空间数组,代表需要调用哪几个类
    参数2是依赖的类型,有三种类型:
        值1代表应该立即去获取该类,并在获取完成之后执行回调函数,主要用在需要懒载入的情况,例如点击按钮之后执行的函数等
        值2代表的含义和1相同,但是进一步建议在代码发布时应该将这几个类也打包在一起(意味着依赖程度太高,不建议使用动态加载),主要用在一个类必须引用另一个类才能运行的情况下
        值0代表不需要主动去加载该类,但假如该类已经加载或者后面被其他的类引用加载,则执行回调函数,用的比较少,主要用在一些事件绑定过程上。
    参数3是回调函数,在需要的类都加载完成后,会自动执行回调函数,而且会将需要的类列表作为回调函数的参数传递,这样就可以直接使用那些类,而不需要再次执行
    虽然以上的代码非常简单,实际上也就使用了Jla.require和Jla.set两个函数,但这段代码已经完整表达了Jla框架的核心规范,我简单的描述一下这个核心所定义的规范:
    1.不要直接调用一个类,对外部类的引用都应该通过Jla.require来引用,虽然你可能直接通过命名空间或者Jla.get(namespace)调用到那个类,因为这样就破坏了规范,而且如果你调用的时候该类还没有加载完成,就会出现异常;
    2.每个代码单元都应该明确在实现自己的逻辑的过程中需要依赖哪几个类,依赖程度如何,只有对这些能明确下来,才能保证最后应用程序只会载入需要的逻辑单元;
    3.每个类都只应该关心自己实现的逻辑,而不需要关注最终的程序是什么样子的,这样才能保证每一个代码单元的重用性。
    这个框架规范比较简单,仅仅拿着这个框架去开发会遇到一些麻烦,但是实际上这已经是一个完整的开发框架,后面我继续描述的内容比较多,但都是依赖这个框架的应用,并不是对这个框架的补充。

posted on 2011-01-15 13:09 K_Reverter 阅读(1192) 评论(4) 编辑 收藏

评论

#1楼 2011-01-15 13:27 悠远的天空      

顶一下,期待Jla框架的代码,以及它的使用示例。  回复 引用 查看   

#2楼 2011-01-15 13:40 梦想      

呵呵,支持一下!  回复 引用 查看   

#3楼 2011-01-15 15:38 JKisJK      

“值0代表不需要主动去加载该类”
----这一点比较有新意。赞。
“值2代表的含义...是...建议在代码发布时应该将这几个类也打包在一起”
----“发布时打包”的建议不应该由写代码的人来,有点怪。
----多个js文件合成一个,可以在发布代码时打包;也可以由客户端与服务端合作来合并请求,请求时在服务端即时打包(例如,指把a.js、b.js两个请求合并成一个combo.php?url=a.js,b.js)。如果建议的是后者,还说得通。要是建议前者,就不和谐了。
 回复 引用 查看   

#4楼[楼主] 2011-01-15 16:22 K_Reverter      

@JKisJK
一个代码单元对另一个单元的依赖,有多种,我详细说一下:
a.假如类A 继承了类B,或者类A在构造函数之中调用了B,那么A在定义的时候必须B已经存在,这种情况下,A的运行无论如何也是需要有B的存在,所以假如客户端请求A的时候,B应该立即带上,以免需要多发一次请求,这是参数2的情况

b.假如类A在运行时,遇到一些特定的事件,例如按钮点击、状态判断等情况下才需要类B,这种就允许在这些事件发生之后再去请求B单元,这是参数1的情况

c.假如类A是一个在页面上显示log的类,类B是一个log管理类,类B提供了一个B.log(string)的方法来让其他的类调用以记录日志,A必须监视B的事件来在B的log方法被调用的时候做出响应,这种情况下,A依赖B,但是假如B还没有加载,A不会主动去加载,只要B加载了,A必须立即绑定其事件,这就是参数0的情况

我想说的是,A对B的依赖究竟是哪种模式,其实只有A自己才知道,代码打包的时候很难分析出来,因此我只能采用以下方案:

1.如果要使用代码打包发布,在页面上任何地方调用require的时候必须用<常量>的命名空间字符串,而且正确的指定require类型
2.我希望这个框架不应该太过依赖服务端,按照你说的服务端模式来提供服务当然更好更灵活,也是我建议的模式,但是这个框架必须支持静态文件的部署模式,也就是说,我开发一个打包程序,分析代码单元之中的require使用情况,得到单元之间的依赖关系,然后将整个程序按照依赖关系打包成为一个或多个静态的Js文件,这样使用更稳定,应用范围也就很广了
 回复 引用 查看