学习Node.js的9大理由以及日常开发中的14个高级特性和代码示例分享

目录

为什么要学Nodejs

1. 高级事件处理:事件驱动机制

2. 非阻塞I/O

3. 异步编程

4. 模块系统

5. 流式数据处理

6. 跨平台支持

7. 高性能网络编程

8. 调试工具

9. 第三方模块

10. 升级 V8 引擎至 10.7

11. 函数式编程

12. 高级路由

13. 试验 Node watch 模式

14. 高级中间件


 Node.js系列文章推荐阅读:

注意:后续技术分享,第一时间更新,以及更多更及时的技术资讯和学习技术资料,将在公众号CTO Plus发布,请关注公众号:CTO Plus

Node.js是一个非常流行的JavaScript运行时,可以用于构建高效、可扩展的网络应用程序。在Node.js日常开发中,有许多高级特性可以帮助开发人员更好地处理数据和逻辑。本文将介绍一些Node.js日常开发中的高级特性,希望能够帮助读者更好地了解Node.js的强大功能,后面再将详细介绍这些高级特性的详细使用方法、应用场景和原理。

大前端专栏:https://blog.csdn.net/zhouruifu2015/category_5734911

为什么要学Nodejs

首先我们将介绍下为什么要学习Node.js

以下是学习Node.js的一些理由:

1. 前端开发的必备技能:Node.js是一种基于JavaScript的后端编程语言,前端开发人员可以利用他们已经掌握的JavaScript技能来学习Node.js,从而扩展他们的技能树并成为全栈开发人员。

2. 高效的I/O操作:Node.js是一个事件驱动的非阻塞I/O平台,它可以高效地处理大量并发连接,使得它成为构建高性能网络应用程序的理想选择。

3. 丰富的生态系统:Node.js拥有一个庞大的社区和生态系统,有数以千计的开源模块和工具可供使用,可以大大提高开发效率。

4. 跨平台支持:Node.js可以在多个操作系统上运行,包括Windows、macOS、Linux等,使得开发人员可以在不同的平台上开发和部署应用程序。

5. 适合微服务架构:Node.js的轻量级和高效性使得它成为构建微服务架构的理想选择,可以快速构建和部署微服务。

6. Node.js用户量大:我们无法统计Node.js软件的下载量,但是我们可以通过Node.js框架Express的下载量来分析出Node.js的用户量非常惊人。Node.js在2017年的时候用户量已经过千万。经过了3年的发展,Node.js目前的用户量可想而知。

7. Node.js最擅长高并发:Node.js最擅长的就是处理高并发,在Java、PHP或者.net等服务器端语言中,会为每一个客户端连接创建一个新的线程,而每个线程需要耗费大约2MB内存。也就是说,理论上,一个8GB内存的服务器可以同时连接的最大用户数为4000个左右。要让Web应用程序支持更多的用户,就需要增加服务器的数量,而Web应用程序的硬件成本当然就上升了。Node.js不为每个客户连接创建一个新的线程,而仅仅使用一个线程。当有用户连接了,就触发一个内部事件,通过非阻塞I/O、事件驱动机制,让Node.js程序宏观上也是并行的。使用Node.js,一个8GB内存的服务器,可以同时处理超过4万用户的连接。

8. Node.js简单:Node.Js语法完全是js语法,只要你懂JS基础就可以学会Node.js后端开发。使得Node.js具有开发周期短、开发成本低、学习成本低等优势。

9. Node.js应用场景广泛:Node.js不仅可以像其他后端语言一样写动态网站、写接口,还可以应用在云计算平台、游戏开发、区块链开发、即时通讯、跨平台App开发、桌面应用开发(electron)、云直播、物联网领域、小程序等,应用场景非常广泛。

下面将介绍下Node.js的一些高级特性

大前端专栏

https://blog.csdn.net/zhouruifu2015/category_5734911

Node.js专栏

https://blog.csdn.net/zhouruifu2015/category_6080879

1. 高级事件处理:事件驱动机制

Node.js采用事件驱动的方式处理请求和响应,这种机制可以帮助开发者处理大量并发请求,提高系统的性能和可靠性。这意味着所有的I/O操作、网络请求和异步方法都是基于事件触发的。当某个异步操作完成后,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');

在上面的代码中,我们创建了一个`MyEmitter`类,`MyEmitter`类继承自`EventEmitter`类(events是Node.js内置的模块),可以定义自己的事件监听器。`myEmitter.on()`函数定义了一个事件监听器,可以在事件发生时执行一些处理逻辑。`myEmitter.emit()`函数触发了一个事件,可以将事件数据传递给事件监听器。

在Node.js中,事件是非常重要的一个概念,可以帮助开发人员更好地处理异步操作和并发连接。在Node.js中,可以使用高级事件处理来实现更复杂的事件逻辑,例如事件监听器、事件发射器等。

