本文仅讨论具名模块的情况,即通过spm打包出来的模块.

想起ID与路径统一原则,详见https://github.com/seajs/seajs/issues/930

今天又研究了下seajs源码,源码中并没有显式的判断id与路径相不相等,即没有类似如下的代码

if(id == uri){

mod.exec();

}

假定被加载的模块为a.js

step1:在加载a.js前,就创建并缓存了a.js的module实例A,key值为a.js的全路径,暂定为uriA

step2:定义好onload事件(这里ie又出来捣乱了),创建script标签插入head

step3:浏览器加载完a.js后,执行define方法跟踪代码到seajs内部,发现并没有做什么特别的事,只是调用了Module.save方法,id与路径的匹配即体现在这个save方法中.且看源码:

 // Save meta data to cachedMods
Module.save = function(uri, meta) {
var mod = Module.get(uri) // Do NOT override already saved modules
if (mod.status < STATUS.SAVED) {
mod.id = meta.id || uri
mod.dependencies = meta.deps || []
mod.factory = meta.factory
mod.status = STATUS.SAVED
}
}

第3行,获取缓存中的module,uri是模块中的id.

假如id与加载路径相等,那么这里可以获取到step1缓存的A,然后将factory等属性赋给A,结束

假如id与加载路径不相等,那么这里将获取不到A,会新创建一个新实例B

step4:浏览器执行完a.js的代码,执行onload回调,进行一系列的属性操作(比如waiting和remain)和依赖模块的加载等等,这里有递归...需要花点时间才能看懂.

step5:等step4的所有递归执行完,也即a.js及其所有依赖模块都已加载完,执行完,进入就绪状态,执行a.js的factory,这里的factory从A中获取,A通过uriA从缓存中获取.

如果step3中,a.js中的id与加载它的路径不一致,那么这里A中的factory将是undefined,所以你的factory方法就不执行.

以上是seajs处理模块的大致流程.

至于使id与路径一致,通常的做法是,use或require里的直接量字符串参数与模块里的id相等.比如

//html页面
seajs.use("app/start",function(){
// code
})
//start.js
define("app/start",["jquery/jquery/1.7.2/jquery"],function(require, exports, module){
//code
})

不过,这两个值通过seajs内部resolve过后能相等,也是可以的.

seajs模块加载与执行原理小记的更多相关文章

  1. java的加载与执行原理剖析

    到目前为止,我们接触过的重点术语,总结一下: Java体系的技术被划分为三大块: JavaSE:标准版 JavaEE:企业版 JavaME:微型版 安装JDK之后: JDK:java开发工具箱 JRE ...

  2. seaJS 模块加载过程分析

    先看一个seajs的官方example,  以下以seajs.use('main')为例, 解析加载mod main的过程 //app.html seajs.use("main") ...

  3. java的加载与执行原理详解

    java程序从开发到最终运行经历了什么? (31) 编译期: 第一步:在硬盘某个位置(随意),新建一个xxx.java文件 第二步:使用记事本或者其他文本编辑器例如EditPlus打开xxx.java ...

  4. JavaScript AMD 模块加载器原理与实现

    关于前端模块化,玉伯在其博文 前端模块化开发的价值 中有论述,有兴趣的同学可以去阅读一下. 1. 模块加载器 模块加载器目前比较流行的有 Requirejs 和 Seajs.前者遵循 AMD规范,后者 ...

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

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

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

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

  7. 转: javascript模块加载框架seajs详解

    javascript模块加载框架seajs详解 SeaJS是一个遵循commonJS规范的javascript模块加载框架,可以实现javascript的模块化开发和模块化加载(模块可按需加载或全部加 ...

  8. javascript模块加载框架seajs详解

    SeaJS是一个遵循commonJS规范的javascript模块加载框架,可以实现javascript的模块化开发和模块化加载(模块可按需加载或全部加载).SeaJS可以和jQuery完美集成,使用 ...

  9. SeaJS:一个适用于 Web 浏览器端的模块加载器

    什么是SeaJS?SeaJS是一款适用于Web浏览器端的模块加载器,它同时又与Node兼容.在SeaJS的世界里,一个文件就是一个模块,所有模块都遵循CMD(Common Module Definit ...

随机推荐

  1. LeetCode Question Difficulty Distribution

    参考链接:https://docs.google.com/spreadsheet/pub?key=0Aqt--%20wSNYfuxdGxQWVFsOGdVVWxQRlNUVXZTdEpOeEE& ...

  2. Linux第五次学习笔记

    处理器体系结构 Y86指令集体系结构 定义一个指令集体系结构 ,包括定义各种状态元素.指令集和它们的编码.一组编程规范和异常事件处理. 程序员可见的状态 Y86程序中的每条指令都会读取或修改处理器状态 ...

  3. 通俗易懂------this指向

    因为JavaScript 中this 是在运行期进行绑定的,因此JavaScript 中this 关键字具备多重含义. 具体在实际应用中,this的指向大致可以分为下面4种. 作为对象的方法调用   ...

  4. TranslateAnimation 使用详解

    Android JDK为我们提供了4种动画效果,分别是: AlphaAnimation,RotateAnimation, ScaleAnimation, TranslateAnimation.今天我想 ...

  5. <实训|第四天>Linux下的vim你真的掌握了吗?附上ftp远程命令上传。

    期待已久的linux运维.oracle"培训班"终于开班了,我从已经开始长期四个半月的linux运维.oracle培训,每天白天我会好好学习,晚上回来我会努力更新教程,包括今天学到 ...

  6. 20.C#LINQ基础和简单使用(十一章11.1-11.2)

    终于看到了第11章,之前虽然也有看过,但没有太仔细,在工作中也偶尔会使用,但不明白其中的原理,那现在就来讲讲LINQ,做一做书虫~~ 首先先了解下LINQ的三个要点: LINQ不能把非常复杂的查询表达 ...

  7. 自动化测试UI Test, Performance Test, Load Test 总结整理

    MSDN: 测试应用程序,Test apps early and often ,Improve Code Quality 推荐书: <Visual Studio 2015高级编程> < ...

  8. json2.js的初步学习与了解

    json2.js的初步学习与了解,想要学习json的朋友可以参考下. json2.js的初步学习与了解 1.)该js的下载地址是:http://www.json.org/json2.js 2.)在页面 ...

  9. 【CSU 1556】Pseudoprime numbers

    题 Description Jerry is caught by Tom. He was penned up in one room with a door, which only can be op ...

  10. 学习使用Robot Framework自动化测试框架-web元素定位

    转:http://blog.csdn.net/u012145166/article/details/50342569 1.name和id 其中使用到了name和id定位.但有时候由于开发人员的疏忽或者 ...