10分钟带你了解Node.js
如何使用
安装
方式一
官网下载
方式二
node版本管理工具nvm
运行
方式一
执行nodejs文件
// cmd或其他终端下执行
node app.js
方式二
交互式命令行模式(REPL)
// cmd或其他终端下执行node命令,进入交互模式
node
REPL
输入 node
进入REPL模式
查看模块
查看某模块,如 global
.editor
在线js编写 注意,Ctrl+D是结束js编写,Ctrl+C是退出编写
.help
查看有哪些命令
调试
使用Chrome浏览器调试
- 终端执行node文
node --inspect-brk index.js
- 打开浏览器:chrome://inspect/#devices ,找到对应的文件,点击后即可调试
VSCode本地调试运行
参考
模块
代码为什么模块化
- 实现模块自己的私有作用域,不污染全局环境
- 代码分离,提高复用性和可维护性
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
特点
- CommonJS加载的是一个对象(
module.exports
属性),只有脚本运行时该对象才会确定,所以CommonJS是运行时加载。 - CommonJS输出的是一个值的拷贝,也就是说模块输出一个值后,模块内部的变化就影响不到该值。
- 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:虚拟化部署
转载自:https://juejin.cn/post/7236304633562972219