Nodejs能做什么和它的优势
Nodejs能做什么和它的优势
Node核心思想: 1.非阻塞; 2.单线程; 3.事件驱动。
在目前的web应用中,客户端和服务器端之间有些交互可以认为是基于事件的,那么AJAX就是页面及时响应的关键。每次发送一个请求时(不管请求的数据多么小),都会在网络里走一个来回。服务器必须针对这个请求作出响应,通常是开辟一个新的进程。那么越多用户访问这个页面,所发起的请求个数就会越来越多,就会出现内存溢出、逻辑交错带来的冲突、网络瘫痪、系统崩溃这些问题。
Node的目标是提供一种构建可伸缩的网络应用的方案,在hello world例子中,服务器可以同时处理很多客户端连接。
Node和操作系统有一种约定,如果创建了新的链接,操作系统就将通知Node,然后进入休眠。如果有人创建了新的链接,那么它(Node)执行一个回调,每一个链接只占用了非常小的(内存)堆栈开销。
举一个简单的异步调用的例子,把test.js和myMydule.js准备好了,^_^。把以下代码拷贝到test.js中并执行: var fs = require(‘fs’); fs.readFile(’./myModule.js’, function (err, data) { if (err) throw err; console.log(‘successfully’); }); console.log(‘async’); 所谓的异步,大家应该都能想得到运行时会先打先显示"async",再显示"successfully"。
Node是无阻塞的,新请求到达服务器时,不需要为这个请求单独作什么事情。Node仅仅是在那里等待请求的发生,有请求就处理请求。
Node更擅长处理体积小的请求以及基于事件的I/O。
Node不仅仅是做一个Web服务的框架,它可以做更多,比如它可以做Socket服务,可以做比方说基于文件的,然后基于像一些比方说可以有子进程,然后内部的,它是一个很完整的事件机制,包括一些异步非注射的解决方案,而不仅仅局限在网络一层。同时它可能,即使作为一个Web服务来说,它也提供了更多可以深入这个服务内核、核心的一些功能,比方说Node使用的Http Agent,这块就是它可以更深入这个服务内核来去做一些功能。
Node.js 能做什么和它的优势
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它允许开发者使用 JavaScript 编写服务器端代码。Node.js 的核心思想包括非阻塞、单线程和事件驱动,这些特性使其非常适合处理高并发场景下的 I/O 密集型任务。
Node.js 能做什么?
-
Web 服务器
- Node.js 可以用来创建高性能的 Web 服务器。例如,使用 Express 框架可以快速搭建 RESTful API。
const express = require('express'); const app = express(); app.get('/', (req, res) => { res.send('Hello World!'); }); app.listen(3000, () => { console.log('Server is running on port 3000'); });
-
实时应用
- Node.js 在实时应用(如聊天应用或实时协作工具)方面表现出色。WebSocket 可以用于实现实时通信。
const WebSocket = require('ws'); const wss = new WebSocket.Server({ port: 8080 }); wss.on('connection', ws => { ws.on('message', message => { console.log('Received:', message); wss.clients.forEach(client => { if (client !== ws && client.readyState === WebSocket.OPEN) { client.send(message); } }); }); });
-
命令行工具
- Node.js 可以用来开发命令行工具,如 npm(Node 包管理器)。
#!/usr/bin/env node console.log('Hello from CLI!');
-
文件系统操作
- 非阻塞 I/O 特性使得 Node.js 在文件系统操作方面表现优异。
const fs = require('fs'); fs.readFile('./myModule.js', (err, data) => { if (err) throw err; console.log('Successfully read file.'); }); console.log('Async operation');
Node.js 的优势
-
非阻塞 I/O
- Node.js 使用事件循环和回调函数处理 I/O 操作,避免了传统多线程模型中的阻塞问题。
const http = require('http'); const server = http.createServer((req, res) => { fs.readFile('./data.txt', (err, data) => { if (err) { res.writeHead(500); res.end('Internal Server Error'); } else { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end(data); } }); }); server.listen(3000, () => { console.log('Server is listening on port 3000'); });
-
单线程
- 单线程模型减少了线程切换的开销,使得 Node.js 更适合处理大量并发连接。
const net = require('net'); const server = net.createServer(socket => { socket.write('Echo server\r\n'); socket.pipe(socket); }); server.listen(1337, () => { console.log('Server is listening on port 1337'); });
-
事件驱动
- 事件驱动机制使得 Node.js 能够高效地处理异步操作。
const EventEmitter = require('events'); class MyEmitter extends EventEmitter {} const myEmitter = new MyEmitter(); myEmitter.on('event', () => { console.log('An event occurred!'); }); myEmitter.emit('event');
通过上述示例代码和解释,可以看出 Node.js 在处理高并发、I/O 密集型任务方面的强大能力,使其成为现代 Web 开发的理想选择。
还应该强调一下单线程模型对游戏开发的好处,不需要操心锁和线程安全的问题,对于一个多人在线的游戏来说锁还是很头疼的问题。
node的劣势也是单线程模型,如果程序有什么bug导致非正常退出就不好了,如果是web应用还可以通过cluster模块来缓解,要游戏应用里面,用户会掉线,也是一把双刃剑啊
关于 Markdown 的标记, 我再罗嗦下 请标记下代码, 不标记的代码太难阅读了
我看到沒有標記代碼的帖都自動略過XD
Node.js 能做什么和它的优势
Node.js 能做什么?
Node.js 是一个基于 Chrome V8 JavaScript 引擎的JavaScript 运行环境。它主要用于开发高性能的网络应用程序,特别是那些需要大量 I/O 操作的应用程序。Node.js 可以做的事情包括:
- Web 服务器:开发高并发的Web服务。
- 命令行工具:编写高效的命令行应用。
- 实时应用:如聊天应用或实时协作工具。
- 微服务:构建轻量级的服务组件。
- 文件系统操作:处理文件读写操作。
- 数据库操作:与多种数据库进行高效交互。
- API 开发:构建 RESTful API 或 GraphQL API。
Node.js 的优势
- 非阻塞 I/O:通过事件循环和回调函数,Node.js 处理 I/O 操作时不会阻塞主线程。
- 单线程:使用单一的主线程,减少了多线程环境下的资源竞争和上下文切换开销。
- 事件驱动:所有操作都基于事件驱动模型,适合处理大量并发连接。
- 性能优秀:V8引擎使得Node.js在处理大量并发连接时表现出色。
- 丰富的库支持:npm(Node Package Manager)提供了大量的模块,方便开发者使用。
示例代码
下面是一个简单的Node.js文件系统操作示例,展示了异步读取文件的过程。
// test.js
const fs = require('fs');
fs.readFile('./myModule.js', function(err, data) {
if (err) throw err;
console.log('successfully');
});
console.log('async');
当运行 node test.js
时,输出将是:
async
successfully
这段代码展示了Node.js的异步特性。首先打印 “async”,然后在文件读取完成后打印 “successfully”。这种方式避免了阻塞主线程,提高了整体性能。
总结
Node.js 通过其非阻塞、事件驱动的架构,非常适合处理 I/O 密集型任务,尤其是在实时和高并发场景中。此外,强大的 npm 生态系统提供了丰富的模块,极大地简化了开发过程。