这是我参与「第五届青训营 」伴学笔记创作活动的第7天
1. 介绍 Node.js 的应用场景
前端工程化
首先要提到的是前端工程化的场景,早期ajax, juery 比较流行的时候,我们直接赶面中引人需要的lib即可,后来随着模块化、transpile还渐成熟、需求逐渐增多,对后端能力的需求也逐渐强烈。反过来说,也正是Node.js赋予了js开发者在浏览器外运行代码的能力,加速催生了这些项目的出现。
现状:难以替代
Web服务端应用
第二个常见的场景是使用Node.js开发Web服务端应用,也就是后端服务。这里我们特别提一下vercel这家公司。
- 学习曲线平缓,开发效率较高
- 运行效率接近常见的编译语言
- 社区生态丰富及工具链成熟(npm, V8 inspector)
- 与前端结合的场景会有优势(SSR)
- 现状竞争激烈,Node.js有自己独特的优势
Electron跨端桌面应用
最后要再说下Electron应用,这里不只是指electron,还包括nw.js..;这个场景在较大的企业里面非常常见。
- 商业应用: vscode, slack, discord, zoom
- 大型公司内的效率工具
- 现状:大部分场景在选型时,都值得考虑
2. 介绍 Node.js 运行时结构
特点:
异步I/O、单线程、跨平台
异步I/O
当Node.js执行I/O操作时,会在响应返回后恢复操作,而不是阻塞线程并占用额外内存等待.
单线程
JS单线程实际:JS线程+uv线程池+V8任务线程池+ V8 Inspector线程,
他的优点:不用考虑多线程状态同步问题,也就不需要锁;同时还能比较高效地利用系统资源;
但是缺点:阻塞会产生更多负面影响。
解决办法:多进程或多线程
跨平台
- 跨平台(大部分功能、api)
- Node.js跨平台+JS 无需编译环境(+ Web跨平台+诊断工具跨平台)
- 开发成本低(大部分场景无需担心跨平台问题),整体学习成本低
3.编写HTTP server
HTTPclient
HTTP Server
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}`)
})
复制代码
HTTP 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)
复制代码
静态资源
静态资源
const http =require(http)
const fs = require('fs')
const path = require('path')
const url = require('url")
const port = 3000
const server = http.createserver(( req, res) => {
const info = url.parse( req.url)
const file = fs.createReadStream(path.resolve(__dirname,'.' + info.pathname))
file.pipe(res)
})
server.listen(port,()=> {
console.log( 'server listens on: ${port} `)
})
复制代码