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
posted @ 2018-12-05 21:57  cicarius  阅读(210)  评论(0编辑  收藏  举报