通过实例解析js简易模块加载器


Posted in Javascript onJune 17, 2019

前端模块化

关注前端技术发展的各位亲们,肯定对模块化开发这个名词不陌生。随着前端工程越来越复杂,代码越来越多,模块化成了必不可免的趋势。

各种标准

由于javascript本身并没有制定相关标准(当然es6已经有了import和export),所以在模块化方面诞生了各种不同的规范。主要有AMD规范(随requirejs诞生而普及),CMD规范(随seajs的出现而普及),commonjs(主要用于node,并不适合前端)。至于以上几种规范的异同,无耻的我在这里就不多费口水了,请还不了解的亲们自行去找google爸爸。

简易模块加载器示例

G点来了!

接下来我们先来看一段建议模块加载器的示例代码:

let Module = (() => {
let module_list = {};
function define(name,rely,callback){
if (module_list[name]){
console.log("The module have already existed!")
}else{
for(let i = 0;i < rely.length;i++){
rely[i] = module_list[rely[i]];
}
module_list[name] = callback.apply(callback,rely);
}
}
function require(name){
if (module_list[name]){
return module_list[name]
}else{
console.log("There is no such module!")
}
}
let api = {
"define":define,
"require":require
};
return api;
})();

以上是加载器的实现,再来看看如何使用吧:

Module.define("test",[],()=>{
function sayHello(name){
return name+",你好啊";
}
return {
"sayHello":sayHello
}
})
Module.define("haha",[],()=>{
function gotoHZ(name){
return name+"要去杭州玩了";
}
return {
"gotoHZ":gotoHZ
}
})
Module.define("my_module",["test","haha"],(test,haha)=>{
let name = "andrew";
function sayHello2() {
let str = test.sayHello(name);
console.log(haha.gotoHZ("章炜"))
str = str + ",今天天气不错噢";
return str;
}
return {
"sayHello2":sayHello2
}
})
console.log(Module.require('my_module').sayHello2())
console.log(Module.require('test').sayHello("steve"))

在以上代码中,我们定义了三个模块,分别名为test,haha,my_module。看到这里的你,如果js基础不好,可能是一脸懵逼,脑子绕晕...先不急,让我们来看看运行的结果:

通过实例解析js简易模块加载器

结果很简单,打印了一些我们想要的信息。

代码分析

接下来我们详细来解析一下代码原理。

加载器中的几个重点,

1.dule_list

module_list是一个对象,用于存储定义的模块,以模块名:callback这样
的键值对的形式存储;

2.fine函数

然后我们定义了一个define函数,其三个参数分别为模块名、此模块依赖列表、此模块回调函数,当我们调用define函数时,首先先去检查module_list对
象中是否已经有同名模块,如果有,直接告诉用户该模块名字已被使用,如果没有,我们循环依赖列表rely,循环中的操作用于将依赖列表从名称列表转换为真正的模块列表,然后利用apply函数,将其逐个传入到定义好的callback函数中。

3.quire函数

由于我们的module_list存在于内部作用域,保证了模块的私密性,外部并不能
直接操作模块列表去读取模块,因此我们定义了一个require函数,利用闭包来读取操作相应模块

4.解析

Module.define("my_module",["test","haha"],(test,haha)=>{
let name = "andrew";
function sayHello2() {
let str = test.sayHello(name);
console.log(haha.gotoHZ("章炜"))
str = str + ",今天天气不错噢";
return str;
}
return {
"sayHello2":sayHello2
}
})

这里我们定义了my_module模块,它依赖的模块有test、haha两个模块,而在回调函数中,我们将这两个模块传入,可以看到我们能调用test模块的sayHello方法,可以调用haha模块的gotoHZ方法,至此,一个简单的模块加载器就实现了。

结语

