browserify.js 的模块加载
browserify的模块加载基本上和nodejs的类似:
nodejs 的模块加载是依次去读取文件然后用一个类eval() 函数执行并返回module.exports的结果。为了避免循环加载,在加载模块文件之前就在模块缓存中做了设置,使得循环加载中的回路中断。
比较起来,browserify的模块加载分两步,第一步需要在命令行中执行browserify module1.js module2.js module3.js > bundle.js,这会将所有模块聚合到bundle.js中,并生成一个依赖结构。
下面是bundle.js代码,多数被缩减的变量名我已经用含义较明确的词做了替换:
(function e(t, cache, indexArray) {
function s(i, u) {
if (!cache[i]) {
if (!t[i]) { // when? !moduleIndex==false ?
var req2 = typeof require == "function" && require;
if (!u && req2)return req2(i, !0);
if (req)return req(i, !0);
var f = new Error("Cannot find module '" + i + "'");
throw f.code = "MODULE_NOT_FOUND", f
}
var modu = cache[i] = {exports: {}}; // set it to cache first to avoid loop loading.
t[i][0].call(
modu.exports,
function (path) { // the real "require" function.
var moduleIndex = t[i][1][path];
return s(moduleIndex ? moduleIndex : path) // use s() to check cache first.
},
modu, // pass module
modu.exports, // pase module.exports
e,
t,
cache,
indexArray
)
}
return cache[i].exports
} var req = typeof require == "function" && require;
for (var i = 0; i < indexArray.length; i++) // load module one by one.
s(indexArray[i]);
return s
})({
1 : [
function (require, module, exports) {
var test2 = require('./module2.js');
var test3 = require('./module3.js'); var test1 = function () {
test2();
}
},
{"./module2.js": 2, "./module3.js": 3}
],
2: [
function (require, module, exports) {
var test3 = require('./module3.js'); var test2 = function () {
} module.exports = test2;
},
{"./module3.js": 3}
],
3 : [
function (require, module, exports) {
var test3 = function () {
} module.exports = test3;
},
{}
]
},
{}, // module cache
[1, 2, 3] // indexArray
);
和nodejs比较起来,browserify把文件加载和依赖关系生成放到了 bundle.js的产生阶段。在bundle.js真正的执行阶段,只需要依次执行依赖结构中的模块实体就好了。
比起首页中大量的<script>标签,browserify使得模块的依赖关系变得清晰,各个模块有自己的变量空间,全局空间不会受到污染。
但同步加载、不能动态按需加载是个缺点。
下面转向WebPack,据说可以替代Gulp,还能按需加载模块的项目。
browserify.js 的模块加载的更多相关文章
- Node.js require 模块加载原理 All In One
Node.js require 模块加载原理 All In One require 加载模块,搜索路径 "use strict"; /** * * @author xgqfrms ...
- js 简易模块加载器 示例分析
前端模块化 关注前端技术发展的各位亲们,肯定对模块化开发这个名词不陌生.随着前端工程越来越复杂,代码越来越多,模块化成了必不可免的趋势. 各种标准 由于javascript本身并没有制定相关标准(当然 ...
- Node.js中模块加载机制
1.模块查找规则-当模块拥有路径但没有后缀时:(require(‘./find’)) require方法根据模块路径查找模块,如果是完整路径,直接引入模块: 如果模块后缀省略,先找同名JS文件,再找同 ...
- 第三课:sea.js模块加载原理
模块加载,其实就是把js分成很多个模块,便于开发和维护.因此加载很多js模块的时候,需要动态的加载,以便提高用户体验. 在介绍模块加载库之前,先介绍一个方法. 动态加载js方法: function l ...
- js与AMD模块加载
目的: 了解AMD规范与CMD规范,写一个模块加载器雏形. 基本概念: AMD是异步模块定义规范,而CMD是通用模块定义规范.其他的还有CommonJS Modules规范. 对于具体的规范,可以参考 ...
- js模块化/js模块加载器/js模块打包器
之前对这几个概念一直记得很模糊,也无法用自己的语言表达出来,今天看了大神的文章,尝试根据自己的理解总结一下,算是一篇读后感. 大神的文章:http://www.css88.com/archives/7 ...
- nodejs js模块加载
本文地址:http://www.cnblogs.com/jasonxuli/p/4381747.html nodejs的非核心模块(core module)加载主要使用的就是module.js. 项目 ...
- JS模块加载器加载原理是怎么样的?
路人一: 原理一:id即路径 原则.通常我们的入口是这样的: require( [ 'a', 'b' ], callback ) .这里的 'a'.'b' 都是 ModuleId.通过 id 和路径的 ...
- Node.js模块 加载笔记
//核心模块就是Node.js标准API种提供的模块,如fs,http,net.vm等.官方提供,编译成二进制代码//核心模块拥有最高的加载优先级 //文件模块则是存储为单独的文件(或文件夹)的模块, ...
随机推荐
- mac 功能修改。。。。
个人表示 Mac 下的 Spotlight 搜索功能确实是个鸡肋,安装 QuickSilver 才是王道!所以我个人就把 Spotlight 关闭掉了.方法很简单,还是要用到 “终端” 工具. 在 “ ...
- LINUX C++ 技术博客
http://blog.csdn.net/pcliuguangtao/article/category/676422
- Android & Eclipse FAQ
一.eclipse中格式化代码快捷键Ctrl+Shift+F失效的解决办法 当我要格式化代码的时候,右键-source-format能够起效,但ctrl+shift+f不好使了. google之后来发 ...
- MyISAM表锁
MyISAM存储引擎只支持表锁,这也是MySQL开始几个版本中唯一支持的锁类型.随着应用对事务完整性和并发性 要求的不断提高,MySQL才开始开发基于事务的存储引擎,后来慢慢出现了支持页锁的BDB存储 ...
- 小白日记29:kali渗透测试之Web渗透-扫描工具-Vega
WEB扫描工具-Vega 纯图形化界面,Java编写的开源web扫描器.两种工作模式:扫描模式和代理模式[主流扫描功能].用于爬站.处理表单,注入测试等.支持SSL:http://vega/ca.cr ...
- 炼数成金hadoop视频干货06-10
视频地址:http://pan.baidu.com/s/1dDEgKwD 第六课统讲了hadoop几个子项目和HBase,第七课还是讲的HBase 第八课讲了PIG 第九课讲了Hive和Zookeep ...
- B - Plane of Tanks: Pro
Description Vasya has been playing Plane of Tanks with his friends the whole year. Now it is time to ...
- swift 中异常的处理方法
swift 中什么时候需要处理异常,在调用系统某个方法的时,该方法最后有一个throws 说明该方法会抛出异常,如果一个方法抛出异常,那么需要对该异常进行处理 swift 异常处理提供了三种方法 方式 ...
- iOS “获取验证码”按钮的倒计时功能
iOS 的倒计时有多种实现细节,Cocoa Touch 为我们提供了 NSTimer 类和 GCD 的dispatch_source_set_timer方法去更加方便的使用计时器.我们也可以很容易的的 ...
- Android编程心得-ListView的Item高亮显示的办法
在我们使用ListView的时候,经常会遇到某一项(Item)需要高亮显示的情况,如下图,有人说当我们点击子项的时候会变亮,但有时候业务逻辑需要让ITEM根据条件自动变亮,下面我来介绍一下我自己的解决 ...