Node.js专题讲解 第1期 概念篇

简介: 经过这几年的发展,前端普遍进入了技术深水区,只会Web页面开发已经难以满足企业的需求,Node逐渐成为了刚性技能。为了回馈粉丝的支持,前端微服务特开启Node.js专题,系统学习Node.js知识,为还在迷茫路上的你,提供系统化的学习.

一、前言


经过这几年的发展,前端普遍进入了技术深水区,只会Web页面开发已经难以满足企业的需求,Node逐渐成为了刚性技能。为了回馈粉丝的支持,前端微服务特开启Node.js专题,系统学习Node.js知识,为还在迷茫路上的你,提供系统化的学习。


二、Node.js发展史


Ryan Dahl,一名资深的C/C++程序员,他的主要工作是用C/C++写高性能Web服务。在经历过一些尝试֖和失败ܾ᠋之后,他找到了设计高性能,Web服务器的几个要点:事件驱动非阻塞I/O

Ryan Dahl最初的目标是写一个基于事件驱动、非阻塞I/O的Web服务器,以达到更高的性能,提供Apache等服务器之外的选择。但是用C/C++写就太痛苦了。于是这位兄弟开始设想用高级语言开发Web服务。

他评估了很多种高级语言,发现JavaScript比C的开发门槛要低,比Lua的历史包袱要少。尽管服务器端JavaScript存在已经很多年了,但是后端部分一直没有市场,并且空白,可以说历史包袱为零,JavaScript是单线程执行,根本不能进行同步IO操作,为其导入非阻塞I/O库没有额外阻力。所以选定JavaScript成为了Node.js的实现语言。

当时,第二次浏览器大战也渐渐分出高下,Chrome浏览器的JavaScript引擎V8摘得性能第一的宝座。又因为V8就是开源的JavaScript引擎,有着Google这一个大团队投资和持续支持,于是选择V8作为运行时引擎为不二之选。

于是在2009年,Ryan正式推出了基于JavaScript语言和V8引擎的开源Web服务器项目,命名为Node.js。虽然名字很土,但是,Node第一次把JavaScript带入到后端服务器开发,加上世界上已经有无数的JavaScript开发人员,所以Node.js一下子就火了起来。

起初,Ryan Dahl称他的项目为web.js,就是一个Web服务器,但是项目的发展超过了他最初单纯开发一个Web服务器的想法,变成了构建网络应用的一个基础框架,这样可以在它的基础上构建更多的东西,诸如服务器、客户端、命令行工具等。


三、Node.js是什么


读完Node.js,读完了它的发展由来。Node.js 不是一门新的语言,也不是一个JavaScript的框架,它是一个JavaScript运行在浏览器之外的平台,是运行在服务端的 JavaScript或者Node.js 是一个服务器端 JavaScript 解释器,是一个Javascript运行环境(runtime)。它采用事件驱动、异步编程、为网络服务而设计,实现了诸如文件系统、模块、包、操作系统 API、网络通信等 Core JavaScript 没有或者不完善的功能。实际上它是对Google V8引擎进行了封装。V8引擎执行Javascript的速度非常快,性能非常好。Node.js对一些特殊用例进行了优化,提供了替代的API,使得V8在非浏览器环境下运行得更好。说白了,就是一个能编译你写的js代码并让计算机识别并执行的编译环境,一般我们会用的到浏览器的内核来编译解析我们的JS代码,而Node.js是另一种运行环境(所以Node.js是一个平台,不是一种语言,更不是什么后端语言,也不是什么前端框架,它是由C++编写的JavaScript的运行环境—— 虚拟机)。


四、Node.js应用场景


Node.js可以是前端全栈的基石,可以与前端衔接,用来做后端应用。它的应用场景已经从前端工具的脚手架、辅助工具类,发展到api中间层、代理层,以及专业的后端开发。

这其中最有价值的就是api中间层。前后端协作的时候,因为进度不同有时前端需要等后端的接口。为了保证进度,前端可以用node做api中间层,通过nodeJs可以自己约定数据的格式,根据前端的需求定制自己的接口,自己封装对数据库的增删改查操作,创建自己的代理和网关服务器等。

这些事情在以往只能是等着后端做,但现在通过nodeJs,前端人员都可以自己搞定后端服务这个事情,这就使得工作的过程更加可控。

有时候,仅仅使用Node.js可以作为一个中间层来来分发调用数据接口,比如有一个网站数据是有java提供的,我们可以让Node.js作为一个中间层,来接受用户的请求,然后通过Node.js来调用java数据接口,获取到数据后直接在Node.js层面做html组合,然后将渲染好的页面直接给用户。为什么要这样做,直接请求java接口不行吗,这是因为Node.js被称之为高性能的web服务器,在并发和抗压方面都比传统的平台要好很多,因此这样一包装可以极大的减轻服务器的开发。


五、Node.js的优点


