likes
comments
collection
share

10分钟带你了解Node.js

作者站长头像
站长
· 阅读数 16

如何使用

安装

方式一

官网下载

方式二

node版本管理工具nvm

运行

方式一

执行nodejs文件

// cmd或其他终端下执行
node app.js
方式二

交互式命令行模式(REPL)

// cmd或其他终端下执行node命令,进入交互模式
node 

REPL

输入 node 进入REPL模式

查看模块

查看某模块,如 global

10分钟带你了解Node.js

.editor

在线js编写 注意,Ctrl+D是结束js编写,Ctrl+C是退出编写

.help

查看有哪些命令

10分钟带你了解Node.js

调试

使用Chrome浏览器调试
  1. 终端执行node文 node --inspect-brk index.js
  2. 打开浏览器:chrome://inspect/#devices ,找到对应的文件,点击后即可调试

10分钟带你了解Node.js

VSCode本地调试运行

10分钟带你了解Node.js

参考

《Node.js 调试指南》

模块

代码为什么模块化

  1. 实现模块自己的私有作用域,不污染全局环境
  2. 代码分离,提高复用性和可维护性

CommonJS

Node 选择CommonJS模块化规范

  • 模块引用:require
  • 模块定义:exports
  • 模块标识:module
// sum.js
function sum(a,b){
  return a+b;
}
module.exports = sum;
// index.js
const sum = require('./sum')
console.log(sum(1+1));  // 2
特点
  1. CommonJS加载的是一个对象(module.exports属性),只有脚本运行时该对象才会确定,所以CommonJS是运行时加载。
  2. CommonJS输出的是一个值的拷贝,也就是说模块输出一个值后,模块内部的变化就影响不到该值。
  3. CommonJS模块是同步加载,由于是运行时加载,且从写法可以看出来,没有回调或promise.then方法,所以是同步的。

对比ES6的import语法,ES6是编译时输出,输出的是值的引用,且ES6模块是异步加载,有独立的模块依赖的解析阶段。

模块加载

指路 -> Node.js中模块加载是怎么一回事?

Node.js中的模块重要吗

从 JS 到 V8 再到 操作系统 的这个能力,有很大一部分都是通过 Node.js 的内置模块来提供的,因此,我们学习Node.js,很多时间都是学习它里面的模块

path

  • 不要拼接路径,使用 path.resolve/join 等方法
  • 不同操作系统有不同的路径连接符,涉及到路径的地方尽量使用path模块方法

fs

  • fs提供了同步、回调和基于promise的三种形式。同步api会阻塞线程,但对于某些场景,使用同步方法会更方便
  • 尽量使用promise方式,回调容易造成嵌套地狱
  • 对于大文件,使用文件流的方式来读写文件 createReadStream 和 createWriteStream 来减少内存占用
  • 三方npm包 fs-extra 是fs的一个拓展,提供了很多更方便的api

http

  • http模块既可以作为客户端,也可以作为服务器响应http请求
  • url模块可以用来解析url、生成url以及拼接url
  • URLSearchParams模块用于处理请求参数
  • zlib模块可以用来压缩和解压http响应体数据,可以用在需要gzip的场景
  • http模块post请求body数据是chunked传输方式,需要进行合并

events

事件发布相关模块

child_process

多进程相关 网上参考很多,随便找一篇 →_→

util

  • 提供常用函数集合,弥补JS功能的不足
  • 包括格式化字符串、对象序列号、对象继承等
  • 其中 promisify 将基于回调的函数转化为基于 Promise 的函数

其他

process

  • 是一个全局变量,可以获取进程信息等
  • 实现了emit接口。可以使用on监听事件
process.stdin/stdout  // 标准输入输出流
process.env.PATH  // 查看path
process.env.PATH = 'xxx'   //设置path
process.memoryUsage()   // 获取内存使用情况
process.argv  // 获取命令行参数
process.nextTick(function() { ... })  // 微任务

路径变量

 __dirname  // 当前文件夹路径
 __filename  // 当前文件路径

Buffer

如果没有提供编码格式,文件操作以及很多网络操作就会将数据作为 Buffer 类型返回

指路 -> 10分钟闲聊Node.js中的流

开发工具

  • nodemon:文件变化自动重启服务
  • pm2:生产环境Node应用管理器

常用框架

Express/Koa/Egg

部署

cdk:容器化部署

sdk:虚拟化部署