当我和同事讨论到这个问题的时候,我开始纳闷,“我当时正在学PHP动态脚本。”他说,你可以用Node.js这个以JavaScript为核心的非常成熟的框架来写后端,没必要学PHP。
首先我们来了解一下Node.js的六大特性
01. 它是一个 Javascript 运行时
02. 依赖 Chrome V8 引擎进行代码解释
03.事件驱动
04.非阻塞 I/O
05.轻量级、可扩展,适合实时数据交互应用
06.单进程,单线程
两大优势
01.高并发(最重要的优势)
02.适合I/O密集型应用
说完了优点,再来说说缺点
01.不适合CPU密集型应用程序。
02、CPU 密集型应用给 Node 带来的主要挑战是:由于 JavaScript 的单线程特性,如果有长时间运行的计算(比如大循环),则无法释放 CPU 时间片,从而无法发起后续的 I/O。应将大型计算任务分解为多个小任务,以便计算能够及时释放,而不会阻塞 I/O 调用的发起。
03.仅支持单核CPU,不能充分利用CPU。
04、可靠性低。一旦某一部分代码崩溃,整个系统就会崩溃。
原因:因为是单进程,单线程
告诉我们它为我们解决了什么问题?
nodejs解决的问题
01. 并发连接数
02.异步、事件驱动模型
03.异步机制、事件驱动整个过程不阻塞新用户的连接,也不需要维护老用户的连接。
04.基于这样的机制,理论上 NodeJS 可以陆续响应用户的连接请求,因此 NodeJS 可以支持比 Java、PHP 程序更高的并发。虽然维护事件队列也是需要成本的,而且由于 NodeJS 是单线程的,事件队列越长,得到响应的时间就越长,还是会无法应对并发的增加。
05.NodeJS 解决了并发连接的问题:它改变了连接服务器的方式,每个连接都会发出一个在 Node.js 引擎进程中运行的事件并将其放入事件队列中,而不是为每个连接生成一个新的 OS 线程(并为其分配一些支持内存)。
06.I/O阻塞Java和PHP也有实现并行请求(子线程)的方法,但是Node.js可以很自然地通过回调函数和异步机制来实现。
但是!但是!但是!会有些问题~
问题 01.
浮点数据丢失精度
精度损失问题的表现形式,源码如下:
console.log(0.1+0.2); //0.30000000000000004
结果应该是0.3,但是运行结果出现了一个神秘的问题,这在后端开发中是绝对不允许的,这个问题不只出现在JS中,经测试JAVA和PHP中也存在,唯独C中不存在,我怎么没学过其他语言!我怎么不知道!
源码如下(借用了别人的代码[偷来的,呵呵呵]):
const floatAdd = (arg1, arg2) => { let r1,r2,m; try { r1 = arg1.toString().split(".")[1].length; } catch(e) { r1 = 0; } try { r2 = arg2.toString().split(".")[1].length; } catch(e) { r2 = 0; } m =Math.pow(10,Math.max(r1,r2)); return (arg1*m+arg2*m)/m;}; console.log(floatAdd(0.1,0.2)); // 0.3