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更加的稳定......
javascript 模块依赖管理的本质的更多相关文章
- webpack模块依赖管理介绍
http://webpack.github.io/docs/ webpack is a module bundler. 是一个模块管理器 webpack可以管理模块的依赖关系,并产生可以替代这些模块的 ...
- 玩转IDEA项目结构Project Structure,打Jar包、模块/依赖管理全搞定
前言 你好,我是A哥(YourBatman). 如何给Module模块单独增加依赖? 如何知道哪些Module模块用了Spring框架,哪些是web工程? IDEA如何打Jar包?打War包? 熟练的 ...
- mvc-6依赖管理
CommonJS CommonJS规范,主要解决命名空间管理模块和用一套标准的编程模式来加载模块: 很快成为了JavaScript模块写法的事实标准: 它包含IO接口,底层的套接字流,以及单元测试等标 ...
- maven冲突管理及依赖管理实践
1.“最近获胜策略(nearest wins strategy)”的方式处理依赖冲突 Maven采用“最近获胜策略(nearest wins strategy)”的方式处理依赖冲突,即如果一个项目最终 ...
- Maven多模块项目依赖管理
Maven多模块项目依赖管理及dependencies与dependencyManagement的区别 转自:http://blog.csdn.net/liutengteng130/article/d ...
- javascript 模块
一.模块 function foo() { var something = "cool"; var another = [1, 2, 3]; function doSomethin ...
- 很全很全的 JavaScript 模块讲解
模块通常是指编程语言所提供的代码组织机制,利用此机制可将程序拆解为独立且通用的代码单元.所谓模块化主要是解决代码分割.作用域隔离.模块之间的依赖管理以及发布到生产环境时的自动化打包与处理等多个方面. ...
- Angular JS的模块依赖
AngularJS是纯客户端技术,完全用Javascript编写的.它使用的是网页开发的常规技术(HTML,CSS,Javascript),目的是让网页应用开发更快更容易. AngularJS简化应用 ...
- 关于javascript模块加载技术的一些思考
前不久有个网友问我在前端使用requireJs和seajs的问题,我当时问他你们公司以前有没有自己编写的javascript库,或者javascript框架,他的回答是什么都没有,他只是听说像requ ...
随机推荐
- 修改socket缓冲区大小
#include <stdio.h>#include <sys/time.h>#include <sys/types.h>#include <sys/sock ...
- 那些你不知道的PS大片摄影
你以为这张照片是P出来的? 才不是! 人家是开个起重机吊着拍的! 而且没有任何保护措施! 这样的照片战斗民族的摄影师才敢这样拍…要是在天朝这么做估计都找不到模特… 这张照片出自乌兹别克斯坦的摄影师Ra ...
- FTP中各文件目录的说明
DirectAdmin:FTP中各文件目录的说明 当您使用FTP连上空间后,FTP列表会出现以下文件和目录: domains目录:网站文件存放目录:public_html目录:快捷目录,可以快 ...
- 使用Jsoup获取网页内容超时设置
使用Jsoup获取网页内容超时设置 最近使用Jsoup来抓取网页,并对网页进行解析,发现很好用.在抓取过程中遇到一个问题,有些页面总是报Timeout异常,开始想是不是被抓取网站对IP进行了限制,后来 ...
- 2018.10.15 bzoj4570: [Scoi2016]妖怪(凸包)
传送门 不得不说这题有点东西啊. 看到题第一眼二分,用二次函数求范围来进行checkcheckcheck,20分滚粗了233. 于是开始思考正解. 发现可以把每只怪物的二元组属性看成二维坐标. 这时对 ...
- hibernate createQuery和createSQLQuery 查询结果count计算
createQuery 针对hql语句查询 Query query=getSession().createQuery(hql);int result =((Number) query.iterate( ...
- IntelliJ IDEA 2017版 spring-boot修改端口号配置把端口号改为8081
1.修改端口号主要是通过配置文件修改.如图: 完整版配置 ######################################################## ###server 配置信息 ...
- MVC, EF, Code First 相关问题总结
1. 控制表名单复数: 在DbContext类中修改OnModelCreating()为: protected override void OnModelCreating(DbModelBuilder ...
- HDU1175 连连看(bfs) 2016-07-24 13:27 115人阅读 评论(0) 收藏
连连看 Problem Description "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通 ...
- CGA裁剪算法之线段裁剪算法
CGA裁剪算法之线段裁剪算法 常用的线段裁剪算法有三种:[1]Cohen_SutherLand裁剪算法,[2]中点分割裁剪算法,[3]参数化方法. 1. Cohen_SutherLand裁剪算法 为了 ...