熟悉Node.js与开发实战

248 阅读3分钟

熟悉Node.js | 青训营笔记

这是我参与[第四届青训营]笔记创作活动的第8天

首先要提到的是前端工程化的场景,早期ajax、jquery比较流行的时候,我们直接在页面中引入需要的lib即可,后续随着模块化、transpile逐渐成熟,需求逐渐增多,对后端能力的需求也逐渐强烈。反过来说,也正是Node.js赋予了js开发者在浏览器外运行代码的能力,加速催生了这些项目的出现。第二个常见场景是使用Node.js开发web服务端应用。

一、什么是Node.js?

Node.js发布于2009年5月,由Ryan Dahl开发,是一个基于ChromeV8引擎的JavaScript运行环境,使用了一个事件驱动、非阻塞式I/O模型,让JavaScript 运行在服务端的开发平台,它让JavaScript成为与PHP、Python、Perl、Ruby等服务端语言平起平坐的脚本语言。
Node.js对一些特殊用例进行优化,提供替代的API,使得V8在非浏览器环境下运行得更好,V8引擎执行Javascript的速度非常快,性能非常好,基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js基于Express框架,可以快速构建Web应用;基于Electron框架,可以快速构建跨平台的桌面应用;基于restify框架,可以快速构建API接口项目等等。

1.1 Node.js的运行环境

Node作为一个新兴的前端框架,后台语言,有很多吸引人的地方:RESTful API,单线程。 Node可以在不新增额外线程的情况下,依然可以对任务进行并发处理——Node.js是单线程的。它通过事件循环(event loop)来实现并发操作,对此,我们应该要充分利用这一点——尽可能的避免阻塞操作,取而代之,多使用非阻塞操作。
Node.js运行时的特点: 非阻塞IO:是指当线程遇到I/O操作时,不会以阻塞方式等待I/O操作完成或数据返回,而只是将I/O请求转发给操作系统,继续执行下一条指令。
微信图片_20220831214312.jpg
单线程:Node.js的单线程是指对JavaScript层面的任务处理是单线程的,而Node.js本身是一个多线程平台。
事件驱动以事件为中心,Node.js将每一个任务都当成事件来处理
Node.js的运行结构 微信图片_20220831212336.jpg

二、通过Node.js编写Http Server

2.1 安装Node.js
首先在nodejs的网站上根据操作系统下载相关的安装包,对于Ubuntu(linux)下的安装,可以如下进行:sudo apt-get update/sudo apt-get install node或者:sudo apt update/sudo apt install node
Windows下安装Node:官网现已提供安装包(最新的长期支持版本: 10.16.0)、编译器和相应的API 文档(English)
2.2 编写server.js\

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}`)
})

接着在终端运行node server.js,然后打开浏览器,输入“http://localhost:3000” 就会出现hello
微信图片_20220831220445.jpg
2.3 编写JSON

const http = require('http')
const port = 3000
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){

        }
        res.setHeader('Content-Type','application/json')
        res.end(JSON.stringify({
            echo:reqData.msg || 'Hello',
        }))
    })
})

在浏览器界面会出现{“echo”:“hello”}
2.4 编写Client

const http = require('http')

const body = JSON.stringify({msg:'hello from my client'})
const req = http.request('http://127.0.0.1:3000',{
    method:'POST',
    headers:{
        'Content-Type':'application/json',
        'Content-Length':body.length,
    },
},(res) => {
    const bufs = []
    res.on('data',data =>{
        bufs.push(data)
    })
    res.on('end',()=>{
        const receive = JSON.parse(Buffer.concat(bufs).toString())
        console.log('receive',receive);
    })
})
req.end(body)

运行node之后,输入端口号,在浏览器中会出现‘hello’。

三、总结

通过学习Node.js,知道了它的特点是单线程、非阻塞IO、事件驱动等,会写最简单的http请求程序。