熟悉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请求转发给操作系统,继续执行下一条指令。
单线程:Node.js的单线程是指对JavaScript层面的任务处理是单线程的,而Node.js本身是一个多线程平台。
事件驱动:以事件为中心,Node.js将每一个任务都当成事件来处理
Node.js的运行结构
二、通过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
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请求程序。