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 验证上传图片大小[客户端]
Aug 01 Javascript
JavaScript 原型继承
Dec 26 Javascript
用js替换除数字与逗号以外的所有字符的代码
Jun 07 Javascript
简单谈谈javascript代码复用模式
Jan 28 Javascript
在JavaScript中用getMinutes()方法返回指定的分时刻
Jun 10 Javascript
详解Javacript和AngularJS中的Promises
Feb 09 Javascript
Javascript如何判断数据类型和数组类型
Jun 22 Javascript
微信小程序  生命周期详解
Oct 27 Javascript
jQuery+ajax的资源回收处理机制分析
Jan 07 Javascript
JavaScript中.min.js和.js文件的区别讲解
Feb 13 Javascript
JS事件流与事件处理程序实例分析
Aug 16 Javascript
jQuery设置下拉框显示与隐藏效果的方法分析
Sep 15 jQuery
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采集利器 Snoopy 试用心得
2011/07/03 PHP
PHP中使用asort进行中文排序失效的问题处理
2014/08/18 PHP
php自定义函数实现二维数组按指定key排序的方法
2016/09/29 PHP
PHP设计模式之适配器模式原理与用法分析
2018/04/25 PHP
详解phpstorm2020最新破解方法
2020/09/17 PHP
jQuery 表单验证扩展代码(一)
2010/10/11 Javascript
实用的Jquery选项卡TAB示例代码
2013/08/28 Javascript
div+css+js实现无缝滚动类似marquee无缝滚动兼容firefox
2013/08/29 Javascript
jquery跟js初始化加载的多种方法及区别介绍
2014/04/02 Javascript
javascript实现checkbox复选框实例代码
2016/01/10 Javascript
动态更新highcharts数据的实现方法
2016/05/28 Javascript
Bootstrap缩略图与警告框学习使用
2017/02/08 Javascript
Vue关于数据绑定出错解决办法
2017/05/15 Javascript
iview table render集成switch开关的实例
2018/03/14 Javascript
node.js express框架简介与实现
2019/07/23 Javascript
node 版本切换的实现
2020/02/02 Javascript
vue中的循环对象属性和属性值用法
2020/09/04 Javascript
python实现将汉字转换成汉语拼音的库
2015/05/05 Python
Python浅拷贝与深拷贝用法实例
2015/05/09 Python
python web框架学习笔记
2016/05/03 Python
python实现知乎高颜值图片爬取
2019/08/12 Python
win10下python2和python3共存问题解决方法
2019/12/23 Python
pytorch实现从本地加载 .pth 格式模型
2020/02/14 Python
解决PDF 转图片时丢文字的一种可能方式
2021/03/04 Python
.net软件工程师面试题
2015/03/31 面试题
代码中finally中的代码会不会执行
2012/02/06 面试题
学术会议邀请函范文
2014/01/22 职场文书
关于运动会的稿件
2014/02/02 职场文书
楼面部长岗位职责范本
2014/02/14 职场文书
平安家庭示范户事迹
2014/06/02 职场文书
会计专业求职信
2014/08/10 职场文书
办理信用卡工作证明
2014/09/30 职场文书
导师鉴定意见
2015/06/05 职场文书
初中政教处工作总结
2015/08/12 职场文书
2016教师校本培训心得体会
2016/01/08 职场文书
2016大一新生入学教育心得体会
2016/01/23 职场文书