这是我参与「第四届青训营 」笔记创作活动的第5天
Node.js
初始Node.js
js可以在浏览器中执行
js可以操作DOM和BOM
浏览器中的JS运行环境
Node.js是一个基于Chrome V8 引擎的 JavaScript运行环境
-
Node.js中的JS的运行环境
-
浏览器是JS的前端运行环境
-
Node.js是JS的后端运行环境
-
Node.js中无法调用DOM和BOM等浏览器内置AO
Node.js的应用场景
- 前端工程化
- Bundle: webpack, vite, esbuild, parcel
- Uglify: uglifyjs
- Transpile: bablejs,typescript
- 其他语言加入竞争:esbuild, parcel, prisma
- 现状:难以替代
- Web服务端应用
- 学习曲线平缓,开发效率较高
- 运行效率接近常见的编译语言
- 社区生态丰富及工具链成熟(npm, V8 inspector)
- 与前端结合的场景会有优势(SSR)
- 现状:竞争激烈,Node.js有自己独特的优势
- Electron 跨端桌面应用
- 商业应用:vscode, slack, discord, zoom
- 大型公司内的效率工具
- 现状:大部分场景在选型时,都值得考虑
Node.js的用途
- 基于Express框架,可以快速构建Web应用
- 基于Electron框架,可以构建跨平台的桌面应用
- 基于restify框架,可以快速构建API接口项目
- 读写和操作数据库,创建使用的命令行工具辅助前端开发,etc
Node.js运行时结构
- V8: JavaScript Runtime,诊断调试工具(inspector)
- libuv: eventloop (事件循环),syscall(系统调用)
- 举例:用node-fetch 发起请求时…
特点
- 异步I/O
- 当Node.js 执行I/O操作时,会在响应返回后恢复操作,而不是阻塞线程并占用额外内存等待
- 单线程
- JS单线程 实际:JS线程+uv线程池 +V8任务线程池 +V8 Inspector线程
- 优点:不用考虑多线程状态同步问题,也就不需要锁;同时还能比较高效地利用系统资源;
- 缺点:阻塞会产生更多负面影响·解决办法:多进程或多线程
- 跨平台
- 跨平台(大部分功能、api)
- Node.js 跨平台+JS无需编译环境(+ Web跨平台+诊断工具跨平台)
- 开发成本低(大部分场景无需担心跨平台问题),整体学习成本低
HTTP模块
在网络节点中,负责消费资源的电脑----客户端
负责对外提供网络资源的---服务器
http模块是node.js提供,用来创建web服务器的模块,通过http模块提供的http.createServer()方法,创建一台web服务器
通过IIS,Apache等Web服务器软件,可以使电脑变成服务器
在Node.js中通过http模块,手写服务器软件
创建
const http = require('http');
const server = http.createServer();
server.on('request',function (req,res) {
console.log('Someone visit web server');
})
server.listen(88,function () {
console.log('server running at http://127.0.0.1:88')
})
req
const http = require('http');
const server = http.createServer();
server.on('request',(req,res) => {
//req.url是客户端请求的url地址
const url = req.url;
const method = req.method;
const str = `Your request url is ${url},and request method is ${method}`
console.log(str);
res.end(str);
})
server.listen(88,() => {
console.log('server running at http:127.0.0.1:88')
})
url
const http = require('http');
const fs = require('fs');
const server = http.createServer();
server.on('request',(req, res) => {
const url = req.url;
let default1 = '404 not found!'
if(url === '/' || url === '/index.html'){
default1 = '<h1>首页</h1>'
}else if(url === '/about.html'){
default1 = '<h1>关于页面</h1>'
}
res.setHeader('Content-Type','text/html;charset=utf-8')
res.end(default1)
})
server.listen(88,() => {
console.log('server running at https://127.0.0.1:88');
})
总结
本文主要简述了nodejs的基本概念及应用场景和用途,同时简单的介绍了node中的http模块,并附上代码