模块加载方案
?
??? 关于综述部分可见:第五届 d2 相关介绍,需要知道的是模块加载已经有语言级的提案,正是由于它是语言级,估计很长时间内都不会实现。而由民间形成的事实规范 commonJS 则是非常可行,恰当的比喻是 ecma4 语言级的类继承机制与目前 javascript 模拟的类继承。
?
先行者:
?
最先引入模块管理加载的据说是 dojo ,不过一直没有用过,采用的 xhr 下载脚本文件 eval,这种方案由于跨域情景导致了不少问题。
?
yui2 从 2 后期引入了 loader,到 yui3 已经形成了比较成熟的加载方案,利用动态添加脚本标签来实现下载解析,通过串行下载来避免复杂的依赖管理(目前来看也是缺点),另一个问题就是组件集中配置过于冗余。
领先者:
?
目前最流行的应该是 LABjs (oldj's analysis),但本质上讲它只能算作脚本文件加载工具,并不涉及模块管理方面,对于大型应用似乎力所不及。
?
最“规范”的要算 requireJS,自己的实现部分提案成了commonJS浏览器端的异步模块加载规范。其中的一个亮点就是通过参考其他语言机制关于约定模块与文件路径的对照关系来解决中央配置冗余。
?
代码也确实比较复杂,充分利用了浏览器并行下载文件( Roundup on Parallel Connections )的特性,当一个文件代表一个模块时,采用动态加载,可以省略模块名:
?
?
?
var queuedcallbacks;attach(mod) { scriptload(r.path,load);}main(mod,deps){ //保存内容较少 function callback(){ mod.dep++; if(mod.dep==deps.length) execmod(mod) } foreach(d:deps){ queuedcallbacks[d].push(callback); } if(mod.dep==deps.length) execmod(mod)}execmod(mod){ init mod //通知等待该模块的模块 foreach( func in queuedcallbacks[mod]) func();}load(){ mode=get mod from script node deps=get mod's dependence main(mod,deps); foreach( d: deps){ attach(d) }}?API 设计:模块与包的设计
?
?
refer :
?
Loading Scripts Without Blocking
?
Thoughts on script loaders
?
Jquery 也要支持 commonjs AMD :
Standards and proposals for JavaScript Modules and jQuery
?
新的 proposal ?
AMD vs Wrappings
?
?
?
?
?
?
1 楼 jiahao1110 2011-01-03 如果我定义了A,B,C,D四个模块,并且A,B,C都依赖 D 模块,如果某个应用里面需要加载A,B,C模块,那么每个模块是否都会加载依赖 D 模块啊? 2 楼 yiminghe 2011-01-04 jiahao1110 写道如果我定义了A,B,C,D四个模块,并且A,B,C都依赖 D 模块,如果某个应用里面需要加载A,B,C模块,那么每个模块是否都会加载依赖 D 模块啊?
会的,模块加载机制保证下载并初始化D模块一次,然后初始化 A,B,C 模块,最后执行用户回调