ECMAScript 规范是为了统一Javascript;
一、CommonJS
(1)加载方式为同步加载;
(2)CommonJS统一了Javascript在浏览器之外的实现;
(3)CommonJS 规范包括了模块(modules)、包(packages)、系统(system)、控制台(console)、二进制(binary)、编码(encodings)、文件系统(filesystems)、套接字(sockets)、单元测试(unit testing)等部分 ;
(4)其中,对于模块的操作主要有:module,exports,require,global等;
注意:
要和ES6的import和export作区别,ES6导出的是变量,是引用;而CommonJS导出的是对象,是拷贝,如果模块内的变化,则不会再影响到已经倒出的;
ES6模块是编译时加载,可以实现静态分析;commonjs是运行时加载;
(5)由于JavaScript官方定义的 JS API只能构建基于浏览器的应用程序,CommonJS API定义了很多普通应用程序(主要指非浏览器的应用)使用的API,从而填补了这个空白;
二、AMD(Asynchronous Module Definition)
(1)规定了在客户端的模块概念;
(2)采用异步方式加载模块;由于CommonJS的模块加载require是同步的,在服务端,因为所有的模块都放再本地硬盘,所有使用同步的方式可以很快的完成加载;但是,对于浏览器而言,所有的模块不在本地,使用同步的方式不友好,且在网速不好的模式下,浏览器会进入假死的状态,所以AMD诞生了。
AMD也采用require()语句加载模块,但是不同于CommonJS,它要求两个参数:
require([module], callback);
第一个参数[module],是一个数组,里面的成员就是要加载的模块;
第二个参数callback,则是加载成功之后的回调函数;
(3)require.js的诞生:
采用传统的<script src="1.js"></script>的写法加载JS模块时,问题:
首先,加载的时候,浏览器会停止网页渲染;
然后,由于JS之间具有依赖关系,所以必须要保证加载的顺序;
为了解决这两个问题,require.js诞生了,它可以:
实现js文件的异步加载,避免网页失去响应;
管理模块之间的依赖性,便于代码的编写和维护;
Node,CommonJS,浏览器、W3C之间的关系;
|------------浏览器-------------| |------------CommonJS--------------|
|BOM| |DOM| |ECMAScript| |FS| |TCP| |Stream| |Buffer| |....|
|------W3C----| |----------------------------Node---------------------|
服务端和浏览器端中使用JS的区别
服务器端JS|浏览器端JS
相同的代码需要多次执行|代码需要从一个服务器端分发到多个客户端执行
CPU和内存资源是瓶颈|带宽是瓶颈
加载时从服务器磁盘中加载|加载时需要通过网络加载