javascript 模块依赖管理的本质深入详解


Posted in Javascript onApril 30, 2020

本文实例讲述了javascript 模块依赖管理的本质。分享给大家供大家参考,具体如下:

模块模式定义

模块是'javascript'的一种设计模式,它为函数定义一个包装函数,并且该包装函数的返回值与模块的API保持一致:

function createModule() {
 function hello(name) {
 console.log(name + '帅哥你好!');
 }

 return {
 hello: hello
 }
}
// 这里调用 createModule 来创建一个模块实例
var foo = createModule();
foo.hello('fayin');

单例模块模式

仔细研究上面的模块,我们发现每次调用 createModule 都会生成一个实例,很浪费。于是我们简单的包装一下,就有了单例模块模式:

var myModule = (function createModule() {
 function hello(name) {
 console.log(name + '帅哥你好!');
 }

 return {
 hello: hello
 }
})()

// 调用方式
myModule.hello('fayin')

模块依赖管理

现代大多数模块依赖管理器本质上都是将这种模块定义封装进一个友好的API。其核心的方法可以通过下面的例子一窥究竟:

// 通过模块的单例模式来保存定义的方法
var MyModules = (function() {

 var modules = {};

 function define(name, deps, impl) {
 console.log(deps.length)
 for(var i = 0, len = deps.length; i < len; i++) {
  // deps[i] 看做是函数名
  // modules[deps[i]] 是保存在 modules 对象上的一个属性为 deps[i] 的方法
  // 每次遍历将对应的方法绑定到函数名上
  deps[i] = modules[deps[i]]

 }
 // 在modules 对象上保存方法,其函数名为 name 
 // 如函数 bar ,impl 为 bar 的函数体
 modules[name] = impl.apply(null, deps);

 console.log( modules)
 }

 function get(name) {
 return modules[name]
 }
 return {
 define: define,
 get: get
 };
})();

// 这里定义一个函数 bar,返回一个对象
MyModules.define('bar', [], function() {
 function hello(who) {
 return 'Let me introduce: ' + who;
 }
 return {
 hello: hello
 }
})

MyModules.define('foo', ['bar'], function(bar) {
 var hungry = 'hippo';

 function awesome() {
 return bar.hello(hungry).toUpperCase()
 }

 return {
 awesome: awesome
 }
})

var bar = MyModules.get('bar')
console.log(bar.hello('fay'))

var foo = MyModules.get('foo')

console.log(foo.awesome())

模块模式的缺陷

从上面的案例我们知道,这个模式是基于函数来实现的,它的优势这里不在赘述(参考jQuery),而它的缺点也非常的明显。由于函数的上下文环境是在运行时确定的,在编译期间无法确定它的依赖关系,在运行期间我们可以随意更改API,这导致基于函数的模块模式并不稳定。

而相比之下,ES6的模块API更加的稳定......

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
javascript 模拟点击广告
Jan 02 Javascript
jQuery学习笔记之Helloworld
Dec 22 Javascript
Javascript自定义排序 node运行 实例
Jun 05 Javascript
jquery实现图片裁剪思路及实现
Aug 16 Javascript
Javascript:为input设置readOnly属性(示例讲解)
Dec 25 Javascript
原生js封装的一些jquery方法(详解)
Sep 20 Javascript
jQuery UI Grid 模态框中的表格实例代码
Apr 01 jQuery
微信小程序 页面跳转如何实现传值
Apr 05 Javascript
JS脚本实现网页自动秒杀点击
Jan 11 Javascript
仿淘宝JSsearch搜索下拉深度用法
Jan 15 Javascript
JS简单获得节点元素的方法示例
Feb 10 Javascript
JS中的算法与数据结构之链表(Linked-list)实例详解
Aug 20 Javascript
JavaScript find()方法及返回数据实例
Apr 30 #Javascript
js this 绑定机制深入详解
Apr 30 #Javascript
JS 图片压缩原理与实现方法详解
Apr 29 #Javascript
详解Vue3 Composition API中的提取和重用逻辑
Apr 29 #Javascript
浅谈Vue3 Composition API如何替换Vue Mixins
Apr 29 #Javascript
JS数组Reduce方法功能与用法实例详解
Apr 29 #Javascript
JavaScript实现放大镜效果代码示例
Apr 29 #Javascript
You might like
德生PL990,目前市面上唯一一款便携式插卡蓝牙全波段高性能收音机
2021/03/02 无线电
PHP实现用户认证及管理完全源码
2007/03/11 PHP
Linux下进行MYSQL编程时插入中文乱码的解决方案
2007/03/15 PHP
php中的观察者模式
2010/03/24 PHP
php实现图片缩放功能类
2013/12/18 PHP
php实现parent调用父类的构造方法与被覆写的方法
2015/02/11 PHP
php分页查询mysql结果的base64处理方法示例
2017/05/18 PHP
js实现禁止中文输入的方法
2015/01/14 Javascript
JS+CSS实现可拖拽的漂亮圆角特效弹出层完整实例
2015/02/13 Javascript
jQuery实现折线图的方法
2015/02/28 Javascript
JS实现的通用表单验证插件完整实例
2015/08/20 Javascript
JS检测数组类型的方法小结
2017/03/14 Javascript
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
2019/07/06 Javascript
Bootstrap告警框(alert)实现弹出效果和短暂显示后上浮消失的示例代码
2020/08/27 Javascript
jQuery实现日历效果
2020/09/11 jQuery
python定时采集摄像头图像上传ftp服务器功能实现
2013/12/23 Python
python网络编程之读取网站根目录实例
2014/09/30 Python
Python中生成Epoch的方法
2017/04/26 Python
python实现从文件中读取数据并绘制成 x y 轴图形的方法
2018/10/14 Python
Python打开文件,将list、numpy数组内容写入txt文件中的方法
2018/10/26 Python
WIn10+Anaconda环境下安装PyTorch(避坑指南)
2019/01/30 Python
python异步存储数据详解
2019/03/19 Python
Python之修改图片像素值的方法
2019/07/03 Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
2019/09/23 Python
python global和nonlocal用法解析
2020/02/03 Python
pytorch数据预处理错误的解决
2020/02/20 Python
python str字符串转uuid实例
2020/03/03 Python
Python获取excel内容及相关操作代码实例
2020/08/10 Python
Python爬取12306车次信息代码详解
2020/08/12 Python
关于Python字符编码与二进制不得不说的一些事
2020/10/04 Python
波兰运动鞋网上商店:e-Sporting
2018/02/16 全球购物
美国在线鞋类零售商:LifeStride
2019/06/09 全球购物
党员入党表决心的话
2014/03/11 职场文书
文化产业实施方案
2014/06/07 职场文书
2015年节能降耗工作总结
2015/05/22 职场文书
MySQL 逻辑备份与恢复测试的相关总结
2021/05/14 MySQL