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 相关文章推荐
MooTools 1.2中的Drag.Move来实现拖放
Sep 15 Javascript
JS禁用浏览器退格键实现思路及代码
Oct 29 Javascript
jQuery DOM插入节点操作指南
Mar 03 Javascript
js+html5实现canvas绘制镂空字体文本的方法
Jun 05 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
Jan 19 Javascript
深入理解JavaScript程序中内存泄漏
Mar 17 Javascript
教你如何在Node.js中使用jQuery
Aug 28 Javascript
javascript中的try catch异常捕获机制用法分析
Dec 14 Javascript
vue项目打包之开发环境和部署环境的实现
Apr 23 Javascript
解决VUE mounted 钩子函数执行时 img 未加载导致页面布局的问题
Jul 27 Javascript
JavaScript实现下拉列表
Jan 20 Javascript
Vue-router编程式导航的两种实现代码
Mar 04 Vue.js
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 Cookie的一个使用注意点
2008/11/08 PHP
CodeIgniter框架URL路由总结
2014/09/03 PHP
PHP simplexml_load_file()函数讲解
2019/02/03 PHP
javascript appendChild,innerHTML,join性能比较代码
2009/08/29 Javascript
基于jquery的图片轮播 tab切换组件
2012/07/19 Javascript
Js冒泡事件详解及阻止示例
2014/03/21 Javascript
js简单获取表单中单选按钮值的方法
2016/08/23 Javascript
如何提高Dom访问速度
2017/01/05 Javascript
Vue.js 2.0 移动端拍照压缩图片上传预览功能
2017/03/06 Javascript
详解vue2父组件传递props异步数据到子组件的问题
2017/06/29 Javascript
详解最新vue-cli 2.9.1的webpack存在问题
2017/12/16 Javascript
vant IndexBar实现的城市列表的示例代码
2019/11/20 Javascript
js通过循环多张图片实现动画效果
2019/12/19 Javascript
JavaScript常用工具函数汇总(浏览器环境)
2020/09/17 Javascript
javascript中layim之查找好友查找群组
2021/02/06 Javascript
python连接mongodb操作数据示例(mongodb数据库配置类)
2013/12/31 Python
在Python3中使用asyncio库进行快速数据抓取的教程
2015/04/02 Python
初步探究Python程序的执行原理
2015/04/11 Python
Python脚本在Appium库上对移动应用实现自动化测试
2015/04/17 Python
python导入时小括号大作用
2017/01/10 Python
Python 基础教程之闭包的使用方法
2017/09/29 Python
Python简单实现控制电脑的方法
2018/01/22 Python
Python Pandas找到缺失值的位置方法
2018/04/12 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
2019/06/27 Python
python简单实现最大似然估计&amp;scipy库的使用详解
2020/04/15 Python
解决Jupyter notebook中.py与.ipynb文件的import问题
2020/04/21 Python
python多进程 主进程和子进程间共享和不共享全局变量实例
2020/04/25 Python
美国从事品牌鞋类零售的连锁店:Famous Footwear
2016/08/25 全球购物
GOLFINO英国官网:高尔夫服装
2020/04/11 全球购物
Shopbop中文官网:美国亚马逊旗下时尚购物网站
2020/12/15 全球购物
附答案的Java面试题
2012/11/19 面试题
婚纱摄影师求职信范文
2014/04/17 职场文书
汽车广告策划方案
2014/05/31 职场文书
职业规划实施方案
2014/06/10 职场文书
园艺专业毕业生求职信
2014/09/02 职场文书
优秀教师个人材料
2014/12/15 职场文书