CommonJS/AMD和EcmaScript规范简析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuanzhu007/article/details/78785017

一、JS中的模块规范

1、CommonJS

JavaScript诞生于1995年。起初,它的主要目的是用来处理以前有服务器端负责的输入验证。随着互联网的发展,JavaScript的用途早已不再局限于简单的数据验证,而是具备了与浏览器窗口及其内容等几乎所有方面交互的能力,然而它的用途还是局限在浏览器,官方定义的API只能构建基于浏览器的应用程序。随着JS的发展,人们意识到了它的重要性,远不止开发浏览器程序。这么广泛的应用,促使JS急需一个公认规范来一统江湖,于是乎CommonJS应运而生。CommonJS API定义很多普通应用程序(主要指非浏览器的应用)使用的API,从而填补了这个空白。它的终极目标是提供一个类似Python,Ruby和Java标准库。这样的话,开发者可以使用CommonJS API编写应用程序,然后这些应用可以运行在不同的JavaScript解释器和不同的主机环境中。

2009年,美国程序员Ryan Dahl创造了node.js项目,将javascript语言用于服务器端编程。这标志"Javascript模块化编程"正式诞生。因为老实说,在浏览器环境下,没有模块也不是特别大的问题,毕竟网页程序的复杂性有限;但是在服务器端,一定要有模块,与操作系统和其他应用程序互动,否则根本没法编程。NodeJS是CommonJS规范的实现,webpack 也是以CommonJS的形式来书写。

       node.js模块系统,就是参照CommonJS规范实现的。在CommonJS中,有一个全局性方法require(),用于加载模块。CommonJS定义的模块分为:{模块引用(require)} {模块定义(exports)} {模块标识(module)}

       虽说Node遵循CommonJS的规范,但是相比也是做了一些取舍,填了一些新东西的。

2、AMD

基于commonJS规范的nodeJS出来以后,服务端的模块概念已经形成,很自然地,大家就想要客户端模块。而且最好两者能够兼容,一个模块不用修改,在服务器和浏览器都可以运行。但是,由于一个重大的局限,使得CommonJS规范不适用于浏览器环境。CommonJS中定义的模块应用是同步的,同步的,同步的。

       这对服务器端不是一个问题,因为所有的模块都存放在本地硬盘,可以同步加载完成,等待时间就是硬盘的读取时间。但是,对于浏览器,这却是一个大问题,因为模块都放在服务器端,等待时间取决于网速的快慢,可能要等很长时间,浏览器处于"假死"状态。

       因此,浏览器端的模块,不能采用"同步加载"(synchronous),只能采用"异步加载"(asynchronous)。这就是AMD规范诞生的背景。AMD是"Asynchronous Module Definition"的缩写,意思就是"异步模块定义"。它采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。

       CommonJS是主要为了JS在后端的表现制定的,他是不适合前端的,AMD(异步模块定义)出现了,它就主要为前端JS的表现制定规范。


二、JS中的语法规范

虽然 JavaScript和ECMAScript 通常都被人们用来表达相同的含义,但JavaScript的含义却比 ECMA-262 中规定的要多得多。没错,一个完整的JavaScript实现应该由下列三个不同的部分组成 :

  1. 核心(ECMAScript
  2. 文档对象模型(DOM
  3. 浏览器对象模型(BOM

由ECMA-262定义的ECMAScript与Web浏览器没有依赖关系。实际上,这门语言本身并不包含输入和输出定义。ECMA-262定义的只是这门语言的基础,而在此基础之上可以构建更完善的脚本语言。我们常见的Web浏览器只是ECMAScript实现可能的宿主环境之一。宿主环境不仅提供基本的ECMAScript实现,同时也会提供该语言的扩展,以便语言与环境之间对接交互。而这些扩展——如DOM,则利用ECMAScript的核心类型和语法提供更多更具体的功能,以便实现针对环境的操作。其他宿主环境包括Node(一种服务端JavaScript平台)和Adobe Flash。既然ECMA-262标准没有参照Web浏览器,那它都规定了些什么内容呢?大致说来,它规定了这门语言的下列组成部分:
语法、类型、语句、关键字、保留字、操作符、对象


ECMAScript
就是对实现该标准规定的各个方面内容的语言的描述。JavaScript实现了ECMAScript,Adobe、 ActionScript 同样也实现了ECMAScript。 

ECMA-262给出了ECMAScript 兼容的定义。要想成为ECMAScript 的实现,则该实现必须做到:

  1.  支持 ECMA-262 描述的所有“类型、值、对象、属性、函数以及程序句法和语义;
  2.  支持 Unicode 字符标准。

此外,兼容的实现还可以进行下列扩展。

  1.  添加 ECMA-262 没有描述的“更多类型、值、对象、属性和函数”。 ECMA-262所说的这些新增特性,主要是指该标准中没有规定的新对象和对象的新属性。
  2.  支持 ECMA-262 没有定义的“程序和正则表达式语法”。(也就是说,可以修改和扩展内置的正则表达式语法。)

上述要求为兼容实现的开发人员基于 ECMAScript开发一门新语言提供了广阔的空间和极大的灵活性,这也从另一个侧面说明了ECMAScript受开发人员欢迎的原因。


猜你喜欢

转载自blog.csdn.net/xuanzhu007/article/details/78785017