一、 Node.js的特点
Node.js是一个基于Chrome V8 JavaScript引擎构建的跨平台框架。在Node.js中,我们可以利用JavaScript语言实现类似于C++、Java等语言的各种功能,例如文件输入输出、网络通信、操作系统级别的能力等。以下是Node.js的特点:1. 异步(非阻塞)I/O操作:Node.js采用事件驱动、非阻塞的I/O模型,能够使得高并发、高吞吐量的网络应用得到很好的表现。
fs.readFile('/etc/passwd', (err, data) => {
if (err) throw err;
console.log(data);
});
2. 单线程、高性能:Node.js采用单线程I/O模型来处理所有请求,使得Node.js具有非常高的处理能力和良好的运行效果。
const http =require('http');
const server = http.createServer((req,res) =>
{
res.statusCode = 200;
res.setHeader('Content-Type','text/plain');
res.end('Hello,World!\n');
});
server.listen(port,hostname,() =>{
console.log(`Server running at http://${hostname}:${port}/`);
});
3. 轻量级:Node.js的代码体积非常小,下载安装的速度也很快,让开发者快速、高效地完成应用开发。
二、Node.js环境结构
Node.js环境由三个核心组件构成:模块、事件和Stream。1. 模块:Node.js中的模块是指一段可重用的代码块,我们可以在程序中引用其他的模块,也可以将自己编写的模块暴露成为可引用的模块。
//定义模块module_math.js
function add(a,b){
return a+b;
}
function sub(a,b){
return a-b;
}
module.exports = {
add:add,
sub:sub
}
//main.js中引用模块
const math =require('./module_math.js');
const a = 2;
const b = 1;
console.log("a+b="+math.add(a,b));
console.log("a-b="+math.sub(a,b));
2. 事件:Node.js事件是指程序执行过程中发生的一些重要操作,例如:读取文件完成、连接关闭等。在Node.js中,大部分模块都提供了事件接入点,来监听这些重要操作的发生。
//定义事件
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', function(a, b) {
setImmediate(() => {
console.log('异步执行');
});
});
myEmitter.emit('event', 'a', 'b');
//运行结果
异步执行
3. Stream:Node.js中Stream是指一组有序、有起点、有终点并且可操作的字节数据传输方式。例如,我们可以将大文件切分成小块,然后一块一块地读取、写入,避免因为一次读取太多而导致内存溢出等问题。
//读取文件流
var fs = require('fs');
var readStream= fs.createReadStream('data.txt');
var str = '';
readStream.setEncoding('utf8');
readStream.on('data', function(chunk) {
console.log('chunk:',chunk);
str += chunk;
});
readStream.on('end', function() {
console.log('end:',str);
});
//写入文件流
var fs = require('fs');
var ws = fs.createWriteStream('output.txt');
ws.write('line 1\n');
ws.write('line 2\n');
ws.end('end');//要加上end,否则文件不完整
三、Node.js的功能
Node.js提供了以下丰富的功能:1. HTTP服务:Node.js可以很方便地搭建一个实现HTTP协议的服务器端。
const http = require('http');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
2. 构建命令行工具:程序员在日常操作过程中,经常需要使用命令行工具完成一些简单的任务。 Node.js可以很方便地搭建一些命令行工具,以简化这些操作。
#!/usr/bin/env node
'use strict';
const [,, ...args] = process.argv;
console.log(`Hello, ${args.join(' ')}!`);
3. 用于开发大型Web应用:Node.js最适合开发大型Web应用,也可以以组件的形式使用Express、Koa、Hapi等Web框架,提供模板、路由控制、请求响应等功能。
const express = require('express')
const app = express()
app.get('/', function (req, res) {
res.send('Hello World')
})
app.listen(3000)
四、Node.js的应用场景
1. 在处理高并发、大型数据时:由于Node.js具有异步I/O模型和高性能,因此在处理高并发和大数据量时,Node.js表现出色。
2. 在实时通讯场景下:使用Node.js可以轻松地实现即时聊天、实时数据传输等需要实时通讯的Web应用。
3. 在IO密集型应用中:由于Node.js采用了异步I/O模型,并且具有高效的事件处理机制和Stream特性,因此适合处理大量的IO密集型任务,例如文件上传、文件下载、网页爬取等。
4. 构建命令行工具:由于Node.js执行速度快,语法简单,因此适合用来实现命令行工具。
5. Web服务中间件库:Node.js可以作为Web服务的中间件来处理各种任务,例如日志处理、文件上传、cookie和session处理、安全性保障、数据路由和缓存等。