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 相关文章推荐
Add Formatted Data to a Spreadsheet
Jun 12 Javascript
javascript 面向对象继承
Nov 26 Javascript
一个简单的JavaScript数据缓存系统实现代码
Oct 24 Javascript
js过滤HTML标签以及空格的思路及代码
May 24 Javascript
随窗体滑动的小插件sticky源码
Jun 21 Javascript
一个检测表单数据的JavaScript实例
Oct 31 Javascript
分享纯手写漂亮的表单验证
Nov 19 Javascript
JavaScript注入漏洞的原理及防范(详解)
Dec 04 Javascript
bootstrapvalidator之API学习教程
Jun 29 Javascript
element-ui upload组件多文件上传的示例代码
Oct 17 Javascript
微信小程序生成二维码的示例代码
Mar 29 Javascript
JavaScript动态生成表格的示例
Nov 02 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实现网页端验证码功能
2017/07/11 PHP
jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
2015/11/25 Javascript
Jqgrid之强大的表格插件应用
2015/12/02 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
2016/07/07 Javascript
利用jsonp跨域调用百度js实现搜索框智能提示
2016/08/24 Javascript
常用的javascript设计模式
2017/01/11 Javascript
EsLint入门学习教程
2017/02/17 Javascript
protractor的安装与基本使用教程
2017/07/07 Javascript
node使用UEditor富文本编辑器的方法实例
2017/07/11 Javascript
Django与Vue语法的冲突问题完美解决方法
2017/12/14 Javascript
深入浅析JSONAPI在PHP中的应用
2017/12/24 Javascript
微信小程序实现animation动画
2018/01/26 Javascript
JS实现获取自定义属性data值的方法示例
2018/12/19 Javascript
Vue vm.$attrs使用场景详解
2020/03/08 Javascript
vue webpack build资源相对路径的问题及解决方法
2020/06/04 Javascript
vue render函数动态加载img的src路径操作
2020/10/26 Javascript
js中实现继承的五种方法
2021/01/25 Javascript
python 实现归并排序算法
2012/06/05 Python
使用python删除nginx缓存文件示例(python文件操作)
2014/03/26 Python
Python字符串转换成浮点数函数分享
2015/07/24 Python
不可错过的十本Python好书
2017/07/06 Python
python模仿网页版微信发送消息功能
2018/02/24 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
2019/11/30 Python
PyQt5的QWebEngineView使用示例
2020/10/20 Python
Python开发.exe小工具的详细步骤
2021/01/27 Python
肯尼亚网上商城:Kilimall
2016/08/20 全球购物
澳大利亚头发和美容产品购物网站:OZ Hair & Beauty
2020/03/27 全球购物
工程班组长岗位职责
2013/12/30 职场文书
测控技术与仪器个人求职信范文
2013/12/30 职场文书
可口可乐广告词
2014/03/20 职场文书
大队干部竞选演讲稿
2014/04/28 职场文书
酒店七夕情人节活动策划方案
2014/08/24 职场文书
学习党的群众路线教育实践活动心得体会范文
2014/11/03 职场文书
青岛海底世界导游词
2015/02/11 职场文书
男方家长婚礼致辞
2015/07/27 职场文书
使用MybatisPlus打印sql语句
2022/04/22 SQL Server