一.我们用的node.js版本
- 8以上版本,双数是稳定版,单数是非稳定版
二.如何安装node.js
-
windows
- 去官网下载安装包(不要绿色版)
- 一路下一步,默认配置即可
- 安装为了注销账户(可选)
- 确认命令行里node-v不出错即可
- 不方便安装多版本,可以考虑子系统
-
Mac
- 安装homebrew
- brew install node@8或者l0
- 确认node-v不出错即可
- 如果你需要多版本,可以使用n,nvm等工具
三. 周边工具
-
推荐安装如下工具
- nrm用于切换下载源
- yarn和yrm
- WebStorm或者VSCode
- ts-node可以运行TypeScript的node
-
Windows
- Notepad++临时打开文件,比VSCode快
- cmder可以作为Git Bash的代替品
-
macOS
- iTerm2.app
- oh my zsh
四. node.js不是什么
- 不是web框架
- Node.js并不是web后端框架
- 所以你不能把Node,js与Flask或Spring对比
- 不是编程语言
- Node.js并不是后端的JS
- 所以你不能把Node.js与Python或PHP对比
五. node.js是什么
- 是一个平台
- 它将多种技术组合起来
- 让JavaScript也能调用系统接口、开发后端应用
- Node.js用到了哪些技术
- V8引擎
- libuv
- C/C++实现的c-ares、http-parser、OpenSSL、zlib等库
六. Node.js技术架构
- 随着Node.js的版本不断升级,其架构也在一直变化中,如果你要看源代码,推荐看0.10版本
- 因为这一版使用了很久一段时间,而且源代码比最新版少很多
- 如果你想了解更多,可以看
yjhjstz/deep-into-node,github.com/yjhjstz/dee…
七. 什么是node.js的bindings
-
背景
- C/C++实现了一个http_parser库,很高效
- 你只会写JS,但是你想调用这个库
- 直接调用肯定是不能成功的,你需要一个中间的桥梁
-
bindings
- Node.js用C+对http_parser进行封装,使它符合某些要求,封装的文件叫做http_parser_bindings.cpp
- 用Node.js提供的编译工具将其编译为.node文件,编译成.node文件不是必须的,可以是其他的任何可行方式
- JS代码可以直接require这个.node文件
- 这样JS就能调用C++库,中间的桥梁就是binding
- 由于Node.js提供了很多binding,所以加个s,这就是bindings
八. JS与C++交互具体例子
-
JS调用C++代码
-
C++调用JS回调
九. node.js v0.10的deps目录
- nodejs中的deps里面主要依赖的一些c++库
- 主要知道两个uv,libuv和v8,js引擎 2.png
- 其它的不是特别重要cares是dns的库,http_parser是http的库,openssl是https用的,zlib是做压缩用的
十. libuv是什么
- 背景
- nodejs作者Ryan为了一个跨平台的异步I/O库,开始写libuv
- FreeBSD系统上有kqueue
- Linux系统上有epoll
- Windows系统上有IOCP
- libuv会根据系统自动选择合适的方案
- 功能
- 可以用于TCP/UDP/DNS/文件等的异步操作
十一. v8是什么
- 功能
- 将JS源代码变成本地代码(可以理解成机器码0101)并执行
- 维护调用栈,确保JS函数的执行顺序
- 内存管理,为所有对象分配内存
- 垃圾回收,重复利用无用的内存,注意垃圾回收是为了重复利用,因为内存是有限的
- 实现JS的各种标准库
- 注意
- V8不提供DOM API
- V8执行JS是单线程的,注意这里说的只是执行js是单线程的,它的内存管理可能是一个线程,垃圾管理可能是一个线程,v8本身是多线程的
- 理论上可以开启两个线程分别执行JS,这两个线程毫无关系
- V8本身是包含多个线程的,如垃圾回收为单独线程
- 自带event loop但Node.js基于libuv自己做了一个