学习笔记(30):Node.js基础知识(上)

271 阅读5分钟

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

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

# 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
  • nvmbash_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}`);