NodeJS基础入门
NodeJS简介
Node.js uses an event-driven,non-blocking I/O model
非阻塞I/O
- 阻塞:I/O时进程休眠等待I/O完成后进行下一步
- 非阻塞:I/O时函数立即返回,进程不等待I/O完成
事件驱动
- I/O等异步操作结束后通知
- 观察者模式
CPU密集:压缩、解压、加密、解密
I/O密集:文件操作、网络操作、数据库
web常见场景:静态资源读取,数据库操作,渲染页面
NodeJS常用场景:
- Web Server
- 本地代码构建
- 实用小工具的开发
环境
- CommonJS规范
- 每个文件是一个模块,有自己的作用域
- 在模块内部module变量代表模块本身
- module.exports属性代表模块对外接口
- global 全局对象
- process
require规则
- /表示绝对路径,./表示相对路径
- 支持js、json、node拓展名,不写依次尝试
- 不写路径则认为是build-in模块或者各级node_modules内的第三方模块
通过require调用module举例:
下面是调用的module:2_cusmod.js
console.log('This is a module')
const testVar = 100
function test() {
console.log(testVar);
}
module.exports.testVar = testVar;
module.exports.testFn = test;
编写require代码:3_require.js
const mod = require('./2_cusmod');
console.log(mod.testVar);
mod.testFn();
运行:node 3_require.js
This is a module
100
100
2_cusmod.js中第一行不应显示的页结果显示了,是什么原因呢?
require特性
- module被加载的时候执行,加载后缓存,不会重复执行
- 一旦出现某个模块被循环加载,就只输出已经执行的部分,还未执行的部分不会输出
文件modA.js
module.exports.test = 'A';
const modB = require('./modB');
console.log('在modA中调用modB显示结果:',modB.test);
module.exports.test = 'AA';
文件modB.js
module.exports.test = 'B';
const modA = require('./modA');
console.log('在modB中调用modA显示结果:',modA.test)
module.exports.test = 'BB';
文件主函数main.js
const modA = require('./modA');
const modB = require('./modB'); #不会被重复require
console.log(modA.test);
console.log(modB.test);
执行:node main.js输出结果:
在modB中调用modA显示结果: A
在modA中调用modB显示结果: BB
AA
BB
引用系统内置模块
加载文件系统模块:
const fs = require('fs');
const result = fs.readFile('readme.txt',(err,data) => {
if (err) {
console.log(err);
}
else {
console.log(data.toString()); //异步加载数据
}
});
console.log(result);
undefined
This is a readme file
未找到则显示:
undefined
引用第三方模块
先安装模块:
npm install chalk
编辑代码 chalk.js
const chalk = require('chalk');
console.log(chalk.red('This is red font!'))
结果如下:
This is red font!
当期所有依赖当前项目的node_modules下,查看全局依赖npm root -g
/usr/local/lib/node_modules
exports:
exports 是module.exports的快捷方式,但不能修改exports的指向
新建exports.js
// const exports = module.exports
// (
// function(exports, require, module, __filename, __firname) {
// // code
// }
// )
支持两中写法:
1.exports.test = 100;
2.```js
module.exports = {
'name': 'john',
'age': '19',
'like': 'sports'
}
新建main.js
```js
const mod = require('./exports');
console.log(mod.test);
console.log(mod.name);
console.log(mod.like);
第一种方法运行结果:node main.js
100
第二种方法运行结果:node main.js
john
sports
global可以直接使用
- CommonJS
- Buffer、Process、console
- timer
新建global.js:
const testVar = 1000;
global.testVar2 = 200;
module.exports.testVar = testVar;
新建main.js
const mod = require('./global')
console.log(testVar2)
console.log(mod.testVar)
打印输出结果:
200
1000
process 进程
const {argv,argv0,execArgc,execPath} = process;
execPath 执行路径
argv.forEach(item => {
console.log(item);
});
输入 node argv.js --test a=1 b=2
/usr/bin/node
/home/dex/web/nodejs/argv.js
--test
a=1
b=2
创建argc.js:
console.log(execArgv)
输入node --inspect argv.js
[ '--inspect' ]
process的环境
const {env} = process;
console.log(env);
LC_MEASUREMENT: 'zh_CN.UTF-8',
LESSCLOSE: '/usr/bin/lesspipe %s %s',
LC_PAPER: 'zh_CN.UTF-8',
LC_MONETARY: 'zh_CN.UTF-8',
HOME: '/home/dex',
PATH: '/home/dex/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin',
- process.cwd() 当前执行路径
setImmediate()与process.nextTick()的区别:都是在下次执行时等待一段时间
- process.nextTick()执行在setImmediate()之前
- process.nextTick()放在当前时间队列之后,setImmediate()放在下一个时间队列开头
setImmediate(() => {
console.log('setImmediate');
});
setTimeout(() => {
console.log('timeout')
},0);
process.nextTick(() => {
console.log('nextTick')
});
输出结果:
nextTick
timeout
setImmediate
如果process.nextTick()长时间的调用,就会导致setImmediate异步操作无法执行了:
setImmediate(() => {
console.log('setImmediate');
});
setTimeout(() => {
console.log('timeout')
},0);
process.nextTick(() => {
console.log('nextTick')
process.nextTick(() => {
console.log('nextTick')
});
process.nextTick(() => {
console.log('nextTick')
});
process.nextTick(() => {
console.log('nextTick')
});
});
运行node timer.js
nextTick
nextTick
nextTick
nextTick
timeout
setImmediate
调试
- Inspector
node --inspect-brk debug.js
- VS Code