Node.js与前端开发实战(二) | 青训营笔记

51 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天

Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它可以让JavaScript运行在服务端。它使用了一个事件驱动、非阻塞式I/O模型,使得它能够处理大量的并发连接。

编写HTTP Server

学习目标

  • 安装Node.js
  • 编写Http Server + Client,收发GET、POST请求
  • 编写静态文件服务器
  • 编写React SSR服务
  • 适用inspector进行调试、诊断
  • 部署简介

安装Node.js

  • Mac, Linux 推荐使用nvm,多版本管理
  • Windows 推荐nvm4w或是官方安装包
  • 安装慢,安装失败的情况,设置安装源

编写HTTP Server

Hello World

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

JSON

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',
	})
})

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)

React SSR

SSR有什么特点

  • 相比传统HTML模版引擎:避免重复编写代码
  • 相比SPA (single page application):首屏渲染更快,SEO友好
  • 缺点:通常qps 较低,前端代码编写时需要考虑服务端渲染情况

部署

  • 部署要解决的问题
    • 守护进程:当进程退出时,重新拉起
    • 多进程:cluster便捷地利用多进程
    • 记录进程状态,用于诊断
  • 容器环境
    • 通常有健康检查的手段,只需考虑多核cpu利用率即可

延伸话题

Node.js贡献代码

  • 快速了解 Node.js代码
  • 好处:
    • 从使用者的角色逐步理解底层细节,可以解决更复杂的问题
    • 自我证明,有助于职业发展
    • 解决社区问题,促进社区发展
  • 难点:
    • 花时间

编译Node.js

  • 为什么要学习编译Node.js
    • 认知:黑盒到白盒,发生问题时能有迹可循
    • 贡献代码的第一步
  • 如何编译
    • 参考:Maintaining the build files
    • ./configure && make install
    • 演示:给net模块添加自定义属性