Node.js 入门指南

# Node.js 简介

# 什么是 Node.js

一个 JavaScript 运行时,它能让你在命令行中运行 JS 代码。让 JS 跳出浏览器的约束成为更通用的编程语言。
借助自带的包管理器 npm,能够使用超过百万个第三方开源库,提高日常开发效率。
借助一些扩展库,如 ts-node 可以运行 TypeScript 代码,拥有更多可能性。

# Node.js 的版本

Releases - Node.js

Node.js 的偶数版本作为 LTS(long-term support,长期维护支持),有 30 个月的生命周期。生产环境应该使用 Active LTS 或 Maintenance LTS 版本。
(比如现在是 2020 年 5 月,v14 还处于开发状态中,可以用于个人使用;但服务器部署应该用 v12 或 v10。)

# 为什么要学习使用 Node.js

  • 你要用前端框架 CLI 进行开发,需要通过 Node.js 运行
  • 你要为业务代码进行单元测试,需要通过 Node.js 运行
  • 搭个服务器,搞搞 Serverless
  • 写一些 JS 代码来自动化一些日常琐事(比如文件批量重命名)
  • ...

# 学习 Node.js

# 概览

  • 耗时:
    • 入门,大约需要 0.5~2 小时(基本使用)
    • 熟悉,大约需要 10~20 小时(理解基本设计,踩各种坑:版本管理、调用参数、tsconfig、ESM、Polyfill 等)
    • 深入,……
  • 难点:
    • 理解概念熟练掌握,如模块化、Event Loop 等
    • Node 源码包含 C++ 代码,如果你想深入……
  • 工具:

# 学习路线

  • 前置学习
  • 学习 Node.js 基础
    • Node
      • 学习 Node.js 主要概念
        • 安装 Node.js
        • Node.js 基本概念
        • 模块化相关知识
        • 熟悉内置的核心模块
        • 熟悉使用 npm
      • 通过 Node.js 运行 JS 代码
      • 通读一遍 Node.js 官方文档,了解大致有哪些 API
    • npm
      • 了解 npm 有哪些著名的库
      • 尝试和使用一些流行的 npm 框架、工具
  • 下一步
    • 写一些具有 Node.js 功能的代码,比如自己实现一个 CLI、Task Runner、搭个服务器、给终端写一个 Welcome

# 资料

# 我的其他文章

我写的一些和 Node.js 有关的其他文章。

# 我的学习代码

# 自学教材

# 文字

