1深入了解Node.js:安装、工具、技术架构与底层交互(上)

79 阅读3分钟

一.我们用的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-nodegithub.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++交互具体例子

九. 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自己做了一个