关于综述部分可见:第五届 d2 相关介绍
,需要知道的是模块加载已经有语言级的提案
,正是由于它是语言级,估计很长时间内都不会实现。而由民间形成的事实规范 commonJS
则是非常可行,恰当的比喻是 ecma4
语言级的类继承机制与目前 javascript 模拟的类继承。
先行者:
最先引入模块管理加载的据说是 dojo
,不过一直没有用过,采用的 xhr 下载脚本文件 eval,这种方案由于跨域情景导致了不少问题。
yui2 从 2 后期引入了 loader
,到 yui3
已经形成了比较成熟的加载方案
,利用动态添加脚本标签来实现下载解析,通过串行下载来避免复杂的依赖管理(目前来看也是缺点),另一个问题就是组件集中配置过于冗余
。
领先者:
目前最流行的应该是 LABjs
(oldj's analysis
),但本质上讲它只能算作脚本文件加载工具,并不涉及模块管理方面,对于大型应用似乎力所不及。
最“规范”的要算 requireJS
,自己的实现部分提案
成了commonJS浏览器端的异步模块加载规范。其中的一个亮点就是通过参考其他语言机制关于约定模块与文件路径的对照关系
来解决中央配置冗余。
代码也确实比较复杂,充分利用了浏览器并行下载文件
( Roundup on Parallel Connections
)的特性,当一个文件代表一个模块时,采用动态加载,可以省略模块名:
define(function(){
return {
modulePart:"part"
};
});
如果想提高性能,部分模块进行静态载入时,提供了编译脚本
,在 rhino
解释引擎下调用 cc 的解析 java 程序
,parse 出 AST 后将文件名加入到define 参数中 :
define(“moduleName”,function(){
return {
modulePart:"part"
};
});
这也是令我十分激动的地方,用 js 写个语法解析器
确实不是那么简单,那么对于这种后端处理调用现有 java 的成熟程序,既充分利用了 js 的灵活性,也吸取了静态语言的严谨性。
方案:
js 动态加载的问题是:下载完毕就会立即进行脚本的解析执行,从而如果要利用并行的同时又要处理好依赖关系则只能通过 function wrapper
(来源于 module pattern
)来解决,模块的代码通过一个匿名函数包装,从而实现下载和模块的执行分离。
依赖解决:
require(["module1","module2"],callback);
基本思想即是:在下载一个模块完毕后,并行下载其依赖的模块文件,而如果一个模块没有依赖项则立即初始化自己,并通知其他依赖自己的模块。其中下载依赖,依赖下载完毕后再下载依赖的依赖(直至没有依赖)是一个递归的过程,而关键在于如何一层层从底层开始通知顶层模块依赖的加载结束。
实现方式分为两类:
1.内部函数
将依赖项通知函数 check 定义在模块加载函数中,通过闭包将依赖项和其通知的模块绑定在一起。
function attach(mod,callback){
var requires=mod.requires;
for each( r : requires){
attach(r,check)
}
//作用域链保存了过多内容
function check(){
attach mod.requires if added
if( mo.requires all is loaded) {
init mod
callback
}
}
scriptLoad(mod.path,check);
}
优点是:程序简单清晰,缺点则是内部函数定义导致的过多内容被存放在函数作用域中,内存问题。
2.requireJS 采取的等待队列
将通过递归进行的逐层向上回调通过程序显式的等待回调集合来模拟(提高了复杂度),优点则是比定义内部函数闭包更节省内存:
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
- 大小: 12.7 KB
分享到:
相关推荐
1.AMD(require.js),require 的第一个参数表示依赖的模块的路径,第二个参数表示此模块的内容 1.CMD 推崇依赖就近,AMD 推崇依赖前置
为了解决这一问题,论文提出了一种内核模块加载控制系统的设计方案。该系统旨在通过监控所有可能的内核模块加载接口,并根据预先设定的保护域和用户验证来控制内核模块的加载过程,从而提高操作系统的安全性和稳定性...
modJS 是一套的前端模块加载解决方案。与传统的模块加载相比,modJS 会根据产品实际使用场景,自动选择一种相应的方案,使最终的实现非常轻量简洁。 使用 模块的定义 modJS是一个精简版的AMD/CMD规范,并不完全...
AMD(Asynchronous Module Definition)规范是一种在JavaScript中实现模块化加载的方案,它允许开发者异步地加载和依赖管理代码,特别...此外,理解这个简单的加载器也可以为自定义或优化现有模块加载方案提供参考。
Require.js作为一种优秀的AMD规范实现,提供了简洁高效的模块加载方案,适合用于大型项目或需要高效加载机制的应用场景。通过使用Require.js,开发者可以更轻松地管理项目的依赖关系,同时提高页面加载速度和用户...
2. **AMD(Asynchronous Module Definition)**:一种用于浏览器环境的异步模块加载方案,支持按需加载模块,由RequireJS提出并推广。AMD规范的主要特点是异步加载模块,允许开发者在不阻塞浏览器的情况下加载模块。...
- **AMD (Asynchronous Module Definition)** 是一种用于浏览器环境的异步模块加载方案,如RequireJS实现,通过`define()`定义模块,`require()`异步加载。AMD适合浏览器环境,因为它允许并行加载资源。 2. **ES6 ...
### 一种基于加密模式的Linux安全模块加载机制 #### 摘要与背景介绍 本文主要探讨了Linux可加载内核模块(Loadable Kernel Modules, LKMs)机制,并提出了一种基于加密模式的安全模块加载机制,以解决现有的LKMs在...
Seajs虽然不能直接在服务器端运行,但它借鉴了CommonJS的理念,提供了浏览器环境下的模块加载方案。在seajs-2.2.1版本中,我们可以找到以下几个核心概念和功能: 1. **模块标识符**:Seajs使用URI(统一资源标识符...
RequireJS 是一款 JavaScript 模块管理和加载库,尤其在处理异步加载和管理复杂项目中...随着 ES6 模块标准的引入,虽然未来可能会有新的模块加载方案,但 RequireJS 仍然是当前广泛使用的解决方案,尤其在现有项目中。
因此,在浏览器环境中,我们通常采用异步模块加载方案,如**AMD(Asynchronous Module Definition)**或**ES6模块**。 AMD由RequireJS推广,允许异步加载模块,适合浏览器环境。而ES6模块,即ECMAScript 6引入的...
SeaJS 是一款专为Web端设计的JavaScript模块加载器,它的出现是为了解决JavaScript在浏览器环境中的组织和管理问题。随着Web应用的复杂度不断提升,JavaScript代码的组织和依赖管理变得至关重要,SeaJS 提供了一种...
AMD是由RequireJS推广的一种异步模块加载方案,它允许模块及其依赖异步加载,解决了浏览器环境中的同步加载问题。在AMD中,模块的定义和加载是分离的,这使得模块的加载更加灵活。例如: ```javascript // 定义模块...
- **AMD**:异步模块定义规范,早期浏览器端常用的模块加载方案。 #### 2. 模块编写实践 - **示例**:在`module-a.js`文件中,通过IIFE(立即执行函数表达式)的方式定义了一个模块,其中包含了`method1`方法,并将其...
AMD模块格式是由RequireJS提出的一种异步模块加载方案,它允许我们在JavaScript中进行模块化开发,使得代码结构更加清晰,同时也支持按需加载,提高了页面的性能。在使用Babel时,如果项目依赖AMD模块系统,这个插件...
然而,RequireJS 也有其局限性,比如对于某些大型单页应用,它可能不如其他现代的模块加载解决方案如Webpack或Rollup。这些工具提供了更强大的静态分析和优化能力,可以处理更多的构建任务,如代码分割、Tree ...
3. **模块加载**:Atlas的ClassLoader检测到新模块后,将其加载到内存中,使其可被应用调用。 4. **模块初始化**:如果模块需要进行特定的初始化操作,如注册服务等, Atlas会协助完成。 ### 5. AtlasTest-master...
SeaJS 是一款强大的JavaScript模块加载框架,其设计目标是遵循CommonJS规范,为开发者提供一个在浏览器环境中组织和管理代码的高效工具。CommonJS规范旨在促进JavaScript模块化,使得代码可复用性和可维护性得到显著...
SeaJS是中国开源社区贡献的一款JavaScript模块加载框架,其主要目标是为Web开发提供一种遵循CommonJS规范的模块化解决方案。这个框架的版本v0.9.1是一个免费版,适用于各种项目开发,帮助开发者更有效地组织和管理...
SeaJS 是一个专门为 JavaScript 设计的模块加载框架,它的出现是为了应对 JavaScript 在大型项目中代码组织和管理的挑战。在 JavaScript 开发中,模块化是一个关键的实践,它有助于提高代码的可读性、可维护性和复用...