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 相关文章推荐
alixixi runcode.asp的代码不错的应用
Aug 08 Javascript
不要小看注释掉的JS 引起的安全问题
Dec 27 Javascript
JS input 数字验证代码
Jul 30 Javascript
使用dynatrace-ajax跟踪JavaScript的性能
Apr 12 Javascript
jQuery html()方法使用不了无法显示内容的问题
Aug 06 Javascript
AngularJS使用ngOption实现下拉列表的实例代码
Jan 23 Javascript
jQuery实现区域打印功能代码详解
Jun 17 Javascript
JavaScript中定时控制Throttle、Debounce和Immediate详解
Nov 17 Javascript
Angularjs的启动过程分析
Jul 18 Javascript
JS中判断某个字符串是否包含另一个字符串的五种方法
May 03 Javascript
js实现unicode码字符串与utf8字节数据互转详解
Mar 21 Javascript
如何正确理解vue中的key详解
Nov 02 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
PHP中使用OpenSSL生成证书及加密解密
2017/02/05 PHP
PHP实现会员账号单唯一登录的方法分析
2019/03/07 PHP
如何通过PHP实现Des加密算法代码实例
2020/05/09 PHP
个人总结的一些关于String、Function、Array的属性和用法
2007/01/10 Javascript
8款非常棒的响应式jQuery 幻灯片插件推荐
2012/02/02 Javascript
基于jQuery插件实现环形图标菜单旋转切换特效
2015/05/15 Javascript
详解javascript new的运行机制
2016/01/26 Javascript
jQuery animate和CSS3相结合实现缓动追逐效果附源码下载
2016/04/18 Javascript
Markdown+Bootstrap图片自适应属性详解
2016/05/21 Javascript
jQuery实现手机自定义弹出输入框
2016/06/13 Javascript
完美JQuery图片切换效果的简单实现
2016/07/21 Javascript
Avalonjs双向数据绑定与监听的实例代码
2017/06/23 Javascript
vue+axios实现文件下载及vue中使用axios的实例
2018/09/21 Javascript
Vue 报错TypeError: this.$set is not a function 的解决方法
2018/12/17 Javascript
layui2.0使用table+laypage实现真分页
2019/07/27 Javascript
js正则匹配多个全部数据问题
2019/12/20 Javascript
原生JavaScript实现的无缝滚动功能详解
2020/01/17 Javascript
vue项目实现设置根据路由高亮对应的菜单项操作
2020/08/06 Javascript
Python标准模块--ContextManager上下文管理器的具体用法
2017/11/27 Python
numpy实现合并多维矩阵、list的扩展方法
2018/05/08 Python
Python3对称加密算法AES、DES3实例详解
2018/12/06 Python
Python之pymysql的使用小结
2019/07/01 Python
python调用webservice接口的实现
2019/07/12 Python
Python实现朴素贝叶斯的学习与分类过程解析
2019/08/24 Python
vscode调试django项目的方法
2020/08/06 Python
python中类与对象之间的关系详解
2020/12/16 Python
浅谈react路由传参的几种方式
2021/03/23 Javascript
个人简历自我评价
2014/02/02 职场文书
音乐节策划方案
2014/06/09 职场文书
倡导文明标语
2014/06/16 职场文书
小学生九一八纪念日83周年演讲稿500字
2014/09/17 职场文书
先进学校事迹材料
2014/12/30 职场文书
酒店宣传语大全
2015/07/13 职场文书
不要在HTML中滥用div
2021/05/08 HTML / CSS
Python+tkinter实现高清图片保存
2022/03/13 Python
python playwrigh框架入门安装使用
2022/07/23 Python