学习 Node.js 开发必备基础知识

326 阅读4分钟

本文已参与掘金创作者训练营第三期「话题写作」赛道,详情查看:掘力计划|创作者训练营第三期正在进行,「写」出个人影响力

一、 Node.js 介绍

github 仓库 : Node.js GitHub Repo stars

1.1 简介

Node.js 自身哲学: 花最小的硬件成本, 追求 更高的并发, 更高的处理性能

Chrome 浏览器上, 用于 JavaScript 解析的 V8 引擎, 被 Ryan Dahl 鬼才 搬到了服务器上, 用于做服务器的软件 --- Node.js.

作者于 2009年2月 提交第一行代码,取名为 node, 5月份正式向往外界公布这个 node 项目; 2009年底, 在柏林 JSConf EU 上的演讲后, Node.js 开始流行.

1.2 作用:

解决服务器高性能瓶颈问题

  • 可以访问本地文件: 读取/ 修改 / 删除 等
  • 构建服务器
  • 连接数据库
  • 玩转多进程

Node.js 是一个专注于实现高性能 web 服务器优化的 zhuan 家, 历经挫折, 几经探索, 遇到 V8 而诞生的项目.

一个使用 JS 进行编程, 让 JavaScript 可以运行在 服务器端 的开发平台, 可以与 PHP / JSP / Python / Ruby 等平起平坐(但是这四个即是平台也是语言)

因为Node.js是单线程当计算业务繁重时就会被阻塞,其他用户将无法访问, 所以Node.js适合开发I/O多的业务,而不适合开发计算多的业务,并且Node.js这种剑走偏锋的模式,也注定了其难以胜任安全性高,体量大的项目。

Node.js应用非常广泛,并且其拥有世界上最大的开源库 NPM,像 python一样可以进行顶层路由设计等特点。

Node.js 就是一个运行环境,可以在这个环境上运行 JS 代码,Node.js使 JavaScript 更加灵活不在局限与客户端。

1.3 Node.js 的三个特点:

  1. 事件驱动 --- 基于事件与回调函数
  2. 单线程 --- 减少内存开销
  3. 异步 I/O (非阻塞 I/O)

其实三个特点说的是一件事

弱点:

  1. 无法利用多核 CPU
  2. 错误会引起整个应用退出, 应用的健壮性值得考验
  3. 大量计算占用 CPU, 会导致无法继续调用异步 I/O. (解决方案: 使用子进程 child process)

1.4 Node.js 的事件循环 Event Loop

事件循环是 Node.js 处理非阻塞 I/O 操作的机制

就是方法以参数的形式被传递,然后以同步的方式执行方法,也就是常说的 callback,执行在单线程上. 这不又转到了单线程上了.

当 Node.js 启动后,它会初始化事件循环,处理已提供的输入脚本(或丢入 REPL,本文不涉及到),它可能会调用一些异步的 API、调度定时器,或者调用 process.nextTick(),然后开始处理事件循环。

更多详细内容请查看 Nodejs.org 官方文档-事件循环

1.5 中间件

中间件(MiddleWare) 可以理解为一个对用户请求进行过滤和预处理的工具(函数),

Node.js中,中间件主要是指封装 http 请求细节处理的方法函数. 它一般不会直接对客户端进行响应, 而是将处理之后的结果传递下去.

二、Node.js 小试牛刀 使用

2.1 安装

官网: nodejs.org/en/ / 官网中文: nodejs.org/zh-cn/

下载安装包:

2-node-home

选择下载安装包后, 进行安装

2-node-install

安装后可使用命令 node -v , 查看 node 版本 --- v14.17.5

2.2 使用 Node.js

  1. 命令行

REPL 工具: (cmd --> node) 交互式的编程环境:

输入 node 回车就可以进入 node 的命令行环境, 可进行 JavaScript 的运算等

Tips: 可以单独开一个终端, 方便地验证 Node API 和 JavaScript API 是否正确

node-cmd

Node.js npm 指令

npm: Node Package Manager  Node.js 的一个包管理工具.

npm 帮助我们完成第三方模块的发布,安装和依赖等, 借助 npmNode.js 与 第三方模块 之间形成了 Node.js 的庞大生态系统。

Node.js 一起安装的开发工具,方便 js 安装、上传、下载包管理工具.

Node.js 的 文件系统

Node.js 的文件系统, 简单说就是 通过 Node.js 的内置模块 fs 来操作本地系统中的文件

fs 模块中所有的操作都有两种形式可供选择: 同步异步

这里简单列举一些相关 API

同步文件的写入, 操作的步骤:

  1. 打开文件
fs.openSync(path,flags [, mode])
  1. 向文件中写入内容
fs.writeSync(fd,string [ , position [, encoding]])
  1. 保存并关闭文件
fs.closeSync(fd)

异步文件的写入

  1. 打开文件
fs.open(path,flags[, mode],callback)
  1. 用异步写入一个文件
fs.write(fd,string[ ,positon[ , encoding] ],callback)
  1. 关闭一个文件
fs.close(fd, callback)

简单文件的写入:

fs.writeFile(file,data[,options],callback)
fs.writeFileSync(file,data[, options])