从amd与commonJS理解nodejs

首先,两者的目的都是为了理清js代码的依赖关系,将js代码模块化(js本身不是模块化的,不能使用模块行为)。commonJS是同步的,杰出代表是nodejs(关键字require,module.exports)。amd是异步的,杰出代表是requirejs(关键字??)。因此决定了amd在浏览器端是可用的,commonJS是不可用的,在浏览器端模块加载采用异步的手段就是回调函数,只有加载完毕才执行回调内容。commonJS在服务器端,延迟仅为磁盘响应,可以忽略(浏览器端的延迟是http延迟)。

npm是一个包管理工具,比如在某个目录下执行npm install module_name,则会在该目录下生成node_modules文件夹,并将模块放置其中。在代码中使用import export之类的语句,编译时使用npm install,就会下载相应的模块,在运行时进行模块加载。

webpack,这是一个打包工具,在TypeScript(javascript的扩展),es6上,模块是支持的,但是在当前浏览器上不能支持,webpack负责理清依赖关系,打包成一个可执行的js文件。从原理上而言:webpack打包好的js文件总体上是一个立即执行函数,此函数的参数为一个数组,数组的元素是一些包裹着我们编写的各个模块的匿名函数。在js代码运行时,执行IIFE,此函数的主函数是一个叫做__webpack_require__的函数,在IIFE掉用它,他又会调用模块(默认掉用0模块),而如果模块之间有依赖关系,则在模块内再调用__webpack_require__。


nodejs:
nodejs在逻辑上采用了commonJS规范,这是从js代码的层面上而言的,也就是说用node写的(包括nodejs官方提供的包,自己开发的包)js代码是要遵守commonJS规范的,而nodejs是如何保证这样的规范的呢,是通过基于v8引擎(也就是一份普通的c++代码)的开发,比如赛码网提供的read_line函数,就是基于v8的接口,类似的nodejs的require、module.exports也是基于v8的c++代码实现的,但这只是简单的,nodejs应该提供了自己携带的包,这些包用js包装了接口,所以nodejs项目应该是是两方面的工作,一方面是c++代码扩展v8,另一方面是js代码提供基础包。

v8是可以与操作系统交互的,因此可以完成文件的读写,网络请求、应答等所有接口的实现。进一步而言,v8原本只能解析最普通的js代码,对v8进行扩展也就扩展了js,但这种扩展没有脱离js语言的特性,由于js的一些语言层面的特性,导致nodejs可以设计出更好的事件处理机制(单线程的循环非阻塞来应对并发,极大地增大了并发能力)