本文已参与掘金创作者训练营第三期「话题写作」赛道,详情查看:掘力计划|创作者训练营第三期正在进行,「写」出个人影响力
一、 Node.js
介绍
github 仓库 : Node.js
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
的三个特点:
- 事件驱动 --- 基于事件与回调函数
- 单线程 --- 减少内存开销
- 异步 I/O (非阻塞 I/O)
其实三个特点说的是一件事
弱点:
- 无法利用多核 CPU
- 错误会引起整个应用退出, 应用的健壮性值得考验
- 大量计算占用 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/
选择下载安装包后, 进行安装
安装后可使用命令 node -v
, 查看 node 版本 --- v14.17.5
2.2 使用 Node.js
- 命令行
REPL 工具: (cmd --> node) 交互式的编程环境:
输入 node 回车就可以进入 node 的命令行环境, 可进行 JavaScript 的运算等
Tips: 可以单独开一个终端, 方便地验证 Node API 和 JavaScript API 是否正确
Node.js npm 指令
npm: Node Package Manager
Node.js 的一个包管理工具.
npm 帮助我们完成第三方模块的发布,安装和依赖等, 借助 npm
,Node.js
与 第三方模块 之间形成了 Node.js
的庞大生态系统。
同 Node.js
一起安装的开发工具,方便 js 安装、上传、下载包管理工具.
Node.js 的 文件系统
Node.js 的文件系统, 简单说就是 通过 Node.js
的内置模块 fs
来操作本地系统中的文件
fs
模块中所有的操作都有两种形式可供选择: 同步
和 异步
这里简单列举一些相关 API
同步文件的写入, 操作的步骤:
- 打开文件
fs.openSync(path,flags [, mode])
- 向文件中写入内容
fs.writeSync(fd,string [ , position [, encoding]])
- 保存并关闭文件
fs.closeSync(fd)
异步文件的写入
- 打开文件
fs.open(path,flags[, mode],callback)
- 用异步写入一个文件
fs.write(fd,string[ ,positon[ , encoding] ],callback)
- 关闭一个文件
fs.close(fd, callback)
简单文件的写入:
fs.writeFile(file,data[,options],callback)
fs.writeFileSync(file,data[, options])