2. 非阻塞I/O

Node.js使用异步I/O原语来实现非阻塞I/O操作,这使得应用程序可以同时处理多个请求和连接,并具有更高的性能和吞吐量。这意味着应用程序可以在等待某个操作完成的同时继续执行其他任务,而不必一直等待该操作完成。这对于处理高并发请求和I/O密集型任务非常有用,可以使应用程序具有更高的性能和响应能力。

以下是一个简单的非阻塞I/O示例:

const fs = require('fs');

fs.readFile('C:\\logs\\setup.log',(err, data) => {

    if (err) throw err;

    console.log(data);

});

在上面的代码中,我们使用Node.js内置模块`fs`进行文件读取。`readFile`方法的第二个参数是回调函数,当文件读取完成后,Node.js将会运行此回调函数。Node.js这种采用非阻塞I/O模型的处理方式,可以在等待I/O操作的同时处理其他请求,提高了系统的并发性能。

3. 异步编程

Node.js采用异步编程模型,可以通过回调函数、Promise和async/await等方式来处理异步操作,避免了多线程编程中的竞态条件和死锁等问题。回调函数和Promise可以帮助开发人员更好地处理异步I/O操作,并使代码更具可读性和可维护性。

以下是一个Promise的示例:

const fs = require('fs').promises;

fs.readFile('/path/to/file')
  .then(data => console.log(data))
  .catch(err => console.error(err));

在上面的代码中,我们使用Node.js内置模块`fs.promises`进行文件读取,并返回一个Promise对象。我们对Promise对象使用`then`和`catch`方法进行处理,当Promise对象完成或出现错误时,将会触发相应的操作。

下面的写法将输出文本文件的内容

fs.readFile('/path/to/file', (err, data) => {
  if (err) {
    console.error(err);
  } else {
    console.log(`File contents: ${data}`);
  }
});

使用Node.js内置模块`fs`读取文件的内容,并使用回调函数处理读取操作的结果。如果读取过程中发生错误,将会输出错误信息;否则,将会输出文件的内容。

4. 模块系统

Node.js使用CommonJS规范来管理模块,模块是Node.js中的基本组成部分,可以通过require函数引入其他模块,也可以通过exports对象导出模块。允许开发人员导入和导出模块。

Node.js采用模块化机制,使得开发人员可以将应用程序分解为多个模块,并且能够很容易地重用这些模块和组织代码结构。

以下是一个模块导入和导出的示例:

// mymodule.js

module.exports = {
    greeting: "Hello Cramer, I'm SteveRocket",
    sayHello1: function () {console.log(this.greeting)},
    sayHello2: () => console.log('how are you'),
};

// app.js

//导入自定义的模块
const myModule = require('./mymodule');
console.log(myModule.greeting);  // 输出 Hello Cramer, I'm SteveRocket
myModule.sayHello1();  // 输出 Hello Cramer, I'm SteveRocket
myModule.sayHello2();  // 输出 how are you

在上面的代码中,我们定义了一个名称为`mymodule`的模块,并导出了一个具有两个属性的JavaScript对象:`greeting`和`sayHello`。在另一个文件`app.js`中,我们将这个模块导入并使用它的`sayHello`方法,输出`Hello, world!`到控制台上。

5. 流式数据处理

Node.js支持流式数据处理,提供了流式数据处理的API,可以帮助开发者高效地处理大量数据,避免内存溢出等问题。Node.js将数据分成小块逐步处理,而不是一次性将整个数据加载到内存中。这对于处理大型数据集和实时数据非常有用,并且可以提高应用程序的性能和效率。

以下是一个流式数据处理的示例:

const fs = require('fs');
const readStream = fs.createReadStream('/path/to/large/file');

readStream.on('data', chunk => {
  console.log(`Received ${chunk.length} bytes of data.`);
});

readStream.on('end', () => {
  console.log('Finished reading data.');
});

在上面的代码中,我们使用Node.js内置模块`fs`创建了一个读取文件的可读流,并使用`on`方法监听`data`和`end`事件。当数据块可用时,`data`事件将被触发并输出接收到的数据块大小。当数据读取完成时,`end`事件将被触发并输出`Finished reading data.`。

6. 跨平台支持

Node.js可以在多种操作系统上运行,包括Windows、Linux、MacOS等操作系统,这使得开发者可以轻松地开发和部署跨平台应用程序。

以下是一个跨平台示例:

const os = require('os');

console.log(`This application is running on ${os.platform()}.`);

Windows上输出:This application is running on win32.

在上面的代码中,我们使用Node.js内置模块`os`获取当前操作系统的平台,并输出到控制台上。

7. 高性能网络编程

