前面提到,为实现与NodeJS相同方式的模块写法,大牛们做了很多努力。
但由于浏览器环境不同于服务器端,它的模块有一个HTTP请求过程。这个请求过程多数使用script tag,script tag默认的异步性导致很难实现与NodeJS一模一样的模块格式。
Modules/Wrappings 使得实现变为现实。虽然和NodeJS的模块写法不完全一致,但也有很多相似之处,使得熟悉NodeJS的程序员有一些亲切感。
但NodeJS终究是服务器端的JavaScript,没有必要把这些条条框框放到浏览器JavaScript环境中。这时AMD 诞生了,它的全称为异步模块定义。从名称上看便知它是适合script tag的。也可以说AMD是专门为浏览器中JavaScript环境设计的规范。它吸取了CommonJS的一些优点,但又不照搬它的格式。开始AMD作为CommonJS的transport format 存在,因无法与CommonJS开发者达成一致而独立存在。它有独立的wiki 和讨论组 。
AMD设计出一个简洁的写模块API:define 。
define(id?, dependencies?, factory);
其中:
- id: 模块标识,可以省略。
- dependencies: 所依赖的模块,可以省略。
- factory: 模块的实现,或者一个JavaScript对象。
id遵循CommonJS Module Identifiers 。dependencies元素的顺序和factory参数一一对应。
以下是使用AMD模式开发的简单三层结构(基础库/UI层/应用层):
base.js
define(function() { return { mix: function(source, target) { } }; });
ui.js
define(['base'], function(base) { return { show: function() { // todo with module base } } });
page.js
define(['data', 'ui'], function(data, ui) { // init here });
data.js
define({ users: [], members: [] });
以上也演示了define的三种用法,
1,定义无依赖的模块 (base.js)
2,定义有依赖的模块 (ui.js,page.js)
3,定义数据对象模块 (data.js)
细心的会发现,还有一种没有出现,即具名模块
4,具名模块
define('index', ['data','base'], function(data, base) { // todo });
具名模块多数时候是不推荐的,一般打包工具合并多个模块到一个js文件中时会使用。
前面提到dependencies元素的顺序和factory一一对应,其实不太严谨。AMD开始为摆脱CommonJS的束缚,开创性的提出了自己的模块风格。但后来又做了妥协,兼容了 CommonJS Modules/Wrappings 。即又可以这样写
5,包装模块
define(function(require, exports, module) { var base = require('base'); exports.show = function() { // todo with module base } });
不考虑多了一层函数外,格式和NodeJS还比较象的。使用require获取依赖模块,使用exports导出API。
除了define外,AMD还保留一个关键字require。require 作为规范保留的全局标识符,可以实现为 module loader。也可以不实现。
相关:
相关推荐
### JS中的模块规范(CommonJS, AMD, CMD) #### 一、CommonJS CommonJS 是一种模块化标准,最初被设计用于服务器端JavaScript环境,特别是针对Node.js这样的平台。CommonJS 的核心理念是允许开发者将代码组织成独立...
AMD(Asynchronous Module Definition)规范就是一种处理模块化编程的方法,尤其在浏览器环境中广泛应用。RequireJS是实现AMD规范的一个著名库,它使得在浏览器端进行模块化加载变得可能。 AMD规范主要解决的是...
AMD规范由RequireJS提出并广泛推广,旨在解决JavaScript在浏览器环境中由于脚本加载顺序问题导致的依赖关系难题。 在JavaScript开发中,包管理器扮演着重要的角色。它们帮助我们组织代码,管理依赖,以及自动化构建...
### JS中的模块规范详解 #### 一、CommonJS **CommonJS** 是为了解决JavaScript在实际应用中缺乏模块化支持的问题而诞生的一种规范。它最初是为了让JavaScript能够在服务器端运行,尤其是为了适应Node.js这样的...
6. **AMD与CommonJS的区别**:与CommonJS(Node.js中使用的模块系统)相比,AMD更适合浏览器环境,因为它支持异步加载,而CommonJS则适用于服务器端,其模块加载是同步的。 7. **工具支持**:RequireJS是实现AMD...
AMD是JavaScript模块化的一种设计模式,它解决了在浏览器环境中并行加载多个模块的问题。AMD允许模块和它们的依赖关系同时加载,而不是等待一个模块完全加载后再加载下一个。这在处理多个脚本文件时非常有效,尤其是...
然而,随着技术的发展,目前ES6模块规范(ES Modules)已经被ECMAScript官方标准化,并得到了现代浏览器的广泛支持。ES Modules提供了更现代化的模块导入导出语法,它将逐渐成为主流的JavaScript模块化解决方案。
本文将重点介绍三种主流的JavaScript模块化规范:CommonJS、AMD(Asynchronous Module Definition)以及CMD(Common Module Definition),并通过对比分析它们的特点和应用场景。 #### 二、为何而生 这三个规范都...
2. CommonJS 规范: CommonJS 是服务器端JavaScript模块化的一个标准,允许开发者通过`require()`函数引入模块,并通过`module.exports`或`exports`导出模块。SeaJS虽然在浏览器环境中使用,但其设计思路和API很大...
社区模块规范: 1.CommonJS规范 规范实现者: NodeJS 服务端 Browserify 浏览器 2.AMD规范 全称 异步模块定义 规范实现者: RequireJS 浏览器 3.CMD规范 通用模块定义 规范实现者: seaJS 服务端和浏览器通用...
这种方式相比CommonJS或AMD等早期模块规范,更符合静态类型语言的设计理念,可以进行静态分析,从而提高编译时优化的可能性。 **二、JTaroModule的核心功能** 1. **模块加载**:JTaroModule能自动扫描并加载项目中...
异步模块定义(AMD)的编程接口提供了定义模块,及异步加载该模块的依赖的机制。它非常适合于使用于浏览器环境,浏览器的同步加载模块机制会带来性能,可用性,调试和跨域访问的问题。
1. **模块化开发**:OYE遵循AMD规范,允许开发者创建和组织模块化的JavaScript代码。 2. **插件支持**:OYE支持自定义插件,扩展其功能以适应不同的应用场景。 3. **构建工具**:OYE Builder提供了一整套构建流程,...
在实际应用中,开发者可以根据项目需求和团队习惯选择合适的模块规范,同时也可以考虑使用Browserify、Webpack等现代前端打包工具,这些工具提供了将CommonJS、AMD、CMD等多种模块规范转换为浏览器兼容的代码的能力...
AMD(Asynchronous Module Definition)是一种常见的模块加载规范,它允许异步加载模块,特别适用于浏览器环境。Babel则是一个广泛使用的JavaScript编译器,它能将ES6+的新特性转换为广泛支持的JavaScript版本,以便...
- **CommonJS**和**AMD**是两种主要的JavaScript模块规范,分别适用于服务器端和浏览器端。 - **异步加载**(如AMD规范所支持的)对于优化浏览器端的应用体验非常重要。 - **库支持**:通过使用如Require.js这样的库...
AMD,即Asynchronous Module Definition(异步模块定义),是一种JavaScript模块化开发的规范,它允许在浏览器环境中异步加载和管理模块。AMD规范主要由RequireJS提出并推广,旨在解决JavaScript代码的组织、依赖...
异步模块定义(AMD)是一种在浏览器环境中实现模块化的技术,它允许我们并行加载和执行脚本,提高了网页的加载速度。AMD 的核心思想是将每个模块定义为一个独立的函数,该函数接收两个参数:`require` 和 `define`。...