初识Node.js时Node与java作为后台服务器的对比本平台不定期更新,喜欢我的文章请关注我的微信公众号。想了想,好久没有更新文章了。我最近去了一家新公司,拿起了我遗弃了很长时间的后端。但是因为公司需要,后端使用了node.js。我最近一直在学习Node.js。随着逐渐深入的了解,发现真实节点能够越来越受欢迎,是有其原因的。可能有人会说,作为后端语言,java一直都是老大。为什么还要学习node?Node.js究竟是什么?它是一门新语言还是一个新框架,一个新工具还是一个简单的JavaScript文件?运行环境我们都知道Java有一个运行环境叫JRE,可以让java程序顺利运行。JRE有一个名为JVM的虚拟机。JVM有许多组件,如垃圾收集器(GC)、即时(JIT)编译器、解释器、类加载器、线程管理器、异常处理程序,以在不同时间执行不同的任务。JRE还有一系列库来帮助运行Java程序。为什么突然涉及到JRE运行环境呢?其实就是为了和node比较。Node不是一种语言,也不是框架,更不是工具。它是运行JavaScript应用程序的运行时环境。Node.js有一个名为JavaScriptVirtualMachine的虚拟机。它为基于JavaScript的应用程序生成机器代码,以在不同平台上启用它。这个虚拟机是谷歌的V8引擎,它还有JIT和GC等主要组件,分别用于任务执行、运行时编译和内存管理。发展潜力判断Java和node的发展潜力,可能要看其背后的生态社区和支持库。但是,以Java为核心的传统系统自然不如node这样的新势力。总之,Java成熟庞大,node快速活跃。java的功能性和实用性自然不用多说,但是java包含大量示例代码,扰乱了程序员的意图,还不如java三大框架之一的spring。程序员在使用spring、servlet、数据持久化以及构成系统底层的东西时,spring框架已经封装好帮你处理这一切,我们只需要专注于编写业务层代码就够了。但是在Spring中,一个接一个的子系统,即使是你犯的最微小的错误,它也会用异常来惩罚你,让你崩溃。之后您可能会看到一条巨大的异常消息。它包含了一个你根本不知道的封装方法。Spring为实现代码的功能做了很多工作。这种抽象层次显然需要大量的逻辑,而且异常消息长不一定是坏事,它指向一个症状:这需要多少内存和性能开销?spring是如何执行的?框架需要解析方法名称、猜测程序员的意图、构建抽象语法树之类的东西、生成SQL等等。这些东西有多少开销?所以用java来掩盖复杂性并不能简化它,只会让系统变得更复杂。Java严格的类型检查使Java可以帮助您避免许多类型的错误,因为无法编译错误的代码。Java强类型的缺点是样板代码太多。程序员不得不不断地进行类型转换,程序员花费更多的时间来编写准确的代码,并使用更多的样板代码,试图及早发现错误并加以纠正。而Node.js恰恰相反。线程导致更复杂的系统。因此,Node.js采用了轻量级的单线程系统,利用js的匿名函数进行异步回调。你只需要简单地使用匿名函数,也就是闭包。不需要去寻找正确的抽象接口,直接把业务代码写下来,没有任何冗余。这是使用Node.js最大的好处,但是异步回调自然也有一个急需解决的问题:回调陷阱。在Node.js中,当我们不断嵌套回调函数时,很容易陷入回调函数的陷阱。每一层嵌套都会让代码变得更加复杂,使得错误处理和结果处理更加困难。一个相关的问题是JavaScript语言没有帮助程序员正确地表达异步执行。其实有些库使用Promise来简化异步操作,但是看起来我们简化了问题,实际上代码层面更加复杂。Promise使用大量样板代码来掩盖程序员的真实意图。后来Node.js支持ES5和ES6,回调函数可以改写成async/await函数。仍然是相同的异步结构,但使用正常的循环结构编写。错误和结果处理的位置也很自然,代码更容易理解,更容易编写,也更容易理解程序员的意图。回调陷阱没有以掩盖复杂性的方式解决。相反,语言和范式的改变解决了回调陷阱的问题,同时也解决了过多样板代码的问题。使用异步函数,代码更漂亮。将Node.js的劣势转化为优势的简单解决方案。但是JavaScript是松散类型的。而且你写代码的时候不会报错,很多类型不需要定义,通常也不需要使用类型转换。因此,代码更清晰易读,但存在遗漏编码错误的风险。只有在编译的时候你才会检查你的语法和逻辑是否有问题。因此,在Node.js中,为了更好的调试BUG,node支持将程序分成了不同的模块。因为模块的存在,可以将错误的范围缩小到一定范围内,使得Node.js模块更容易测试。包管理java最重要的问题之一就是没有统一的包管理系统。有人可能会告诉我Maven。但无论是在用途、易用性还是功能方面,Maven都与Node.js的包管理系统完全不同。npm是Node.js官方提供的包管理工具。它已经成为Node.js包的标准发布平台,用于Node.js包的发布、传播和依赖控制。npm提供了命令行工具,可以让你方便地下载、安装、升级和删除包,也可以让你以开发者的身份发布和维护包。最好的部分是npm代码库不仅供Node.js使用,还供前端工程师使用。所有前端JavaScript库都以npm包的形式存在。许多前端工具,如Webpack,都是用Node.js编写的。性能Java使用HotSpot这个超级虚拟机,采用多字节编译策略。它检测频繁执行的代码,一段代码执行得越频繁,应用的优化就越多。所以HotSpot性能相对更快。Node底层是用c++和v8引擎实现的,node.js的事件驱动机制,也就是说面对大规模的http请求,node.js是通过事件驱动来完成的,所以有无需担心性能。而且它很棒。而且,由于V8引擎的改进,Node.js的每个版本都带来了巨大的性能提升。虽然Node对于高并发应用有着极高的性能,但是Node.js也有自己的缺点:Node不适合CPU密集型应用,因为CPU密集型应用如果有长期计算,不如一个大循环,会导致CPU时间片无法释放,从而导致后续的所有IO操作都被挂起。而且Node只支持单核CPU,不能充分利用CPU资源,可靠性低。一旦某一部分代码崩溃,就会导致整个系统崩溃。原因是Node使用单进程。Node的开源组件库质量参差不齐,更新快,不向下兼容。其实Node.js作为后端几乎可以实现所有的应用,但是我们在选择的时候更多的是考虑项目场景是否适合使用NodeJS。欢迎关注我公众号:程序员周先森
