Node.js有什么难点
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它的难点主要有以下几个方面:一、单线程;二、内存管理;三、模块化;四、异常处理;五、阻塞代码;六、 异步转同步。

一、单线程
Node.js 是单线程的,这意味着它只有一个主线程来处理所有的请求。这也是 Node.js 的一个难点,因为如果主线程出现了阻塞,整个应用程序都会受到影响。
二、内存管理
Node.js 的内存管理是基于 V8 引擎的垃圾回收机制实现的。这意味着开发人员需要注意内存泄漏和内存溢出等问题。
三、模块化
Node.js 采用了 CommonJS 规范来实现模块化。这意味着开发人员需要了解 CommonJS 规范,并且需要使用 require() 函数来加载模块。
四、异常处理
说到异常捕获,相信大家都会想到try/catch/final,但是对于异步编程这种方式并不适用。
伪代码如下:
try{
async(callback);
}catch(e){
}
假设async是一个异步方法,调用async方法后,就会产生一个事件,事件(callback)会被放入该有的队列中,到了下一次事件循环(Tick),会却从队列中取出,把回调的内容传递给异步函数。因为这种情况,对异步方法进行try/catch操作只能捕获当次事件循环内的异常,对callback执行回调时候抛出的异常是无能为力的。
由于这种异常捕获的难点,Node在处理异常上形成了一种约定,将异常作为回调函数名列前茅个实参传回,如果为空值,则表明异步调用没有异常抛出。
异步方法调用例子
async(function(err,result){
//TOO
})
我们在代码编写过程中,自己编写的异步方法,也要遵循这样一些规则。
1、必须执行调用者传入的回调函数
2、正确传递回异常共调用者判断
异步方法代码例子如下
var async=function(callback){
process.nextTick=something;
if(error){
return callback(error);
}
callback(null,results);
});
五、阻塞代码
javascript编程没有sleep()这样的线程沉睡功能,要想实现延时操作只能使用setInterval()和setTimeout()这两个函数。但是node是异步的,这两个函数并不阻塞后续代码的持续执行。(遇到这种睡眠一定时间的需求的时候,统一规划业务逻辑之后,调用setTimeout()的效果会更好)
六、 异步转同步
Node提供了绝大部分的异步API和少量的同步API,但是异步编程有的时候需要根据流程,将逻辑梳理成顺序的同步形式,这种情况我们可以使用promise,和await等。
延伸阅读
Node.js适合做什么
Node.js适合用于构建高性能、可扩展的网络应用程序,例如Web服务器、API服务器、实时聊天应用程序、游戏服务器等。它还可以用于构建命令行工具、桌面应用程序等。Node.js的异步I/O和事件驱动模型使其非常适合处理I/O密集型任务,例如文件操作、网络操作等。但是,它不适合CPU密集型任务,例如图像处理、视频编码等 。
