javascript动态加载实现方法一

现在也有很多JS动态加载的框架,比如In.js。但是这种并不是我想要的编写方式,我来说说我的想法。

先来一段java代码

复制代码 代码如下:


import Biz.User;
User u = new User();
u.show();


按流程就是导包、实例化、调用。

JS是做不了导包的,或者说代码意义上的导包,一般只是在页面上进行script标签的引入。
那么 先假设需要写成这样

复制代码 代码如下:


Using("User");
var u = new User();
u.show();


那么,在JS里面可以实现吗?

来一句一句的分析,当然,前提是页面并不用script标签载入user.js,不然就没意义了。

第一句

Using("User");

为什么用Using,当然只是我的一个命名想法而已,可以联想一下C#,用的就是using,借来而已。

Using里面写入的当然是我需要的对象User,顾名思义,我当然写成Using("User")了。先不说内里是怎么实现的,起码思路是这样。
因为不能模拟关键字写成 Using User;这种起码我是做不到了。
第二句和第三句

复制代码 代码如下:


var u = new User();
u.show();


很正常,就是很平常的实例化与函数调用,唯一不解的是User对象哪里来的?那么当然是第一句导包的时候导入的。


流程就是这么个流程,那么到底能不能实现,关键就在第一句话。也就是说,到底能不能导包成功,而且该怎么导包。

从script标签吸引灵感,对,异步加载所需要的js文件。
也就是说

复制代码 代码如下:


Using("User");


相当于写了一句

复制代码 代码如下:

<script type="text/javascript" src="https://www.jb51.net/user.js"></script>



现在这么看下来,这么做有意义吗?就为把script标签写成JS动态引入的?或者,只为少写几个字符?

当然不能,这么做毫无意义!那要怎么做?
先从效率来讲。
如果一个页面需要载入N多js文件的时候,如下

复制代码 代码如下:


<script type="text/javascript" src="https://www.jb51.net/jquery.min.js"></script>
<script type="text/javascript" src="https://www.jb51.net/view.js"></script>
<script type="text/javascript" src="https://www.jb51.net/register.js"></script>
<script type="text/javascript" src="https://www.jb51.net/validate.js"></script>
<script type="text/javascript" src="https://www.jb51.net/user.js"></script>
<script type="text/javascript" src="https://www.jb51.net/order.js"></script>
<script type="text/javascript" src="https://www.jb51.net/type.js"></script>


等等等等。

是不是很吓人,那是相当吓人,而且后期维护需要很高的成本,有多少页面,可能就需要修改几个页面。那么,当页面只引入关键的几个js文件,其他文件都采用动态载入的方式呢?
比如我们只需要载入jquery文件,然后调用

复制代码 代码如下:


$.getScript("https://www.jb51.net/user.js",function(){});


这样,我们就做到页面文件里面只需要引入

复制代码 代码如下:


<script type="text/javascript" src="https://www.jb51.net/jquery.min.js"></script>


即可。
那么这种写法的坏处在哪里?看一段代码

复制代码 代码如下:


$.getScript("https://www.jb51.net/user.js",function(){
$.getScript("https://www.jb51.net/order.js",function(){
$.getScript("https://www.jb51.net/type.js",function(){
$.getScript("https://www.jb51.net/validate.js",function(){
// and so on..
});
});
});
});


PS:用In.js的watch函数是可以避免这种情况产生的。这不在本博文的考虑范围了。

花眼吗?还愿意去对齐代码吗?即便有格式化工具,你还愿意将闭合括号与哪个$.getScript对应吗?当然不愿意。
那么,仿java的导包形式应声而出。

复制代码 代码如下:


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")的时候执行,那么

复制代码 代码如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wddsxx.html