Node.js到底是什么

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型。

是框架?❌ 库?❌ 语言?❌

⚠️统统不是⚠️
Nodejs -> JavaScript运行平台/运行时(platform / Runtime)

什么是运行平台/运行时

what_node_1

定义:运行平台一般就是指一个代码的运行环境
作用:开发者可以使用指定的编程语言,基于某个环境开发特定的应用

🏷️ 平台就是为编程语言「赋能」,基于某个环境开发特定的应用

what_node_2
what_node_3
what_node_4

Node.js可以做什么

平台的作用就是提供「舞台」
- 理论上平台没有绝对只能干什么的限制

平台提供的能力 约等于 提供的底层APIs
- 能不能实现,就看有没有相应的API

what_node_5

🌟 Node.js「无所不能」,既然「无所不能」,为何没有「无处不在」❓

人员角度:
- Node.js平台采用的语言是JavaScript,适合前端开发者使用

技术角度:
- Node.js平台的特点是非阻塞IO,适合处理高并发请求

结论:

  1. Node.js适合开发服务器端的中间层(BFF)
    what_node_6
  2. Node.js适合用于开发前端方向的各种工具
    webpack、Gulp、vite、BABEL、TS 等

Node.js全局对象

  • global

  • __filename

      __filename 表示当前正在执行的脚本的文件名
    
  • __dirname

      __dirname 表示当前执行脚本所在的目录
    
  • setTimeout(cb, ms)

  • clearTimeout(t)

  • setInterval(cb, ms)

  • console

  • process

      exit: 当进程准备退出时触发。
      beforeExit: 当 node 清空事件循环,并且没有其他安排时触发这个事件。通常来说,当没有进程安排时 node 退出,但是 'beforeExit' 的监听器可以异步调用,这样 node 就会继续执行。
      uncaughtException:当一个异常冒泡回到事件循环,触发这个事件。如果给异常添加了监视器,默认的操作(打印堆栈跟踪信息并退出)就不会发生。
      Signal 事件:当进程接收到信号时就触发。信号列表详见标准的 POSIX 信号名,如 SIGINT、SIGUSR1 等。
      stdout:标准输出流。
      stderr:标准错误流。
      stdin:标准输入流。
      argv:argv 属性返回一个数组,由命令行执行脚本时的各个参数组成。它的第一个成员总是node,第二个成员是脚本文件名,其余成员是脚本文件的参数。
      env:返回一个对象,成员为当前 shell 的环境变量
      pid:当前进程的进程号。
      title:进程名,默认值为"node",可以自定义该值。
      arch:当前 CPU 的架构:'arm'、'ia32' 或者 'x64'。
      platform:运行程序所在的平台系统 'darwin', 'freebsd', 'linux', 'sunos' 或 'win32'
      mainModule:require.main 的备选方法。不同点,如果主模块在运行时改变,require.main可能会继续返回老的模块。可以认为,这两者引用了同一个模块。
      abort():这将导致 node 触发 abort 事件。会让 node 退出并生成一个核心文件。
      cwd():返回当前进程的 工作 目录
      exit([code]):使用指定的 code 结束进程。如果忽略,将会使用 code 0。
      memoryUsage():返回一个对象,描述了 Node 进程所用的内存状况,单位为字节。
      nextTick(callback):一旦当前事件循环结束,调用回调函数。
    

为何一定要掌握Node.js?

理由一:现代化的Web开发离不开
- 定制打包、构建等自动化任务需求
- 高体验的开发服务器需求

理由二:高性能Web服务的中间层
- 非阻塞IO、事件循环,处理高并发,天生高手
- 前端人也能轻易玩转的服务端技术,更适合中间层

小案例:批量修改文件名字

    1. mkdir renames
      index.js
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      #!/usr/bin/env node  // 不能缺少
      const fs = require('fs')
      const path = require('path')

      fs.readdir(process.cwd(),(err,files)=>{
      console.log(files,'files')
      files.forEach(item => {
      fs.rename(
      path.join(process.cwd(),item),
      path.join(process.cwd(),'prefix_'+item),
      err=>{
      if(err) throw err
      console.log(`${item}-->prefix_${item}`)
      }
      )

      });
      })
      package.json
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      {
      "name": "renames",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "bin": "index.js", // 脚本
      "scripts": {
      "test": "echo \"Error: no test specified\" && exit 1"
      },
      "keywords": [],
      "author": "",
      "license": "ISC"
      }
    1. npm link 软连接
    1. 测试
      node_tool

Node.js可以满足前端开发中那些「奇怪」的想法

- 自动化创建项目
- 自动化构建
- 自动化测试
- 自动化部署
- 跨平台转译

Node.js开发Cli工具

    1. mkdir myvuecli
      npm init –y
      tsc –init
      node_cli
      package.json
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      {
      "name": "myvuecli",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "bin": "cli.js",
      "scripts": {
      "build": "tsc"
      },
      "keywords": [],
      "author": "",
      "license": "ISC",
      "dependencies": {
      "ejs": "^3.1.7",
      "inquirer": "^8.2.4"
      }
      }
      cli.ts
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      #!/usr/bin/env node
      const inquirer = require('inquirer')
      const path = require('path')
      const fs = require('fs')
      const ejs = require('ejs')

      inquirer.prompt([
      {
      type:'input',
      name:'name',
      message:'Project name::'
      }
      ]).then((answers:object)=>{
      const tempDir = path.join(__dirname,'templates')
      const destDir = process.cwd()

      fs.readdir(tempDir,(err:object,files:Array<string>)=>{
      if(err) throw err
      files.forEach((file:string)=>{
      console.log(file)
      ejs.renderFile(path.join(tempDir,file),answers,(err:object,result:string)=>{
      if(err) throw err
      fs.writeFileSync(path.join(destDir,file),result)
      })
      })
      })
      console.log(answers,'answers answers',destDir)
      })
    1. npm run build
    1. npm link
    1. mkdir testvuecli
    1. cd testvuecli -> myvuecli
      node_test