【Nodejs】Node.js简介

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

在这里插入图片描述

1.前言


Node 的重要性已经不言而喻很多互联网公司都已经有大量的高性能系统运行在 Node 之上。Node 凭借其单线程、异步等举措实现了极高的性能基准。此外目前最为流行的 Web 开发模式是前后端分离的形式即前端开发者与后端开发者在自己喜欢的 IDE 上独立进行开发然后通过 HTTP 或是 RPC 等方式实现数据与流程的交互。这种开发模式在 Node 的强大功能的引领下变得越来越高效也越来越受到各个互联网公司的青睐。

1.1 前端同学为什么要学习后端/后端同学为什么要学习前端

  • 了解前后端交互流程。
  • 前端同学能够和后台开发的程序员更佳紧密地结合、更顺畅地沟通。
  • 当网站的业务逻辑需要前置时前端人员需要学习一些后台开发的技术以完成相应的任务反过来也一样。
  • 拓宽知识视野和技术栈能够站在全局的角度审视整个项目。

1.2 前端同学为什么要学 Node.js

1Node.js 使用 JavaScript 语言开发服务器端应用便于前端同学上手一些公司甚至要求前端工程师掌握 Node.js 开发。

2实现了前后端的语法统一有利于和前端代码整合甚至共用部分代码。

比如说针对接口返回的各种字段前后端都必须要做校验。此时如果用 Node.js 来做后台开发的话前后端可以共用校验的代码。

3Node.js 性能高、生态系统活跃提供了大量的开源库。

4Jeff Atwood 在 2007 年提出了著名的 Atwood 定律任何能够用 JavaScript 实现的应用系统最终都必将用 JavaScript 实现。 Jeff Atwood 是谁不重要他是 Stack Overflow 网站的联合创始人重要的是这条定律。

2.Node.js是什么


2.1 官方定义

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O的模型使其轻量又高效。Node.js 的包管理工具 npm 是全球最大的开源库生态系统。Node.js 不是一门语言也不是 JavaScript 的框架也不是像Nginx一样的Web服务器 Node.js 是 JavaScript 在服务器端的运行环境平台。

2.2 Node.js 的组成

在 Node.js 里运行 JavaScript跟在 Chrome 里运行 JavaScript 有什么不同

二者采用的是同样的 JS 引擎。在 Node.js 里写 JS和在前端写 JS几乎没有不同。在写法上的区别在于Node.js 没有浏览器、页面标签相关的 API但是新增了一些 Node.js 相关的 API。通俗来说对于开发者而言在前端写 JS 是用于控制浏览器而 Node.js 环境写 JS 可以控制整个计算机。

我们知道JavaScript 的组成分为三个部分
ECMAScript

  • DOM标签元素相关的API
  • BOM浏览器相关的API
  • ECMAScript 是 JS 的语法DOM 和 BOM 浏览器端为 JS 提供的 API。

而 Node.js 的组成分为

  • ECMAScript。ECMAScript 的所有语法在 Node 环境中都可以使用。
  • Node 环境提供的一些附加 API(包括文件、网络等相关的 API)。

如下图所示
在这里插入图片描述

2.3 小总结

  • Node 是一个服务器端 JavaScript 解释器
  • Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境
  • Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型使其轻量又高效
  • Node.js 的包管理器 npm是全球最大的开源库生态系统
  • Node.js 是一门动态语言运行在服务端的 Javascript

3.Node.js 的应用


Node.js 拥有强大的开发者社区现在已经发展出比较成熟的技术体系以及庞大的生态。它被广泛地应用在 Web 服务、开发工作流、客户端应用等诸多领域。其中在 Web 服务领域业界对 Node.js 的接受程度最高。

3.1 BFF 中间层

BFF即 Backend For Frontend服务于前端的后端。玉伯在《从前端技术进化到体验科技》这篇文章中点出了 BFF 层的概念
BFF 模式下整体分工很清晰后端通过 Java/C++ 等语言负责服务实现理想情况下给前端提供的是基于领域模型的 RPC 接口前端则在 BFF 层直接调用服务端 RPC 接口拿到数据按需加工消费数据并实现人机交互。基于 BFF 模式的研发很适合拥有前端技术背景的全栈型工程师。这种模式的好处很明显后端可以专注于业务领域更多从领域模型的视角去思考问题页面视角的数据则交给前端型全栈工程师去搞定。领域模型与页面数据是两种思维模式通过 BFF 可以很好地解耦开让彼此更专业高效。

在 Web 服务里搭建一个中间层前端访问中间层的接口中间层再访问后台的 Java/C++ 服务。这类服务的特点是不需要太强的服务器运算能力但对程序的灵活性有较高的要求。这两个特点正好和 Node.js 的优势相吻合。Node.js 非常适合用来做 BFF 层优势如下

  • 对于前端来说让前端有能力自由组装后台数据这样可以减少大量的业务沟通成本加快业务的迭代速度并且前端同学能够自主决定与后台的通讯方式。
  • 对于后台和运维来说好处是安全性不会把主服务器暴露在外面、降低主服务器的复杂度等。

3.2 服务端渲染

客户端渲染CSR / Client side render前端通过一大堆接口请求数据然后通过 JS 动态处理和生成页面结构和展示。优点是前后端分离、减小服务器压力、局部刷新。缺点是不利于 SEO如果你的页面然后通过 Ajax 异步获取内容抓取工具并不会等待异步完成后再行抓取页面内容、首屏渲染慢。

