javascript动态加载
import Biz.User;
User u = new User();
u.show();
按流程就是导包、实例化、调用。
Using("User");
var u = new User();
u.show();
那么,在JS里面可以实现吗?
Using("User");
为什么用Using,当然只是我的一个命名想法而已,可以联想一下C#,用的就是using,借来而已。
var u = new User();
u.show();
很正常,就是很平常的实例化与函数调用,唯一不解的是User对象哪里来的?那么当然是第一句导包的时候导入的。
Using("User");
相当于写了一句
<script type="text/javascript" src="user.js"></script>
现在这么看下来,这么做有意义吗?就为把script标签写成JS动态引入的?或者,只为少写几个字符?
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="view.js"></script>
<script type="text/javascript" src="register.js"></script>
<script type="text/javascript" src="validate.js"></script>
<script type="text/javascript" src="user.js"></script>
<script type="text/javascript" src="order.js"></script>
<script type="text/javascript" src="type.js"></script>
等等等等。
$.getScript("user.js",function(){});
这样,我们就做到页面文件里面只需要引入
<script type="text/javascript" src="jquery.min.js"></script>
即可。
$.getScript("user.js",function(){
$.getScript("order.js",function(){
$.getScript("type.js",function(){
$.getScript("validate.js",function(){
// and so on..
});
});
});
});
PS:用In.js的watch函数是可以避免这种情况产生的。这不在本博文的考虑范围了。
Using("User");
Using("Order");
Using("Type");
Using("Validate");
// and so on..
或者你愿意,你可以
Using("User","Type","Order","Validate",...);
写法问题 无所谓。当然我推荐使用第一种方法,清晰。
var u = new User();
var o = new Order();
// and so on..
但是会提出一个问题。假如异步的加载都在Using("XXX")的时候执行,那么
Using("User");
Using("Order");
Using("Type");
Using("Validate");
// and so on..
这一段我就需要异步载入4个文件,虽然是异步的,但是未免有些麻烦?而且需要创建4个链接。你愿意合并JS的话,也可以。而且,Using的时候我是不需要使用对象的,这个时候未免太浪费资源了?
Using("User");
这个时候肯定是不加载,不加载做什么?当然是返回一个mock,也就是模拟对象。给用户先用着,只有当用户真正需要使用这个对象的时候,再去加载所需的js。也就是说
Using("User"); // 这句话执行完毕之后会创建一个User对象,当时仅仅是个mock
var u = new User(); // 这个时候用需要的是真实的User对象实例,就在这个时候去动态加载JS文件,并且返回已经实例化的User对象
大家都知道,异步加载是与当前运行的状态不冲突的,也就是说
var u = new User();
这句话执行之后,u是一个没有实际意义值的变量,而已。那么,怎么解决这个问题,我暂且想到的办法,只能是采用同步策略了。只有当js加载完毕,再去执行之后的js语句,这个地方有点遗憾,而且同步可能带来的浏览器假死,也是一个比较严重的问题,暂且不顾这些问题,希望以后能有更好的办法解决。
$.getScript("user.js",function(){
var u = new User();
});
单单执行这个语句,要执行到function,本质上也是等user.js加载完毕才会执行,那么对比
var u = new User();
理论上时间应该相当,因为都是等user.js加载完毕之后才执行的。
Using.Config = {
"User" : "/js/user" // 可以隐去.js 因为肯定是加载JS文件了
}
整个思路大概就是这个样子,我在其基础上进行了一些约束,比如加入了命名空间
var u = new Using.Modules.User();
这样可以减少一些全局变量,而且有需要的话,可以插入一些所有对象可能都具有的共性,减少创建类时的重复编码。
当然,也还是支持不使用命名空间的。
Using.Class.create("User",function(){
}).property({
}).static({
}).namespace(Using.Modules);
这里的大概意思就是
<script type="text/javascript" src="using.js"></script>
这样接下来就可以写
Using("jquery");
Using("User");
$("#ID").click(function(){
var user = new User();
user.name = "xx";
user.show();
});