Node.js具有出色的网络编程能力,可以轻松地构建高性能的网络应用程序。Node.js提供了一些高性能的网络编程API,例如http模块、net模块、WebSocket模块等,可以帮助开发者构建高性能的网络应用程序。Node.js使用事件驱动和非阻塞I/O的方式,使得应用程序可以同时处理多个连接和请求,并具有更高的性能和吞吐量。Node.js其他的内置模块详解请关注公众号:CTO Plus,参考后面的文章介绍。

以下是一个简单的网络编程示例:

const net = require('net');

const server = net.createServer(socket => {
    socket.write('Hello cramer', new Date());
    socket.on('data', data => {
        console.log(`Received data from client ${data}`);
    });

});

server.listen(3000, () => {
    console.log('Server listening on port:3000');
});

在上面的代码中,我们使用Node.js内置模块`net`创建了一个TCP服务器,并监听端口3000。当客户端连接到服务器时,服务器会向客户端发送一条欢迎消息,并监听客户端发送的数据,并在控制台上输出。

8. 调试工具

Node.js提供了一系列调试工具,例如Node Inspector、Chrome DevTools等,可以帮助开发人员调试定位、优化应用程序和解决应用程序中的问题,例如代码错误、内存泄漏和性能问题等。使得开发人员可以更轻松地调试和分析应用程序。

以下是一个使用Node.js调试工具的示例:

const http = require('http');

const server = http.createServer((req, res) => {
  const message = 'Hello, world!';
  res.end(message);
});

server.listen(3000, () => {
  console.log('Server listening on port 3000.');
});

在上面的代码中,我们创建了一个HTTP服务器,并监听端口3000。我们可以使用Node.js内置的调试工具`--inspect`来调试应用程序。例如,我们可以在控制台上运行以下命令:

node --inspect app.js

这将启动Node.js应用程序,并在Chrome浏览器中打开调试器。在调试器中,我们可以查看应用程序的源代码、设置断点、监视变量和执行代码等。

9. 第三方模块

Node.js拥有一个庞大的第三方模块生态系统,可以通过npm包管理工具来安装和使用这些模块,这些模块可以帮助开发者快速构建应用程序,使得开发人员可以轻松地使用各种功能强大的模块来扩展应用程序的功能。

以下是一个使用第三方模块的示例:

const moment = require('moment');

const date = moment().format('YYYY-MM-DD');

console.log(`Today's date is ${date}.`);

在上面的代码中,我们使用npm安装了一个名为`moment`的第三方模块,并在代码中引入它。我们使用`moment`模块获取当前日期,并将其格式化为YYYY-MM-DD的形式,并输出到控制台上。

10. 升级 V8 引擎至 10.7

Node.js v19 将 V8 JavaScript 引擎更新至 V8 10.7,其中包含一个新函数 Intl.NumberFormat,用于格式化敏感数字。

Intl.NumberFormat(locales, options)

对于不同的语言,传入不同的 locales:

const number = 123456789.123456789;

console.log(new Intl.NumberFormat('de-DE', {style: 'currency', currency: 'EUR'}).format(number));
console.log(new Intl.NumberFormat('ja-JP', {style: 'currency', currency: 'JPY'}).format(number));
console.log(new Intl.NumberFormat('ar-SA', {style: 'currency', currency: 'EGP'}).format(number));
console.log(new Intl.NumberFormat('zh-CN', {style: 'currency', currency: 'CNY'}).format(number));

输出结果

11. 函数式编程

Node.js支持函数式编程,这使得开发人员可以编写更加简洁、可维护和可测试的代码。函数式编程强调函数的纯粹性和不可变性,使得代码更加容易理解和调试。

以下是一个函数式编程的示例:

const numbers = [1, 2, 3, 4, 5];

const sum = numbers.reduce((acc, cur) => acc + cur, 0);

console.log(`The sum of numbers is ${sum}.`);

const squares = numbers.map(num => num * num);

console.log(`The squares of numbers are ${squares}.`);

在上面的代码中,我们使用数组的`reduce`和`map`方法来计算数字的总和和平方。`reduce`方法接受一个累加器函数和一个初始值,将数组中的每个元素依次传递给累加器函数进行计算,最终返回累加结果。`map`方法接受一个转换函数,并返回一个新的数组,其中每个元素都是原数组中对应元素经过转换函数处理后的结果。

12. 高级路由

在Node.js中,路由是非常重要的一个概念。路由可以帮助开发人员将请求分发到不同的处理程序中,以便更好地处理数据和逻辑。在Node.js中,可以使用高级路由来实现更复杂的路由逻辑,例如正则表达式路由、参数化路由等。

例如,以下是一个使用箭头函数实现的参数化路由的示例:

