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 的模块加载的更多相关文章

  1. Node.js require 模块加载原理 All In One

    Node.js require 模块加载原理 All In One require 加载模块,搜索路径 "use strict"; /** * * @author xgqfrms ...

  2. js 简易模块加载器 示例分析

    前端模块化 关注前端技术发展的各位亲们,肯定对模块化开发这个名词不陌生.随着前端工程越来越复杂,代码越来越多,模块化成了必不可免的趋势. 各种标准 由于javascript本身并没有制定相关标准(当然 ...

  3. Node.js中模块加载机制

    1.模块查找规则-当模块拥有路径但没有后缀时:(require(‘./find’)) require方法根据模块路径查找模块,如果是完整路径,直接引入模块: 如果模块后缀省略,先找同名JS文件,再找同 ...

  4. 第三课:sea.js模块加载原理

    模块加载,其实就是把js分成很多个模块,便于开发和维护.因此加载很多js模块的时候,需要动态的加载,以便提高用户体验. 在介绍模块加载库之前,先介绍一个方法. 动态加载js方法: function l ...

  5. js与AMD模块加载

    目的: 了解AMD规范与CMD规范,写一个模块加载器雏形. 基本概念: AMD是异步模块定义规范,而CMD是通用模块定义规范.其他的还有CommonJS Modules规范. 对于具体的规范,可以参考 ...

  6. js模块化/js模块加载器/js模块打包器

    之前对这几个概念一直记得很模糊,也无法用自己的语言表达出来,今天看了大神的文章,尝试根据自己的理解总结一下,算是一篇读后感. 大神的文章:http://www.css88.com/archives/7 ...

  7. nodejs js模块加载

    本文地址:http://www.cnblogs.com/jasonxuli/p/4381747.html nodejs的非核心模块(core module)加载主要使用的就是module.js. 项目 ...

  8. JS模块加载器加载原理是怎么样的?

    路人一: 原理一:id即路径 原则.通常我们的入口是这样的: require( [ 'a', 'b' ], callback ) .这里的 'a'.'b' 都是 ModuleId.通过 id 和路径的 ...

  9. Node.js模块 加载笔记

    //核心模块就是Node.js标准API种提供的模块,如fs,http,net.vm等.官方提供,编译成二进制代码//核心模块拥有最高的加载优先级 //文件模块则是存储为单独的文件(或文件夹)的模块, ...

随机推荐

  1. C# 图片保存到数据库和从数据库读取图片并显示

    图片保存到数据库的方法: public void imgToDB(string sql)        {   //参数sql中要求保存的imge变量名称为@images            //调 ...

  2. Delphi 7 升级到 Delphi 2010 总结

    1 字符串 >>string =unicodeString 字母的处理要定义AnsiString了 >>PChar =PWidechar >>str='普通汉字' ...

  3. as3中使用stage ,root ,this 区别详解

    stage:最顶层舞台root:stage的下一级舞台,属于第二层舞台(继承自DisplayObject)this:当前的对象(如果是主时间轴上的this,那它就是root) 继承方面:Stage - ...

  4. grunt自动化工具

    Grunt和 Grunt 插件是通过 npm 安装并管理的,npm是 Node.js 的包管理器. 安装 CLI 首先,需要先将Grunt命令行(CLI)安装到全局环境中. npm install - ...

  5. mydumper原理2

    使用mydumper备份发生Waiting for table flush,导致所有线程都无法读和写 版本 mydumper 0.9.1OS centos6.6 X86_64mysql 5.6.25- ...

  6. debian下Vnc

    1 VNC(Virtual Network Computing,虚拟网络计算)最早是一套由英国剑桥大学AT&T实验 室在2002年开发的轻量型的远程控制计算机软件,其采用了 GPL 授权条款, ...

  7. Helpers\Tags

    Helpers\Tags The tags helper is a collection of useful methods: Tags::clean($data) Clean function to ...

  8. CentOS中TFTP配置

    转载:http://www.centoscn.com/image-text/config/2013/1105/2062.html TFTP是用来下载远程文件的最简单网络协议,它其于UDP协议而实现 1 ...

  9. selenium python 环境搭建(64位 windows)

    之前写了同样的文章,可是后来自己按照给文章再次搭建环境当搭建环境成功后却发现还是无法用.使用from selenium import webdriver,在run的时候却出现ImportError: ...

  10. C# 之 将string数组转换到int数组并获取最大最小值

    1.string 数组转换到 int 数组 " }; int[] output = Array.ConvertAll<string, int>(input, delegate(s ...