一、Node背景
1、技术栈:
http、js、es6、命令行
2、定义:
Node不是一门语言, 是用js编写的一种基于v8引擎的事件驱动、非I/O阻塞的技术
3、工作原理:
一个CPU只开一个进程, 一个进程中只有一个线程(event loop);
(单线程只针对主进程, CPU有几个核, 就启几个进程)
4、高性能前提:
Web场景下、 I/O操作密集
5、使用场景:
1)、Web Server
2)、 本地代码构建
3)、 使用工具开发 (爬虫)
6、引申概念:
1、进程: 进行中的程序 (计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位);
2、线程: 进程内相对独立的、可调度的执行单元, 与同属一个进程的线程共享资源;
3、阻塞I/O: (input/output) 性能慢: 逐条顺序执行, 待底层操作完成并返回后进行下一步;
4、非阻塞: 不等待, 立即返回
5、操作分类:
- 1). CPU: 压缩、解压、加密、解密;
- 2). GPU: 图形计算;
- 3). I/O: 文件操作、数据库、网络操作;
二、环境
( 可通过npm root -g
查看根路径安装位置 )
1、commonJS规范:
1)、 每个文件都是一个模块,有自己的作用域;
2)、 在模块内部module变量代表模块本身;
3)、module.exports属性代表模块对外的接口
2、require规则:
1)、 /表示绝对路径, ./代表相对路径;
2)、 支持 js /json /node, 如果不写, 会默认依次尝试;
3)、 不写后缀则认为是build-in模块或各级node-modules内的第三方模块
(如内置模块: fs, 第三方模块: chalk)
3、require特性:
1)、 加载模块时所有语句都会被执行, 加载后会缓存内容;
2)、 一旦出现某个模块被循环加载,就只输出已执行部分,未执行部分不会被加载(要避免);
4、exports和module.exports区别:
见于( function( exports, require, module, __filename, __dirname ){ ... } )
中,
exports可以看作是module.exports的快捷方式引入, 相当于:
const exports = module.exports;
exports可以给其添加属性, 但应注意不能修改其指向 !
5、golbal:
默认常用方法: CommonJS、Buffer、process、console、timer
const { argv, argv0, execArgv、execPath} = process;
const {env} = process;
timer中有一个新增方法: setImmediate, 其与时间无关, 只有一个参数, 与nextTick 方法很像, 执行顺序: nextTick > setTimeout > setImmediate
- nextTick: 插入队尾, 其中可嵌套使用, 会导致无法执行下一步;
- setImmediate: node优化版本中提供, 会插入下一个队列首部, 更推荐使用;
三、调试
1、vscode: (需一些额外的配置)
2、Inspector:
- 运行:
node --inspect xx.js
, 为方便调试, 参数可用--inspect-brk
会在入口停下来; - 打开浏览器 chrome://inspect 中Remote Target会新增target, 点击
inspect
即可;