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 相关文章推荐
如何实现浏览器上的右键菜单
Jul 10 Javascript
jquery-tips悬浮提示插件分享
Jul 31 Javascript
jQuery简单实现仿京东商城的左侧菜单效果代码
Sep 09 Javascript
jquery 实现输入邮箱时自动补全下拉提示功能
Oct 04 Javascript
JavaScript 七大技巧(一)
Dec 13 Javascript
多种js图片预加载实现方式分享
Feb 19 Javascript
JavaScript中的this使用详解
Jul 27 Javascript
javascript特殊文本输入框网页特效
Sep 13 Javascript
原生js的RSA和AES加密解密算法
Oct 08 Javascript
js中小数向上取整数,向下取整数,四舍五入取整数的实现(必看篇)
Feb 13 Javascript
整理关于Bootstrap表单的慕课笔记
Mar 29 Javascript
vue中监听返回键问题
Aug 28 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验证码类实例分享
2013/12/27 PHP
PHP实现无限极分类的两种方式示例【递归和引用方式】
2019/03/25 PHP
Code:loadScript( )加载js的功能函数
2007/02/02 Javascript
javascript multibox 全选
2009/03/22 Javascript
使用Java实现简单的server/client回显功能的方法介绍
2013/05/03 Javascript
js获取系统的根路径实现介绍
2013/09/08 Javascript
toggle一个div显示或隐藏且可扩展成自定义下拉框
2013/09/12 Javascript
javascript 循环调用示例介绍
2013/11/20 Javascript
Node.js事件循环(Event Loop)和线程池详解
2015/01/28 Javascript
javascript HTML+CSS实现经典橙色导航菜单
2016/02/16 Javascript
引用jquery框架后出错的解决方法
2016/08/09 Javascript
AngularJS之页面跳转Route实例代码
2017/03/10 Javascript
jquery将标签元素的高设为屏幕的百分比
2017/04/19 jQuery
移动端手指放大缩小插件与js源码
2017/05/22 Javascript
jQuery选择器之属性筛选选择器用法详解
2017/09/19 jQuery
nuxt.js中间件实现拦截权限判断的方法
2018/11/21 Javascript
JavaScript中的this原理及6种常见使用场景详解
2020/02/14 Javascript
vue+Element-ui实现分页效果
2020/11/15 Javascript
python简单程序读取串口信息的方法
2015/03/13 Python
对Python random模块打乱数组顺序的实例讲解
2018/11/08 Python
python制作抖音代码舞
2019/04/07 Python
python3实现raspberry pi(树莓派)4驱小车控制程序
2020/02/12 Python
详解Python多线程下的list
2020/07/03 Python
html5实现完美兼容各大浏览器的播放器
2014/12/26 HTML / CSS
美国牛仔品牌:True Religion
2018/11/16 全球购物
Java方面的关于数组和继承的笔面试题
2015/09/18 面试题
家长会主持词开场白
2014/03/18 职场文书
新年主持词
2014/03/27 职场文书
中国梦演讲稿教师篇
2014/04/23 职场文书
商务专员岗位职责范本
2014/06/29 职场文书
王亚平太空授课观后感
2015/06/12 职场文书
文明医院的标语集锦!
2019/07/24 职场文书
详解Python中下划线的5种含义
2021/07/15 Python
CSS实现隐藏搜索框功能(动画正反向序列)
2021/07/21 HTML / CSS
动画《朋友游戏》公开佐藤友生绘制的开播纪念绘
2022/04/06 日漫
Python数组变形的几种实现方法
2022/05/30 Python