Node.js简单入门

85 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的的第5天

Node.js简介

Node.js 就是运行在服务端的 JavaScript。

Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台。

Node.js 是一个事件驱动 I/O 服务端 JavaScript 环境,基于 Google 的 V8 引擎,V8 引擎执行 Javascript 的速度非常快,性能非常好。

Node.js优点

  1. 学习曲线平缓,开发效率较高
  2. 运行效率接近常见的编译语言
  3. 社区生态丰富及工具链成熟(npm, v8 inspector)
  4. 与前端结合的场景会有优势(SSR)
  5. 现状:竞争激烈,Node.js有自己独特的优势

Node.js特点

异步I/O

参见下面代码:先正常执行第二个log语句,当时间超时后,才会回调箭头函数,执行第一个log语句。

setTimeout(() => {
  console.log('B')
})
console.log('A')

单线程

Node.js的JavaScript是单线程的。由于单线程的特性,Node.js不适合做CPU密集的操作。

Node.js 12 引入了worker_thread的概念。worker_thread可以起独立线程,但每个线程的模型没有太大变化。

function fibonacci (num: number): number {
  if (num === 1 || num === 2) {
    return 1
  }
  return fibonacci(num - 1) + fibonacci(num - 2)
}
fibonacci(42)
fibonacci(43)

跨平台

下面的代码若在Linux上运行,则调用UNIX Domain SOCKET;若在Windows上运行,则调用其他的socket。跨平台的特性屏蔽了一些底层实现的细节。

const net = require('net')
const socket = new net.Socket('/tmp/scoket.sock'

HTTP Server简单demo

第一版

const http = require('http')
const port = 3000
const server = http.createServer((req, res) => {
  res.end('hello')
})
server.listen(port, () => {
  console.log(`server listens on: ${port}`)
})
const server = http.createServer((req, res) => {
  const bufs = []
  req.on('data', data => {
    bufs.push(data)
  })
  req.on('end', () => {
    let reqData = {}
    try {
      reqData = JSON.parse(Buffer.concat(bufs).toString())
    }
    catch (err) {
      // receive invalid json data
    }
    res.setHeader('Content-Type', 'application/json')
    res.end(JSON.stringify({
      echo: reqData.msg || "Hello",
    }))
  })
})

效果图如下:

image.png

image.png

改进

用Promise + async await重写这两个例子

技巧:将callback转换成promise

function wait (t) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve()
    }, t)
  })
}
wait(1000).then(() => { console.log('get called') })

部署问题

部署要解决的问题

  • 守护进程:当进程退出时,重新拉起
  • 多进程:cluster便捷地利用多进程
  • 记录进程状态,用于诊断

容器环境

  • 通常有健康检查的手段,只需考虑多核cpu利用率即可