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 相关文章推荐
js身份证验证超强脚本
Oct 26 Javascript
原生js 秒表实现代码
Jul 24 Javascript
JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
Dec 19 Javascript
Javascript自定义函数判断网站访问类型是PC还是移动终端
Jan 10 Javascript
js触发select onchange事件的小技巧
Aug 05 Javascript
全面解析JS字符串和正则表达式中的match、replace、exec等函数
Jul 01 Javascript
ES6中的箭头函数实例详解
Apr 06 Javascript
js中的闭包学习心得
Feb 06 Javascript
解决vue项目打包后提示图片文件路径错误的问题
Jul 04 Javascript
vue2中使用sass并配置全局的sass样式变量的方法
Sep 04 Javascript
Vue + Node.js + MongoDB图片上传组件实现图片预览和删除功能详解
Apr 29 Javascript
文章或博客自动生成章节目录索引(支持三级)的实现代码
May 10 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
PHPWind 发帖回帖Api PHP版打包下载
2010/02/08 PHP
使用 PHPMAILER 发送邮件实例应用
2012/11/07 PHP
解决php使用异步调用获取数据时出现(错误c00ce56e导致此项操作无法完成)
2013/07/03 PHP
php冒泡排序、快速排序、快速查找、二维数组去重实例分享
2014/04/24 PHP
Yii中使用PHPExcel导出Excel的方法
2014/12/26 PHP
php发送短信验证码完成注册功能
2015/11/24 PHP
PHP自定义多进制的方法
2016/11/03 PHP
php 调用ffmpeg获取视频信息的简单实现
2017/04/03 PHP
thinkPHP5.1框架路由::get、post请求简单用法示例
2019/05/06 PHP
用JavaScript 处理 URL 的两个函数代码
2007/08/13 Javascript
详解jQuery移动页面开发中的ui-grid网格布局使用
2015/12/03 Javascript
基于javascript实现简单计算器功能
2016/01/03 Javascript
详解NodeJs支付宝移动支付签名及验签
2017/01/06 NodeJs
删除table表格行的实例讲解
2017/09/21 Javascript
使用classList来实现两个按钮样式的切换方法
2018/01/24 Javascript
微信小程序中的canvas 文字断行和省略号显示功能的处理方法
2018/11/14 Javascript
D3.js的基础部分之数组的处理数组的排序和求值(v3版本)
2019/05/09 Javascript
微信小程序环境下将文件上传到OSS的方法步骤
2019/05/31 Javascript
Vue 实例事件简单示例
2019/09/19 Javascript
Vue切换div显示隐藏,多选,单选代码解析
2020/07/14 Javascript
vue离开当前页面触发的函数代码
2020/09/01 Javascript
Python实现抓取网页并且解析的实例
2014/09/20 Python
python-itchat 获取微信群用户信息的实例
2019/02/21 Python
解决Numpy中sum函数求和结果维度的问题
2019/12/06 Python
详解Python 重学requests发起请求的基本方式
2020/02/07 Python
Python3开发环境搭建详细教程
2020/06/18 Python
CSS3实现DIV圆角效果完整代码
2012/10/10 HTML / CSS
HTML5学习心得总结(推荐)
2016/07/08 HTML / CSS
德国苹果商店:MacTrade
2020/05/18 全球购物
Prototype是怎么扩展DOM的
2014/10/01 面试题
护士实习求职信
2014/06/22 职场文书
2014教师教育实践活动对照检查材料思想汇报
2014/09/21 职场文书
“四风”问题自我剖析材料思想汇报
2014/09/23 职场文书
导游词之珠海轮廓
2019/10/25 职场文书
python opencv人脸识别考勤系统的完整源码
2021/04/26 Python
Java设计模式之享元模式示例详解
2022/03/03 Java/Android