这个简单的模块加载器只是很简化的介绍了模块加载器实现的基本原理,成熟的模块加载器当然是要复杂得多,但是原理了解了,才是最重要,不是嘛~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
模拟select的代码
Oct 19 Javascript
基于dom编程中 动态创建与删除元素的使用
Apr 17 Javascript
js代码实现的加入收藏效果并兼容主流浏览器
Jun 23 Javascript
JavaScript 2048 游戏实例代码(简单易懂)
Mar 25 Javascript
jQuery tagsinput在h5邮件客户端中应用详解
Sep 26 Javascript
用iframe实现不刷新整个页面上传图片的实例
Nov 18 Javascript
微信页面倒计时代码(解决safari不兼容date的问题)
Dec 13 Javascript
微信小程序promsie.all和promise顺序执行
Oct 27 Javascript
微信小程序实现的picker多级联动功能示例
May 23 Javascript
layui监听单元格编辑前后交互的例子
Sep 16 Javascript
layer.alert自定义关闭回调事件的方法
Sep 27 Javascript
使用vscode快速建立vue模板过程详解
Oct 10 Javascript
如何从头实现一个node.js的koa框架
Jun 17 #Javascript
javascript定时器的简单应用示例【控制方块移动】
Jun 17 #Javascript
深入解析koa之异步回调处理
Jun 17 #Javascript
JS中数据结构与算法---排序算法(Sort Algorithm)实例详解
Jun 17 #Javascript
详解element-ui设置下拉选择切换必填和非必填
Jun 17 #Javascript
JS实现的字符串数组去重功能小结
Jun 17 #Javascript
JavaScript静态作用域和动态作用域实例详解
Jun 17 #Javascript
You might like
上传多个文件的PHP脚本
2006/11/26 PHP
php 远程图片保存到本地的函数类
2008/12/08 PHP
PHP使用redis消息队列发布微博的方法示例
2017/06/22 PHP
找到了一篇jQuery与Prototype并存的冲突的解决方法
2007/08/29 Javascript
javascript 四则运算精度修正函数代码
2010/05/31 Javascript
如何判断元素是否为HTMLElement元素
2013/12/06 Javascript
javascript表单验证使用示例(javascript验证邮箱)
2014/01/07 Javascript
jQuery中bind与live的用法及区别小结
2014/01/27 Javascript
JS实现5秒钟自动封锁div层的方法
2015/02/20 Javascript
jquery ztree实现树的搜索功能
2016/02/25 Javascript
Angular2 (RC5) 路由与导航详解
2016/09/21 Javascript
jQuery中checkbox反复调用attr('checked', true/false)只有第一次生效的解决方法
2016/11/16 Javascript
JavaScript异步加载问题总结
2018/02/17 Javascript
vuex实现登录状态的存储,未登录状态不允许浏览的方法
2018/03/09 Javascript
Vue中对比scoped css和css module的区别
2018/05/17 Javascript
vuejs 切换导航条高亮(路由菜单高亮)的方法示例
2018/05/29 Javascript
Vue在页面数据渲染完成之后的调用方法
2018/09/11 Javascript
详解JavaScript 的执行机制
2020/09/18 Javascript
使用Python压缩和解压缩zip文件的教程
2015/05/06 Python
深入理解Python中各种方法的运作原理
2015/06/15 Python
Python Django框架实现应用添加logging日志操作示例
2019/05/17 Python
Python集中化管理平台Ansible介绍与YAML简介
2019/06/12 Python
pytorch之添加BN的实现
2020/01/06 Python
python实现删除列表中某个元素的3种方法
2020/01/15 Python
python实现加密的方式总结
2020/01/19 Python
python 日志 logging模块详细解析
2020/03/31 Python
Django数据库迁移常见使用方法
2020/11/12 Python
Python之多进程与多线程的使用
2021/02/23 Python
HTML5 script元素async、defer异步加载使用介绍
2013/08/23 HTML / CSS
总裁助理岗位职责
2014/02/17 职场文书
洗发水广告词
2014/03/13 职场文书
节约能源标语
2014/06/17 职场文书
民主评议党员自我鉴定
2014/10/21 职场文书
导游词之塘栖古镇
2019/12/04 职场文书
解决mysql模糊查询索引失效问题的几种方法
2021/06/18 MySQL
nginx反向代理配置去除前缀案例教程
2021/07/26 Servers