Node.js最大的特点是采用异步式I\O与事件驱动

  1. 单线程
  2. 异步的非阻塞I/O
  3. 事件驱动
  4. 解析JS代码
  • 没有浏览器安全级的限制;
  1. 提供系统级别的API;
  • a. 文件的读写
  • b. 进程的管理
  • c. 网络通信
  1. Node.js库异步和事件驱动
  • Node.js 使用的是单线程模型,对于所有I/O都采用异步式的请求方式,避免了频繁的上下文切换。Node.js 在执行的过程中会维护一个事件队列,程序在执行时进入事件循环等待下一个事件到来,每个异步式 I/O 请求完成后会被推送到事件队列,等待程序进程进行处理。所有API异步是非阻塞。 这意味着一个基于Node.js的服务器不会等待API返回数据。 服务器移动到下一个API后调用它,Node.js事件的一个通知机制有助于服务器,以获得从以API调用的响应。Node.js 进程在同一时刻只会处理一个事件,完成后立即进入事件循环检查并处理后面的事件。这样做的好处是,CPU和内存在同一时间集中处理一件事,同时尽可能让耗时的I/O操作并行执行。对于低速连接攻击,Node.js只是在事件队列中增加请求,等待操作系统的回应,因而不会有任何多线程开销,很大程度上可以提高 Web 应用的健壮性,防止恶意攻击。
  1. 非常快
  • 正在构建在谷歌Chrome的V8 JavaScript引擎,Node.js库代码执行是非常快的。
  1. 单线程但高度可扩展
  • Node.js使用事件循环单线程模型。事件机制有助于服务器在非阻塞的方式作出反应,并使得服务器的高可扩展性,而不是它创建线程限制来处理请求的传统服务器。 Node.js使用单线程的程序和同样的程序处理比传统的服务器要大的多,比如:比Apache HTTP服务器请求服务的数量大得多。
  1. 无缓冲
  • Node.js的应用从来没有缓冲任何数据。这些应用程序只需输出块中的数据。(即流应用)
  1. 许可证
  • Node.js是在MIT许可下发布的。


六、Node能做什么


  • 具有复杂逻辑的网站
  • 基于社交网络的大规模web应用
  • web Socket网站
  • TCP\UDP套接字应用程序
  • 命令行工具
  • 交互式终端程序
  • 带有图形用户界面的本地应用程序
  • 单元测试工具
  • 客户端Javascript编译器

……


七、相关概念


  • npm
  • package.json
  • express
  • koa
  • egg



目录
相关文章
|
1月前
|
机器学习/深度学习 自然语言处理 JavaScript
信息论、机器学习的核心概念:熵、KL散度、JS散度和Renyi散度的深度解析及应用
在信息论、机器学习和统计学领域中,KL散度(Kullback-Leibler散度)是量化概率分布差异的关键概念。本文深入探讨了KL散度及其相关概念,包括Jensen-Shannon散度和Renyi散度。KL散度用于衡量两个概率分布之间的差异,而Jensen-Shannon散度则提供了一种对称的度量方式。Renyi散度通过可调参数α,提供了更灵活的散度度量。这些概念不仅在理论研究中至关重要,在实际应用中也广泛用于数据压缩、变分自编码器、强化学习等领域。通过分析电子商务中的数据漂移实例,展示了这些散度指标在捕捉数据分布变化方面的独特优势,为企业提供了数据驱动的决策支持。
63 2
信息论、机器学习的核心概念:熵、KL散度、JS散度和Renyi散度的深度解析及应用
|
5月前
|
设计模式 JavaScript 前端开发
在JavaScript中,继承是一个重要的概念,它允许我们基于现有的类(或构造函数)创建新的类
【6月更文挑战第15天】JavaScript继承促进代码复用与扩展,创建类层次结构,但过深的继承链导致复杂性增加,紧密耦合增加维护成本,单继承限制灵活性,方法覆盖可能隐藏父类功能,且可能影响性能。设计时需谨慎权衡并考虑使用组合等替代方案。
46 7
|
1月前
|
设计模式 JavaScript 前端开发
探索JavaScript中的闭包:从基础概念到实际应用
在本文中,我们将深入探讨JavaScript中的一个重要概念——闭包。闭包是一种强大的编程工具,它允许函数记住并访问其所在作用域的变量,即使该函数在其作用域之外被调用。通过详细解析闭包的定义、创建方法以及实际应用场景,本文旨在帮助读者不仅理解闭包的理论概念,还能在实际开发中灵活运用这一技巧。
|
1月前
|
存储 JavaScript 前端开发
JavaScript 对象的概念
JavaScript 对象的概念
37 4
|
1月前
|
缓存 JavaScript 前端开发
深入了解JavaScript的闭包:概念与应用
【10月更文挑战第8天】深入了解JavaScript的闭包:概念与应用
|
1月前
|
前端开发 JavaScript 程序员
【从前端入门到全栈】Node.js 之核心概念
【从前端入门到全栈】Node.js 之核心概念
|
1月前
|
自然语言处理 JavaScript 前端开发
深入理解JavaScript中的闭包:概念与应用
【10月更文挑战第8天】深入理解JavaScript中的闭包:概念与应用
|
2月前
|
自然语言处理 JavaScript 前端开发
探索JavaScript中的闭包:从基础概念到实际应用
本文深入探讨了JavaScript中闭包的概念,从定义、作用域链和实际应用等方面进行了详细阐述。通过生动的比喻和实例代码,帮助读者理解闭包在函数执行上下文中的重要性,以及如何在实际开发中有效利用闭包解决复杂问题。同时,文章也指出了过度使用闭包可能导致的潜在问题,并给出了相应的优化建议。
|
3月前
|
JavaScript 前端开发
js bom的概念
js bom的概念
35 1
|
3月前
|
JavaScript 前端开发
JavaScript BOM 的概念(浏览器对象模型)
JavaScript BOM 的概念(浏览器对象模型)
47 1