目录
定义
Node.js 是⼀个基于Chrome V8引擎的JavaScript运⾏环境。Node.js使⽤了⼀个事件驱动、⾮阻塞式I/O的模型
浏览器和Node.js架构区别
V8引擎
⽀持语⾔:V8是⽤C ++编写的Google开源⾼性能JavaScript和WebAssembly引擎,它⽤于Chrome和Node.js等;(译:V8可以运⾏JavaScript和WebAssembly引擎编译的汇编语⾔等)
跨平台:它实现ECMAScript和WebAssembly,并在Windows 7或更⾼版本,macOS 10.12+和使⽤x64,IA-32,ARM或MIPS处理器的Linux系统上运⾏;
嵌⼊式:V8可以独⽴运⾏,也可以嵌⼊到任何C ++应⽤程序中;
特点
- 它是⼀个Javascript运⾏环境
- 依赖于Chrome V8引擎进⾏代码解释执⾏
- 事件驱动
- ⾮阻塞I/O
- 轻量、可伸缩,适于实时数据交互应⽤
模块规范
无模块化时代的弊端
- 全局污染
- 依赖管理
CommonJS
Commonjs 的提出,弥补 Javascript 对于模块化,没有统⼀标准的缺陷。nodejs借鉴了Commonjs的Module,实现了良好的模块化管理。
⽬前 commonjs ⼴泛应⽤于以下⼏个场景:
- Node 是 CommonJS 在服务器端⼀个具有代表性的实现;
- Browserify 是 CommonJS 在浏览器中的⼀种实现;
- webpack 打包⼯具对 CommonJS 的⽀持和转换;也就是前端应⽤也可以在编译之前,尽情使⽤CommonJS 进⾏开发。
核心模块
像浏览器提供的 DOM/BOM API ⼀样,Node.js 不仅提供了 JavaScript 运⾏时环境,还扩展出了⼀系列平台API,例如:
- ⽂件系统相关:对应fs模块
- HTTP 通信:对应http模块
- 操作系统相关:对应os模块
- 多进程:对应child_process、cluster模块
node模块化原理
我们为什么能在js文件中直接使用require、module.exports的方法?
在node中,其实质上我们写的代码会拼接到一个包装函数中,比如说我们有一个代码如下:
const test =require('http');
let test = () => {
console.log("i am a teache")
}
module.exports = test;
其最终会被包装成这个样子:
(
function (exports, require, module, __filename__, __dirname__) {
// a模块的代码
const http =require('http');
let test = () => {
console.log("i am a teache")
}
module.exports = test;
}
)
而包装函数如下,其将返回一个字符串,可以通过eval方法来执行该字符串代码:
function wrap(script) {
return 'function(exports, require, module, __filename__, __dirname__) {' +
script
+ '\n}'
}