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 语法集锦 脚本之家基础推荐
Nov 15 Javascript
jquery.fileEveryWhere.js 一个跨浏览器的file显示插件
Oct 24 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(二)
Dec 10 Javascript
浅谈JavaScript中小数和大整数的精度丢失
May 31 Javascript
JS实现“隐藏与显示”功能(多种方法)
Nov 24 Javascript
JavaScript闭包和范围实例详解
Dec 19 Javascript
js定时器实例分享
Dec 20 Javascript
vue如何实现observer和watcher源码解析
Mar 09 Javascript
JavaScript实现审核流程状态的动态显示进度条
Mar 15 Javascript
JS实现数组去重方法总结(六种方法)
Jul 14 Javascript
微信小程序开发之map地图组件定位并手动修改位置偏差
Aug 17 Javascript
js原生map实现的方法总结
Jan 19 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_SELF的安全问题
2009/09/05 PHP
rrmdir php中递归删除目录及目录下的文件
2011/05/15 PHP
PHP获取当前所在目录位置的方法
2014/11/26 PHP
JavaScript词法作用域与调用对象深入理解
2012/11/29 Javascript
cument.execCommand()用法深入理解
2012/12/04 Javascript
javascript检测页面是否缩放的小例子
2013/05/16 Javascript
JavaScript的setAttribute兼容性问题解决方法
2013/11/11 Javascript
jQuery中操控hidden、disable等无值属性的方法
2014/01/06 Javascript
js数字转换为float,取N位小数
2014/02/08 Javascript
早该知道的7个JavaScript技巧
2016/06/21 Javascript
AngularJS创建自定义指令的方法详解
2016/11/03 Javascript
微信小程序 保留小数(toFixed)详细介绍
2016/11/16 Javascript
Angular ng-repeat遍历渲染完页面后执行其他操作详细介绍
2016/12/13 Javascript
jsonp跨域请求实现示例
2017/03/13 Javascript
用jQuery实现圆点图片轮播效果
2017/03/19 Javascript
webpack3+React 的配置全解
2017/08/21 Javascript
解决vue单页使用keep-alive页面返回不刷新的问题
2018/03/13 Javascript
解决vue 子组件修改父组件传来的props值报错问题
2019/11/09 Javascript
Javascript原型链及instanceof原理详解
2020/05/25 Javascript
基于js实现判断浏览器类型代码实例
2020/07/17 Javascript
Nuxt.js 静态资源和打包的操作
2020/11/06 Javascript
Pandas把dataframe或series转换成list的方法
2020/06/14 Python
html5 利用canvas手写签名并保存的实现方法
2018/07/12 HTML / CSS
荷兰鞋子在线:Nelson Schoenen
2017/12/25 全球购物
为娇小女性量身打造:Petite Studio
2018/11/01 全球购物
美国Max仓库:Max Warehouse
2020/05/31 全球购物
汽车机修工岗位职责
2014/03/06 职场文书
秋季运动会演讲稿
2014/09/16 职场文书
教师工作表现自我评价
2015/03/05 职场文书
2015年员工工作表现评语
2015/03/25 职场文书
《金钱的魔力》教学反思
2016/02/20 职场文书
慰问信的写作格式及范文!
2019/06/24 职场文书
导游词之徐州云龙湖
2019/11/19 职场文书
MySQL 逻辑备份与恢复测试的相关总结
2021/05/14 MySQL
JavaScript的function函数详细介绍
2021/11/20 Javascript
浅谈Redis的事件驱动模型
2022/05/30 Redis