NodeJS介绍
是什么?
- nodejs是一个JavaScript的(服务端)运行环境.
- 它在JavaScript这门语言的基础之上,封装了一些服务端运行时的对象,以支持JavaScript这门语言与操作系统之间的交互.
- (其他表述: NodeJs是基于Chrome的V8引擎的JavaScript运行环境)
图解
Runtime environment: OS:
NodeJS /___________√____________\ win mac linux
/|
|
Base Language:
JavaScript
NodeJS与JavaScript的区别是什么?
- nodejs是一个JavaScript运行环境(平台),JavaScript是编程语言.
NodeJS安装
安装方式汇总
- 方式1: 下载二进制文件安装文件进行安装.
- 方式2: 通过系统包管理进行安装.
- 方式3: 通过源码自行编译.
- 安装成功后,node命令会自动加入我们的系统环境变量path中.
- 我们使用node命令可以访问nodejs可执行命令行工具.
仅安装NodeJS
- 安装地址: nodejs.cn/download/
- 安装过程中无需勾选任何选项.
- 检查版本.
node -v
npm -v
基于nvm安装NodeJS
nvm是什么?
- nvm(node version manager),node版本管理工具.
npx是什么?
- 顺路介绍:npx是npm@5之后新增的命令.
- 使得我们可以在不安装模块在当前环境的前提下,使用一些cli功能.
- 使用场景:
# 此时全局安装了 create-react-app
npm i -g create-react-app
create-react-app some-repo
# 此时⽆论是项⽬中还是全局都没有安装 create-react-app (但实际上是安装了的,但表现确实像没有安装)
npx create-react-app some-repo
1. windows安装nvm
- 快速安装地址:github.com/coreybutler…,选择
nvm-setup.zip安装即可.
# nvm 常用命令
# 查看现存的所有node版本
nvm ls-remote
# 下载指定版本的node,如 nvm install 6.14.4
nvm install <version>
# 启用指定版本的node,如 nvm use 6.14.4
nvm use <version>
# 卸载指定版本的node,如 nvm uninstall 6.14.4
nvm uninstall <version>
# 查看本地的所有node版本
nvm ls
# 查看当前启用的node版本
nvm version
- 下载不流畅可以更换淘宝镜像.
export NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mirrors/node
- 检查安装的nodejs版本和npm版本.
node -v
npm -v
2. mac安装nvm
1.2.1 安装nvm
# mac
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.1/install.sh | bash
# linux
wget -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.1/install.sh | bash
nvm的bash_profile文件里写入以下配置
export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
NodeJS底层依赖
- 主要依赖的子模块有以下内容:
V8引擎: 主要是JS语法的解析,有了它才能识别JS语法.libuv: C语言实现的一个高性能异步非阻塞IO库,用来实现node.js的事件循环.http-parser/llhttp: 底层处理http请求,处理报文,解析请求包等内容.openssl: 处理加密算法,各种框架运用广泛.zlib: 处理压缩等内容.
NodeJS内置模块
- node.js中最主要的内容就是现实了一套CommonJS的模块化规范,以及内置了一些常见的模块.
fs: 文件系统,能够读取写入当前安装系统中的硬盘数据path: 路径系统,能够处理路径之间的问题.crypto: 加密相关模块,能够以标准的方式对我们的内容进行加密.dns: 处理dns相关内容,例如我们可以设置dns服务器等等.http: 设置一个http服务器,发送http请求,监听响应等等.readline: 读取stdin的一行内容,可以读取,增加,删除我们命令行中的内容.os: 操作系统层面的一些api,例如告诉我们当前系统类型以及一些参数.vm: 一个专门处理沙箱的虚拟机模块,底层主要来调用v8的相关api进行代码解析.
CommonJS
CommonJS简介
- 每一个文件相当于一个模块.
- 每个模块都有自己的作用域.
- 模块内部的变量/函数以及类都是私有的,对外是不可见的.
CommonJS案例
- 模块导出:module.exports
function add(a,b){ console.log(a+b) }
function decrease(a,b){ console.log(a-b) }
module.exports = { add, decrease }
- 模块引入:require
let cal = require('./calculate')
cal.add(10,5) cal.decrease(100,50)
CommonJS介绍及源码解析
NodeJS周边工具
1. debug
- 我们可以使用断点进行分步调试打印当前上下文中的变量结果,来定位具体问题出现在哪一步.
- 具体: 我们可以借助vscode或者自行打断点的形式来分步node.js调试.
- 对于js内存泄露,我们同样可以借助工具打印每次内存快照,对比得出代码中的问题.
2. quickjs
- quickjs是一个js解析引擎,轻量代码量也不大,与之功能类似的就是V8引擎.
- 它最大的特点是非常轻量,这点从源码中也能体现,它的主要特点和优势:
- 轻量且易于嵌入: 只需要几个C文件,没有外部依赖,在x86下的简单的"hello word"程序只要180 KiB.
- 具有极低启动时间和快速解释器: 一台单核的台式PC上,大约在100秒内运行ECMAScript测试套件15600次.运行时实例的生命周期不到300毫秒的时间内完成.
- 几乎完整实现ES2019支持,包括:模块,异步生成器和完整Annex B支持(传统的web兼容性).许多ES2020中带来的新策行也也依然会被支持.
- 通过100%的ECMAScript Test Suite测试.
- 可以将javascript源编译为没有外部依赖的可执行文件.
Deno与NodeJS的区别
- 相同点:
- deno也是基于Chrome的V8引擎,上层封装一些系统级别调用,而形成的一个JavaScript运行时环境.
- deno应用也可以使用JavaScript开发.
- 不同点:
- deno基于rust和typescript开发一些上层模块,所以我们可以直接在deno应用中写ts.
- deno支持url加载模块,同时支持top level await等特性.
// top level await node@14.8.0才支持,deno默认支持.
const strings = await import(`/i18n/${navigator.language}`);