# 视频

  • Node.js Ultimate Beginner’s Guide in 7 Easy Steps:16 分钟,2020 年,Node 大致概念和基本使用
    • 0:00 - Node 和 Deno 的关系
    • 1:13 - 1. Node 是一个 Runtime,在服务器上(命令行中)运行 JS 代码
    • 2:28 - 2. 如何安装 Node.js,NVM
    • 3:25 - 3. Hello World,REPL(Read Eval Print Loop),默认入口文件名
    • 4:26 - 4. 熟悉 Node.js,consoleglobalprocess
    • 5:18 - 5. 事件,Event Loop,回调函数,EventEmitter
    • 6:58 - 6. 文件系统, fspromises
    • 9:01 - 7. 模块,COMMON JS,ES MODULES,NPM,package.json
    • 11:40 - 建立一个服务器,express
    • 14:57 - 通过 Google Cloud 将代码部署到公网
  • Node.js Tutorial for Beginners: Learn Node in 1 Hour | Mosh:78 分钟,2018 年,简单 Node 原理和一些 Node 自带的模块介绍
    • 00:00 - What is Node:Node.js 的作用,PayPal 使用 Node.js 的情况
    • 03:01 - Node Architecture:Runtime VS 语言 VS 框架
    • 06:04 - How Node Works:单线程异步架构,擅长 IO,不擅长 CPU 密集计算
    • 10:29 - Installing Node
    • 13:01 - Your First Node Program
    • 15:22 - Node Module System
    • 15:52 - Global Object:顶层声明不会像在浏览器里一样变成全局变量
    • 19:14 - Modules:模块化、局部性,module 对象
    • 22:51 - Creating a Modulemodule.exports
    • 27:35 - Loading a Modulerequire,省略文件后缀名,const
    • 32:59 - Module Wrapper Function:Node 加载模块的原理:为什么 module 不是全局对象,为什么不能直接写 exports = xxx__filename__dirname
    • 39:53 - Path Modulepath,路径处理和解析
    • 44:03 - OS Moduleos,系统信息
    • 48:22 - File System Modulefs,文件读写
    • 53:14 - Events Moduleevents,事件
    • 59:33 - Event Arguments:事件参数
    • 62:43 - Extending EventEmitter
    • 70:46 - HTTP Modulehttp
  • Node.js Crash Course:90 分钟,2019 年,视频结构和上面这个类似。有更多 API 演示
    • 1:18 - What is Node.js:Node.js 的组成,为什么使用 Node.js,特性,适用场景
    • 7:42 - NPM:NPM 简介,Node.js 内置的核心模块,第三方库,自定义模块
    • 10:16 - Install Node.js:安装和使用,REPL 模式,NPM 和模块的使用
    • 20:05 - Module Wrapper Function(function(exports, require, module, __filename, __dirname) {})
    • 22:50 - Path Module
    • 28:50 - File System Module
    • 38:00 - OS module
    • 41:25 - URL Module
    • 47:00 - Event Module
    • 50:00 - Logger With Event Emitter
    • 56:00 - HTTP Module
    • 59:00 - Create a Server:使用 http 模块建立一个简单的服务器,多页面,响应多种类型的文件,404。
    • 84:55 - Deploy to Heroku

# NPM 生态

  • npm rank:了解有哪些著名的工具库、框架,可以从中学习到很多代码设计模式和理念。按被依赖次数排名。
  • JavaScript 明星项目:年度 JS 工具热度榜。了解主流开发生态的趋势。按 star 增长率排名。

# Node.js 基本知识体系

# Node.js 基本组成

  • Node.js
    • JS 的部分:JS 接口层,作为可以调用的内置模块,对接 C++ 底层
    • C/C++ 的部分:大部分具体实现,对接第三方底层
  • 第三方底层
    • V8:Google 的 JS 引擎
    • Libuv:主要为 Node.js 而开发的异步 IO 库,功能包含 Event Loop、线程池、文件系统、网络等

# Node.js 的特性

  • 单线程非阻塞 IO

  • 事件,EventEmitter,Event Loop

  • 错误优先回调风格

  • 适合场景

    • RESTful,微服务
    • 即时服务(聊天)
    • CRUD 应用:博客,商城等
    • 小工具

# npm 基本概念

  • node_modules 文件夹
  • package.json 文件

# Node 基本概念和常用核心模块 API

  • 全局对象
    • 全局对象
      • Buffer:二进制数据结构,和一些其他内置模块相关,比如 fs 读取文件
      • global:全局对象,相当于浏览器中的 window 对象
      • process:进程相关,做命令行工具可能会用到
    • 模块作用域中的关键字。并非挂载在 global 上,而是根据文件的不同而不同。这些变量通过 模块包装器 生成。

# Node.js 典型代码

# 一个简单的例子

通过一个简短的例子了解 Node.js 的基本使用以及特色功能。
使用了 pathfsutil 这几个内置模块。
涉及了模块化、async__dirname 这些概念。

文件结构如下:

├── index.js
└── text
    └── hello.md

index.js

const path = require('path');
const { readFile } = require('fs');
const { promisify } = require('util');

const asyncReadFile = promisify(readFile);

const srcFile = path.resolve(__dirname, 'text/hello.md');

(async () => {
  const txt = await asyncReadFile(srcFile, 'utf8');
  console.log('path is:', srcFile);
  console.log('context:', txt);
})();

text/hello.md

Hello World!

运行:

node index.js

输出:

# 将显示你自己的文件夹路径
path is: /tmp/node-demo/text/hello.md
context: Hello World!