这是我参与 「第五届青训营」 伴学笔记创作活动的第 4 天
1. Node.js应用场景
实现的效果,达成的目的,为什么使用node.js(why)
1)前端工程化
2)Web服务端应用
3)Electron跨端桌面应用(e.g VSCode以及大型公司内的效率工具)
Node.js在字节的应用场景
1)BFF应用、SSR应用,举例:Modern.js
2)服务端应用,举例:头条搜索,西瓜视频,懂车帝
3)Electron应用:飞连,飞书
4)每年新增1000+ Node.js应用
2. Node.js运行时结构
了解node.js本身的特点,判断node.js在特定场景的适用性和优缺点(what)
V8:JavaScript Runtime,诊断调试工具(inspector)
libuv: eventloop(事件循环),syscall(系统调试)
特点:
1)异步I/O,它会在I/O操作响应后恢复操作,而不是阻塞线程并占用额外内存等待
2)单线程(但是目前worker_thread可以起单独线程,但每个线程的模型没有太大变化),
JS是单线程的,但是Node.js其实包含了JS线程、uv线程池(由libuv提供,读取文件或者对CPU底层消耗比较大的应用)、V8任务线程、V8 Inspector线程(调试工具)等多个线程,单线程不存在锁的机制,开发更简单,同时还能更高效地利用系统资源
3)跨平台,Node.js跨平台 + JS无需编译环境(+Web跨平台+诊断工具跨平台) = 开发成本低
3. 编写Http Server
怎样使用node.js(how)
Hello World最简单的http server
通过node http_server运行文件,在浏览器通过localhost:3000进行访问,页面会出现hello字样
处理JSON数据的http server
同样也可以使用async + promise对响应请求的逻辑进行改造,这样就可以更清晰地将代码分为客户端发送的请求以及响应两部分
使用POST方法发送http请求的client_server.js
其中的回调函数及JSON数据的处理与http_server_json一样也使用了Buffer.concat
编写Http Server - 静态文件
React SSR
SSR(server side rendering)服务端代码的特点:
1)相比传统HTML模板引擎:避免重复编写代码
2)相比SPA(single page application)单页面应用:首屏渲染更快,SEO友好
3)qps较低,前端代码编写时需要考虑服务端渲染情况
对于模板字符串返回的页面代码,实际上还需要进行一些其他的操作,例如启动React应用
SSR的难点:
1)因为是服务端应用,所以可能还需要处理打包代码的问题,例如在编写React前端应用中,通过打包工具进行了一些处理,例如通过commonjs的require语句引入的css文件,webpack动态地将这些文件加载进来,但是在服务端这些处理时无意义的,所以在设置打包工具时,需要绕过这些文件
2)需要思考前端代码在服务端运行时的逻辑,代码的运行是否符合预期,比如拉数据,根据服务端返回的数据去做渲染,应该放在componentDidMount生命周期去执行
3)移除对服务器无意义的副作用,或重置环境
Debug
1)V8 Inspector:
使用方法: node --inspect
2)场景:
查看console.log内容;breakpoint;高CPU、死循环:cpuprofile;高内存占用:heapsnapshot;性能分析