通过实例解析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 相关文章推荐
同一个表单 根据要求递交到不同页面的实现方法小结
Aug 05 Javascript
关于IE浏览器以及Firefox下的javascript冒泡事件的响应层级
Oct 14 Javascript
javascript中的作用域scope介绍
Dec 28 Javascript
window.open不被拦截的实现代码
Aug 22 Javascript
浅析jQuery中调用ajax方法时在不同浏览器中遇到的问题
Jun 11 Javascript
jQuery实现字符串全部替换的方法
Dec 12 Javascript
webpack入门必知必会
Jan 16 Javascript
jquery实现楼层滚动效果
Jan 01 jQuery
浅谈React中组件间抽象
Jan 27 Javascript
稍微学一下Vue的数据响应式(Vue2及Vue3区别)
Nov 21 Javascript
JSONObject与JSONArray使用方法解析
Sep 28 Javascript
vue打包时去掉所有的console.log
Apr 10 Vue.js
如何从头实现一个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
第十节 抽象方法和抽象类 [10]
2006/10/09 PHP
php之对抗Web扫描器的脚本技巧
2008/10/01 PHP
PHP explode()函数用法、切分字符串
2012/10/03 PHP
PHP URL路由类实例
2013/11/12 PHP
js+php实现静态页面实时调用用户登陆状态的方法
2015/01/04 PHP
php常用表单验证类用法实例
2015/06/18 PHP
定义select的边框颜色
2008/04/28 Javascript
safari,opera嵌入iframe页面cookie读取问题解决方法
2010/06/23 Javascript
根据身份证号自动输出相关信息(籍贯,出身日期,性别)
2013/11/15 Javascript
浅谈Sticky组件的改进实现
2016/03/22 Javascript
使用React实现轮播效果组件示例代码
2016/09/05 Javascript
AngularJS ngModel实现指令与输入直接的数据通信
2016/09/21 Javascript
微信小程序排坑指南详解
2018/05/23 Javascript
JavaScript封闭函数及常用内置对象示例
2019/05/13 Javascript
Vue.js中该如何自己维护路由跳转记录
2019/05/19 Javascript
小程序如何写动态标签的实现方法
2020/02/05 Javascript
vue+element 实现商城主题开发的示例代码
2020/03/26 Javascript
小程序实现多个选项卡切换
2020/06/19 Javascript
Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍
2014/06/10 Python
Python中Django发送带图片和附件的邮件
2017/03/31 Python
使用python对excle和json互相转换的示例
2018/10/23 Python
全球第二大家装零售商:Lowe’s
2018/01/13 全球购物
Python的两道面试题
2013/06/29 面试题
顶岗实习计划书
2014/01/10 职场文书
迟到检讨书1000字
2014/01/15 职场文书
简历中自我评价怎么写
2014/02/12 职场文书
关于颐和园的导游词
2015/01/30 职场文书
幼儿园重阳节活动总结
2015/05/05 职场文书
走近毛泽东观后感
2015/06/04 职场文书
如何用Node.js编写内存效率高的应用程序
2021/04/30 Javascript
JavaWeb 入门篇(3)ServletContext 详解 具体应用
2021/07/16 Java/Android
python的变量和简单数字类型详解
2021/09/15 Python
《辉夜大小姐想让我告白》第三季正式预告
2022/03/20 日漫
Redis 哨兵机制及配置实现
2022/03/25 Redis
分享python函数常见关键字
2022/04/26 Python
js 实现验证码输入框示例详解
2022/09/23 Javascript