服务端渲染SSR / Server Side Render服务器返回的不是接口数据而是一整个页面或整个楼层的 HTML 字符串浏览器直接显示即可。也就是说在服务器端直接就渲染好了然后一次性打包返回给前端。优点是有利于 SEO、首屏渲染很快。

总结 搜索引擎优化 + 首屏速度优化 = 服务端渲染。

备注这里的「服务端渲染」只是让 Node.js 做中间层不会替代后端的后台同学请放心。

参考链接
Vue 服务端渲染的概念
服务器端渲染SSR和客户端渲染CSR的区别以及优化首屏的一些思考
服务端渲染SSR)
方应杭

历史回顾
1一开始页面很简单html 是后端渲染的比如PHP、ASP、JSP等方式。后端发现页面中的 js 好麻烦虽然简单但是坑多于是让公司招聘专门写 js 的人简称「前端切图仔」。

2随着 Node.js 和前端 MVC 的兴起以及前端越来越复杂慢慢演变成了「前后端分离」。

3前端的 SPA 应用流行之后发现 SEO 问题很大而且首屏渲染速度很慢但是自己选的路再难走也要走下去于是用 Node.js 在服务端渲染被看成是一条出路。

4以前在一起的时候是后端做部分前端的工作现在在一起的时候是前端做部分后端的工作。

3.3 做小型服务、小型网站的后端基于 Express、Koa 框架

现在很多公司的后台管理系统都是用 Node.js 来开发接口毕竟后台管理系统对性能和并发的要求不是太高。有了 Node.js 之后通过 JS 直接操作 DB做增删改查生成接口极大降低了前端同学的学习门槛。

当然有时候做 Node.js 开发是因为后台人力不够所以把后台开发的一部分工作量转移给前端同学。

3.4 做项目构建工具

前端正在广泛使用的构建工具 gulp、Webpack就是基于 Node.js 来实现的。

3.5 做 PC 客户端软件基于 Electron 框架

Electron 框架就是基于 Node.js 的可以用来开发客户端软件。

Electron 原名为 Atom Shell是由 GitHub 开发的一个开源框架。Electron 以 Node.js 作为运行时runtime以 chromium 作为渲染引擎使开发者可以使用 JS 这种前端技术栈开来发跨平台的桌面GUI应用程序。

有一点你可能会感到惊讶程序员们都在用的代码编辑器 VS Code 软件 就是基于 Electron 框架来开发的。其他使用 Electron 进行开发的知名应用还有Skype、GitHub Desktop、Slack、WhatsApp等。

还有一个例子是电子游戏直播网站 Twitch号称是国外游戏直播的鼻祖它在 PC 端的客户端软件就是用 Electron 框架的。你会发现Twitch 的网站视觉和 PC 端的视觉几乎是一样的。如果两端都采用 JS 语言就可以极大的复用现有的工程。

3.6 知名度较高的 Node.js 开源项目

在这里插入图片描述

  • expressNode.js 中著名的 web 服务框架。
  • Koa下一代的 Node.js 的 Web 服务框架。所谓的“下一代”是相对于 Express 而言的。
  • Egg2016 年阿里巴巴研发了知名的 Egg.js 开源项目号称企业级 Web 服务框架。Egg.js 是基于 Koa 开发的。
  • mocha是现在最流行的 JavaScript 测试框架在浏览器和 Node 环境都可以使用。
  • PM2node 多进程管理。
  • jade非常优秀的模板引擎不仅限于 js 语言。
  • CoffeeScript用简洁的方式展示 JavaScript 优秀的部分。
  • Atom编辑器。
  • VS Code最酷炫的编辑器。
  • socket.io实时通信框架。

3.7 总结

或许能用 Node.js 做的后台应用Java/C++ 也能做但是 Node.js 可以让我们多一种选择。

短期来看Node.js 很难像 Java/C++ 那样成为后台的主力开发语言。这并非是因为 Node.js 的性能问题主要是因为Node.js 还比较年轻经验积累太少框架的支持度不够。搞企业级服务Node.js 敌不过 Java/C++所以目前只能搞「轻量级」但未来可期。

限制语言能力的不是语言本身而是生态。

4.Node.js 的特点

  • 异步、非阻塞 IO 模型
  • 事件循环
  • 单线程
  • 总结轻量和高效

Node.js 的性能和效率非常高。

传统的 Java 语言是一个请求开启一个线程当请求处理完毕后就关闭这个线程。而 Node.js 则完全没有采用这种模型它本质上就是一个单线程。

你可能会疑问一个线程如何服务于大量的请求、如何处理高并发的呢这是因为Node.js 采用的是异步的、非阻塞的模型。

这里所谓的“单线程”指的是 Node 的主线程只有一个。为了确保主线程不被阻塞主线程是用于接收客户端请求。但不会处理具体的任务。而 Node 的背后还有一个线程池线程池会处理长时间运行的任务比如 IO 操作、网络操作。线程池里的任务是通过队列和事件循环的机制来执行。

5.使用 Node.js 时的劣势


  • 程序运行不稳定可能会出现服务不可用的情况
  • 程序运行效率较低每秒的请求数维持在一个较低的水平
  • 前端同学对服务器端的技术不太熟悉。
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: NodeJS