首页 web前端 js教程 javascript动态加载实现方法一_javascript技巧

javascript动态加载实现方法一_javascript技巧

May 16, 2016 pm 05:50 PM
动态加载

现在也有很多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标签写成JS动态引入的?或者,只为少写几个字符?

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









等等等等。

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

$.getScript("user.js",function(){});

这样,我们就做到页面文件里面只需要引入
复制代码 代码如下:



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

$.getScript("user.js",function(){
$.getScript("order.js",function(){
$.getScript("type.js",function(){
$.getScript("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")的时候执行,那么
复制代码 代码如下:

Using("User");
Using("Order");
Using("Type");
Using("Validate");
// and so on..

这一段我就需要异步载入4个文件,虽然是异步的,但是未免有些麻烦?而且需要创建4个链接。你愿意合并JS的话,也可以。而且,Using的时候我是不需要使用对象的,这个时候未免太浪费资源了?

至于这个问题,我的解决办法就是学习hibernate,延迟加载,按需加载。
那么怎么做呢?
复制代码 代码如下:

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加载完毕之后才执行的。

起码第二种看起来更像java式的代码,不必理会其他非业务相关的代码。

那么,怎么会知道需要的对象在什么地方,怎么加载进来?我能想到的就是模拟一个配置文件,为什么用配置文件,而不是像In.js用add函数或者其他框架的类似于register的函数,大概我只是想用配置文件,更像java,而且后期的修改起来也会更解耦一些吧。
复制代码 代码如下:

Using.Config = {
"User" : "/js/user" // 可以隐去.js 因为肯定是加载JS文件了
}

整个思路大概就是这个样子,我在其基础上进行了一些约束,比如加入了命名空间
复制代码 代码如下:

var u = new Using.Modules.User();

这样可以减少一些全局变量,而且有需要的话,可以插入一些所有对象可能都具有的共性,减少创建类时的重复编码。

当然,也还是支持不使用命名空间的。

为了解决这个约束的效力,加入了Class.create函数来进行类创建约束。
复制代码 代码如下:

Using.Class.create("User",function(){
}).property({
}).static({
}).namespace(Using.Modules);

这里的大概意思就是

create(类名,构造函数)
property(类的属性)
static(类的静态属性)
namespace(命名空间)

引申到此,为何不加入MVC形式?
后来我发现,要MVC,那么几个类之间的动态维护,或者创建之时就由Using这个类来自动维护,暂时还没想到好的解决办法,所以没有加入其中,只能自己创建类,自己维护了.

通过上面的文字,最后得到一个Using.js
然后在页面里面就只需要引入一个
复制代码 代码如下:



这样接下来就可以写
复制代码 代码如下:

Using("jquery");
Using("User");

$("#ID").click(function(){
var user = new User();
user.name = "xx";
user.show();
});
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
2 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Python实现无头浏览器采集应用的页面动态加载与异步请求处理功能解析 Python实现无头浏览器采集应用的页面动态加载与异步请求处理功能解析 Aug 08, 2023 am 10:16 AM

Python实现无头浏览器采集应用的页面动态加载与异步请求处理功能解析在网络爬虫中,有时候需要采集使用了动态加载或者异步请求的页面内容。传统的爬虫工具对于这类页面的处理存在一定的局限性,无法准确获取到页面上通过JavaScript生成的内容。而使用无头浏览器则可以解决这个问题。本文将介绍如何使用Python实现无头浏览器来采集使用动态加载与异步请求的页面内容

Vue中如何处理组件的动态加载和切换 Vue中如何处理组件的动态加载和切换 Oct 15, 2023 pm 04:34 PM

Vue中处理组件的动态加载和切换Vue是一个流行的JavaScript框架,它提供了各种灵活的功能来处理组件的动态加载和切换。在本文中,我们将讨论一些Vue中处理组件动态加载和切换的方法,并提供具体的代码示例。动态加载组件是指根据需要在运行时动态加载组件。这样可以提高应用程序的性能和加载速度,因为只有当需要时才会加载相关的组件。Vue提供了async和awa

揭秘Golang热更新原理:动态加载与重载的内幕讲解 揭秘Golang热更新原理:动态加载与重载的内幕讲解 Jan 20, 2024 am 10:09 AM

Golang热更新原理探究:动态加载与重载的奥秘引言:在软件开发领域,程序员们经常希望能够在不重启应用的情况下进行代码修改和更新。这样的需求对于开发效率和系统运行的可靠性都具有重要意义。而Golang作为一门现代化的编程语言,为开发者提供了许多便捷的机制来实现热更新。本文将深入探讨Golang热更新的原理,特别是动态加载和重载的奥秘,并将结合具体的代码示例进

如何使用Vue和Element-UI创建动态加载数据的表格 如何使用Vue和Element-UI创建动态加载数据的表格 Jul 21, 2023 pm 11:49 PM

如何使用Vue和Element-UI创建动态加载数据的表格在现代的Web开发中,数据表格是常见的界面组件之一。Vue.js是当下非常流行的前端框架,而Element-UI是基于Vue.js开发的一套组件库,提供了丰富的UI组件供我们使用。本文将介绍如何使用Vue和Element-UI来创建一个可以动态加载数据的表格,并且给出相应的代码示例。首先,我们需要安装

解决Vue报错:无法正确使用Vue Router根据路由参数动态加载组件 解决Vue报错:无法正确使用Vue Router根据路由参数动态加载组件 Aug 20, 2023 am 08:09 AM

解决Vue报错:无法正确使用VueRouter根据路由参数动态加载组件在使用VueRouter进行路由跳转的过程中,有时我们需要根据路由参数动态加载组件。但是,有些情况下,我们可能会遇到一个常见的错误:无法正确使用VueRouter根据路由参数动态加载组件。本文将介绍如何解决这个报错,并提供代码示例。首先,我们需要明确一点:VueRouter可以通过

phpSpider实用技巧:如何处理网页内容的动态加载问题? phpSpider实用技巧:如何处理网页内容的动态加载问题? Jul 22, 2023 am 08:33 AM

phpSpider实用技巧:如何处理网页内容的动态加载问题?在爬取网页数据时,经常会遇到动态加载的内容无法直接通过爬虫获取的问题。这些动态加载的内容可以是通过AJAX请求获取的数据、通过JavaScript进行渲染的DOM元素等。为了解决这个问题,本文将介绍一些在使用phpSpider时处理网页动态加载问题的实用技巧。一、使用网络调试工具查找动态加载的URL

C#中如何使用反射和动态加载程序集 C#中如何使用反射和动态加载程序集 Oct 08, 2023 pm 12:12 PM

C#中如何使用反射和动态加载程序集引言:在C#中,反射(Reflection)是一种强大的机制,它允许我们在运行时获取和操作程序的元数据,包括类型信息、成员信息等。而动态加载程序集则是通过反射来实现的一种常见应用,并且在一些特定场景中非常有用。本文将详细介绍C#中如何使用反射和动态加载程序集,并提供具体的代码示例。反射的基本概念反射是C#语言中的一项重要功能

Java实现多级联动表单的动态加载与更新 Java实现多级联动表单的动态加载与更新 Aug 07, 2023 pm 05:13 PM

Java实现多级联动表单的动态加载与更新背景:在开发Web应用时,经常会遇到需要实现多级联动表单的场景,例如省市县三级联动的选择。在这样的表单中,当用户选择上级选项后,下级选项会根据用户的选择自动加载并更新。这种功能能够有效减少用户的输入工作量,提高用户体验。本文将使用Java语言演示如何通过动态加载和更新来实现多级联动表单。实现思路:定义数据模型:首先需要

See all articles