const express = require('express');
const app = express();
//基于express框架的第二个web服务,参数化路由
app.get('/users/:id', (req, res) => {
    const id = req.params.id;
    console.log('Hello Cramer!用户ID:', id, typeof id);
    //处理用户ID
    res.send('Hello Cramer!your ID:' + id);
});

app.listen(3000, () => {
    console.log('Server started on port:3000')
});

在上面的代码中,`/:id`表示一个参数化路由,可以匹配任何以`/users/`为前缀的URL,并将ID参数传递给处理程序。

启动服务进行访问

13. 试验 Node watch 模式

运行时增加了 node --watch 选项。

在 "watch" 模式下运行,当导入的文件被改变时,会重新启动进程。

比如:

const express = require("express");

const path = require("path");

const app = express();

app.use(express.static(path.join(__dirname, "../build")));

app.listen(8080, () =>

  console.log("Express server is running on localhost:8080")

);

% node --watch server

(node:67643) ExperimentalWarning: Watch mode is an experimental feature. This feature could change at any time

(Use `node --trace-warnings ...` to show where the warning was created)

Express server is running on localhost:8080

14. 高级中间件

中间件是Node.js中非常重要的一个概念,可以帮助开发人员在请求和响应之间执行一些处理逻辑。在Node.js中,可以使用高级中间件来实现更复杂的中间件逻辑,例如错误处理中间件、身份验证中间件等。

例如,以下是一个错误处理中间件的示例:

const express = require('express');
// 高级中间件
const app = express();

app.get('/users/:id', (req, res) => {
    const id = req.params.id;
    console.log("user " + id + " request");
    //处理用户ID
    res.send("hello cramer", id);  // TODO 此处会导致抛异常
});

app.use((err, req, res, next)=>{
    console.error(err.stack);
    res.status(500).send("Something broker!");
});

app.listen(3000, () => {
    console.log('Server listen on port:3000');
});

请求服务

在上面的代码中,`app.use()`函数定义了一个错误处理中间件,可以捕获所有请求中的错误,并将错误信息发送回客户端。

总之,Node.js具有很多高级特性,本文介绍了一些Node.js日常开发中的高级特性,例如事件驱动机制、非阻塞I/O、异步编程和模块系统、高级路由、高级中间件和高级事件处理等。这些特性使得Node.js成为构建高性能、高可扩展性和易于维护的应用程序的理想技术。还可以帮助开发人员更好地处理数据和逻辑,希望这些高级特性能够帮助读者更好地了解Node.js的强大功能,提高应用程序的开发效率和质量。

Node.js 14 将在 2023 年 4 月结束更新维护,Node.js 16 (LTS) 预计将在 2023 年 9 月结束更新维护。建议将版本按需升级到 Node.js 18(LTS)或 Node.js 20(LTS)。后面将通过项目实战来详细介绍这些高级特性的使用技巧,更多高级特性,请关注公众号:CTO Plus,获取更多学习资料,一起学习。

大前端专栏
https://blog.csdn.net/zhouruifu2015/category_5734911https://blog.csdn.net/zhouruifu2015/category_5734911Node.js专栏
https://blog.csdn.net/zhouruifu2015/category_6080879https://blog.csdn.net/zhouruifu2015/category_6080879


更多资料 · 微信公众号搜索【CTO Plus】关注后,获取更多,我们一起学习交流。

关于公众号的描述访问如下链接


关于Articulate“做一个知识和技术的搬运工。做一个终身学习的爱好者。做一个有深度和广度的技术圈。”一直以来都想把专业领域的技https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Q

推荐阅读:

Node.js系列

学习Node.js的9大理由以及日常开发中的14个高级特性和代码示例分享

学习Node.js的9大理由以及日常开发中的14个高级特性和代码示例分享_nodejs高级_SteveRocket的博客-CSDN博客

最热门高效的Node.JS开源第三方开发库和特点(持续更新......)

最热门高效的Node.JS开源第三方开发库和特点(持续更新......)_SteveRocket的博客-CSDN博客

前端开发技术栈(工具篇):2023最新版nvm的Win/Linux安装和使用(详细) 27.8k stars

前端开发技术栈(工具篇):2023最新版nvm的Win/Linux安装和使用(详细) 27.8k stars_SteveRocket的博客-CSDN博客

Node.js基本概念、特点、用途和常用模块,以及Express框架开发一个web应用

Node.js基本概念、特点、用途和常用模块,以及Express框架开发一个web应用_SteveRocket的博客-CSDN博客

弄清楚Node.js的功能特性、运行时、组成和发展趋势分析以及与JavaScript的区别

弄清楚Node.js的功能特性、运行时、组成和发展趋势分析以及与JavaScript的区别_SteveRocket的博客-CSDN博客

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SteveRocket

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值