node基本概念

54 阅读4分钟

前言

工作多久,就写多久的业务。没有深度,也没有广度。

在内卷已进入白热化的阶段,人口红利的影响下,增加技术深度和广度,才能延长职业寿命和收获更好的薪资待遇。

而第一步,就从node开始。

为什么要学习node?

node是前端架构的基石,npm就诞生于node社区。webpack等打包工具的运行环境也是node。学会node,才更容易理解vue-cli中一些api是如何实现的。

node是什么?

node并不是一门语言,而是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它让js可以脱离浏览器,直接在各种场景下运行。

node的使用场景

node在项目中多作为中间层使用。

Node解决了哪些问题?

Node在处理高并发,I/O密集场景有明显的性能优势

  • node适合i/o密集型:I/O密集指的是文件操作、网络操作、数据库
  • 不适合cpu密集型:CPU密集指的是逻辑处理运算、压缩、解压、加密、解密
  • node作为中间层:nginx开多线程=> node =>转发给java
  • 生态好,webpack gulp都基于node

什么是同步异步和阻塞非阻塞?

  • 同步就是在执行某段代码时,代码没有得到返回之前,其他代码无法执行,当得到了返回值后可以继续执行其他代码。
  • 异步就是在执行某段代码时,代码不会立即得到返回结果,可以继续执行其他代码,返回值通过回调来获取
  • 异步/同步指的是被调用方
  • 阻塞/非阻塞指的是调用方

image.png

上面介绍完了一些概念后,我们直接进入代码阶段。

node基本知识

  1. node中没有window,而是global
  2. node为了实现模块化,在文件执行时,增加了匿名函数,this在这个函数中被更改
  3. 文件中的this不指向global,而是一个空对象{}(即 module.exports)

可以使用console.log(Objects.keys(global))查看global上的属性

image.png

global上的process

process是在node应用执行期间一直存在的一个对象,该对象包含了当前进程执行的相关信息,并且可以通过process对其进行控制。

process上有哪些重要参数?

  • platform:当前是什么环境 win32(微软) drain(苹果)
  • argv:运行时传递的参数
  • env:环境变量
  • cwd:当前的工作目录
  • nexttick

用node执行一个文件:node 文件名 参数1 参数2

argv:node运行时传递的参数

argv有四个参数,前两个是固定的,没有用处

// 利用下面代码可以取到argv传递的参数
let obj = process.argv.slice(2).reduce((memo, b, i, arr) => {
    if (b.includes('--')) {
        memo[b.slice(2)] = arr[i + 1]
    }
    return memo
}, {})

console.log(obj);

// 在命令行用空格间隔,传递的参数就可以用argv接收
node test.js --config null --port 3000
{ config: 'null', port: '3000' } // 得到结果

image.png

上面这个例子我们看起来会非常眼熟,当我们在vue-cli中启动项目时,项目运行的端口等配置项,就是利用这个原理实现的。

env 环境变量

环境变量包含电脑的全局变量,也可以用以下语法设置临时变量。

语法:set NODE_ENV=development

console.log(process.env.NODE_ENV);

// 在命令行输入
set NODE_ENV=development
node test.js
//得到 development

上面这个例子也非常眼熟,在vue项目中经常使用process.env.NODE_ENV来判断当前是开发环境还是生产环境。

cwd:当前的工作目录
  • process.cwd:node的参数,当前node在哪里执行的
  • __dirname:在node环境下,每个文件中自带这个变量,值是当前文件的目录

image.png

通过这个变量可以知道在哪里运行的node服务

nextTick:微任务,只能在node里面用

node的事件环:每一个方法都有一个队列

node文档中对node事件环的详细介绍

image.png

node中的宏任务与微任务
  • 宏任务:setImmediate setTimeout readFile
  • 微任务:promise.then nextTick queueMicrotask

nextTick 并不属于node事件环,而是在本轮事件环执行后执行,在Promise之前执行

image.png

总结

以上就是node中的基本概念了,下一章会介绍node中模块相关的知识。

我是一个在前端已死的时代,不断在内卷中苦苦挣扎的大专生——天铭,希望和大家共同努力,只要我们足够努力,我们的老板就能早日过上自己想要的日子!