公司使用威联通nas做网站存储,it服务,下城区网站建设价格查询,网站备案注销申请表最近去了新公司#xff0c;又拾起了被我抛下许久的后端了#xff0c;不过因为公司的需求#xff0c;后端采用Node.js#xff0c;最近一直在学习Node.js,随着逐渐深入的了解#xff0c;发现真的Node.js能越来越变得热门是有其存在的道理的。可能有人会说#xff0c;Java作… 最近去了新公司又拾起了被我抛下许久的后端了不过因为公司的需求后端采用Node.js最近一直在学习Node.js,随着逐渐深入的了解发现真的Node.js能越来越变得热门是有其存在的道理的。可能有人会说Java作为后端语言一直隐隐有龙头老大的姿势为何我们还要去学Node.js呢Node.js究竟是什么它是新的语言还是新的框架是新的工具抑或只是一个简单的JavaScript文件 运行时环境 我们众所周知Java具有一个称作JRE的运行时环境来使得java程序能够顺利运行。JRE有一个称为JVM的虚拟机。JVM有许多组件如垃圾回收器GC即时JIT编译器解释器类装载器线程管理器异常处理器用于在不同时间执行不同的任务。JRE还有一系列的库来帮助运行时的Java程序。 我们为什么要突然牵扯到JRE运行时环境呢其实正是为了与Node作比较Node不是一种语言也不是框架更不是工具它是运行JavaScript应用程序的运行时环境。Node.js有一个称为JavaScript Virtual Machine的虚拟机。它为基于JavaScript的应用程序生成机器代码以便在不同的平台上启用它。这个虚拟机就是Google的V8引擎也有主要组件如JIT和GC分别用于执行任务运行时编译和内存管理。 发展潜力 判断Java和Node的发展潜力可能要从其背后的生态社区和支持库上切入然而以Java为核心的传统体系自然比不上Node这样的新势力简而言之Java成熟而庞大Node迅捷而活跃。Java其功能性和实用性自然不必多说但是Java包含了大量的样品代码扰乱了程序猿所想表达的意图就不如Java三大框架之一的spring程序猿在使用spring的时候servlet,数据持久以及构成系统的底层的东西spring框架已经封装好会帮助你处理这一切我们只需要专注于写业务层代码就足以。但是在Spring中子系统一个接一个哪怕你犯最微小的错误它都会用让你崩溃的异常来惩罚你。可能紧接着你就会看到巨大的异常信息。里面包含着一个一个你根本不知道的封装好的方法Spring做了许多工作来实现代码的功能。这种级别的抽象显然需要大量的逻辑长长的异常信息不一定是坏事它指出了一个症状这需要多少内存和性能上的额外开销spring是怎么执行的框架需要解析方法名、猜测程序员的意图、构建类似于抽象语法树的东西、生成SQL等等。这些事情的额外开销有多大所以说使用Java掩盖复杂性并不会因此简单化只会让系统更复杂。Java严格的类型检查使得Java帮你避免许多类型的bug因为不好的代码无法通过编译。Java的强类型的缺点就是太多样板代码。程序员要不断进行类型转换程序员要花掉更多时间写精确的代码使用更多的样板代码以图早期发现错误并改正。 而Node.js恰恰相反。线程会导致更复杂化的系统。所以Node.js采用轻量级单线程的系统利用了js的匿名函数进行异步回调你只需要简单的使用匿名函数也就是闭包。不需要搜索正确的抽象接口只需要写下业务代码没有任何冗余。这就是使用Node.js的最大好处不过异步回调自然也出现一个急需解决的问题回调陷阱。 在Node.js中我们不断嵌套回调函数的同时很容易就陷入回调函数的陷阱中每层嵌套都会让代码更复杂使得错误处理和结果处理更困难。一个相关的问题就是js语言不会帮助程序员恰当地表达异步执行。其实有些库会使用Promise来简化异步操作但是看起来我们把问题简单化了但是事实上代码层面更复杂化了Promise用了许多样板代码掩盖了程序员的真实意图。后来Node.js支持ES5与ES6可以采用async/await函数重写回调函数。还是同样的异步结构但使用了正常的循环结构来书写。错误和结果处理的位置也很自然代码更易于理解更容易编写而且也可以很容易地理解程序员的意图。回调陷阱并不是用掩盖复杂性的方式解决的。相反语言和范式的改变解决了回调陷阱的问题同时还解决了过多样板代码的问题。有了async函数代码就更漂亮了。简单化的解决方法将Node.js的缺点转化为了优点。但是JavaScript的类型很松散。而且在你书写代码的时候不会进行报错许多类型不需要定义通常也不需要用类型转换。因此代码更清晰易读但存在漏掉编码错误的风险只有在编译的时候才会去检查你语法以及逻辑是否存在问题所以在Node.js中为了更好的调试BUGNode支持将程序分成不同的模块因为有模块的存在将错误发生的范围缩小到某个范围内使得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作为后端能实现几乎所有应用只是我们选择的时候考虑更多的是这个应用选择Node.js是不是最适合的。