通过实例解析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 相关文章推荐
js prototype截取字符串函数
Apr 01 Javascript
javascript级联下拉列表实例代码(自写)
May 10 Javascript
js加密解密字符串可自定义密码因子
May 13 Javascript
jQuery中addClass()方法用法实例
Jan 05 Javascript
深入理解JS DOM事件机制
Aug 06 Javascript
js利用appendChild对标签进行排序的实现方法
Oct 16 Javascript
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
Dec 15 Javascript
Vue底层实现原理总结
Feb 17 Javascript
QQ跳转支付宝并自动领红包脚本(最新)
Jun 22 Javascript
vue路由的配置和页面切换详解
Sep 09 Javascript
Vue 打包的静态文件不能直接运行的原因及解决办法
Nov 19 Vue.js
vue项目如何打包之项目打包优化(让打包的js文件变小)
Apr 30 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
应用开发中涉及到的css和php笔记分享
2011/08/02 PHP
php中字符集转换iconv函数使用总结
2014/10/11 PHP
PHP中Header使用的HTTP协议及常用方法小结
2014/11/04 PHP
php设置静态内容缓存时间的方法
2014/12/01 PHP
PHP简单选择排序算法实例
2015/01/26 PHP
php将金额数字转化为中文大写
2015/07/09 PHP
举例讲解PHP面对对象编程的多态
2015/08/12 PHP
学习php设计模式 php实现访问者模式(Visitor)
2015/12/07 PHP
thinkPHP简单导入和使用阿里云OSSsdk的方法
2017/03/15 PHP
php+jQuery实现的三级导航栏下拉菜单显示效果
2017/08/10 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
js 得到文件后缀(通过正则实现)
2013/07/08 Javascript
jquery缓动swing liner控制动画过程不同时刻的速度
2014/05/29 Javascript
javascript格式化日期时间方法汇总
2015/06/19 Javascript
原生js验证简洁注册登录页面
2016/12/17 Javascript
微信小程序request出现400的问题解决办法
2017/05/23 Javascript
node文件上传功能简易实现代码
2017/06/16 Javascript
代码整洁之道(重构)
2018/10/25 Javascript
微信小程序tabbar底部导航
2018/11/05 Javascript
webstorm建立vue-cli脚手架的傻瓜式教程
2020/09/22 Javascript
使用python实现扫描端口示例
2014/03/29 Python
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
2016/04/23 Python
python实现屏保计时器的示例代码
2018/08/08 Python
django 实现celery动态设置周期任务执行时间
2019/11/19 Python
区分python中的进程与线程
2020/08/13 Python
python 用pandas实现数据透视表功能
2020/12/21 Python
is_file和file_exists效率比较
2021/03/14 PHP
如何判断计算机可能已经中马
2013/03/22 面试题
UNIX文件类型
2013/08/29 面试题
广播电视新闻学专业应届生求职信
2013/10/08 职场文书
大学本科毕业生求职信范文
2013/12/18 职场文书
市场营销专业自荐书
2014/06/10 职场文书
MySQL触发器的使用
2021/05/24 MySQL
使用ORM新增数据在Mysql中的操作步骤
2021/07/26 MySQL
Python采集壁纸并实现炫轮播
2022/04/30 Python
Python可视化神器pyecharts绘制地理图表
2022/07/07 Python