NodeJS简介
对于很多刚刚接触前端的小伙伴,提起javascript,可能第一时间想到的浏览器端的脚本语言。但是随着2019年Ryan Dahl在github上发布第一版nodejs以及2011年微软支持发布windows版本,其在服务器端的发展可谓是突飞猛进。再加上js一直作为前端开发的编程语言,很多前端程序员将视线转移到服务端,从而使nodejs迸发出强大的生命力。目前国内外很多大型网站例如netflix,淘宝都在使用基于nodejs的web服务,很多小型互联网企业也以nodejs作为服务端的首选。
提起nodejs,很多人第一想到的是一门服务器端语言,因为我们经常会把nodejs与java,php等传统web服务端语言进行对比。但是确切的讲,nodejs并不是只一门编程语言,而是javascript运行环境。对于传统的前端开发来说我们的js代码都是运行在浏览器中的,而nodejs封装了谷歌浏览器的v8引擎,可以将js代码编译成字节码执行,从而使得js代码可以在服务器端运行。
在javascript诞生之初,更多的是作为浏览器端的脚本语言而存在,很少会有人将它看作是一门真正的编程语言。随着各种前端库和框架的问世,javascript也被不断的封装,抽象,但始终缺少构建大型应用的基本特征:模块。java有类文件,c++有include,python有from...import,javascript却只能在html文件中通过script标签来进行引用,js的这一缺陷大大限制了其发展。为了填补javascript没有模块系统,缺少标准库这些空白,社区专门制定了应用于javascript的模块化标准--CommonJS。CommonJS的问世大大增强了js的应用范围,NodeJS基本沿用了这一规范,但也进行了部分取舍,增加了些许自身的特性。
NodeJS中的模块分为两类,一类是NodeJS内建的模块,例如:http,fs,stream等,此类模块被称为核心模块。此类模块在Node源代码编译过程中被编译成二进制文件,在进行启动时直接被加载进内存,所以加载此类模块速度较快。另一类模块则是用户构建应用所编写的js文件,此类模块被称为文件模块,由于文件模块是在运行时动态加载,需要经历完整的路径分析,文件定位,编译执行过程,所以加载速度较慢。
CommonJS规范的问世为js提供了模块化管理的能力,因此许多第三方模块应运而生。NodeJS虽然能很有效的管理自己的核心模块,但由于第三方模块是由互联网上成千上万的程序员们所编写并且分散在各地,NodeJS缺少一种有效管理第三方模块的模式。Java有maven,gradle,python有pip,php有compose,js是不是也需要一个第三方包管理工具呢?NPM的问世解决了这一问题。
CommonJS的包规范有包描述文件和包结构两部分组成,包描述文件用于描述包的相关信息,包结构用来组织包中的各类文件。包描述文件用于表达非代码相关的信息,是一个json文件,一般命名为package.json,位于包的根目录下。CommonJS的包规范只是为node包的安装提供了规范,而npm则是对这一规范的实现,npm通过读取package.json中的字段信息来完成对第三方包的发布,安装等功能。用户可以将自己编写的第三方模块放在npm仓库进行托管,其他开发者便可通过npm内置的命令来安装这些包来简化开发。
Nodejs到底为什么可以作为服务端开发平台呢?回答这个问题之前我们先来了解一下提供web服务需要的一些基本功能。在我们平时的前端业务开发中,通常是以restfulAPI的形式来与web服务器进行交互,因此web服务器需要提供必要的http功能以及tcp功能暴露端口以便访问;并且经常会遇到文件上传与文件下载等业务场景,因此服务器需要提供访问目录,操作文件系统等功能。在模块化部分我们提到了nodeJS内建了许多核心模块,这些核心模块恰好提供了这些作为web服务器所需的基本功能。下面让我们来简单了解一下nodeJS的这些模块。
- http模块
nodeJS的http封装了对http请求的处理,http服务继承自tcp服务器的net模块,当我们使用http.createServer()建立http服务器的同时会创建一个tcp连接。
- fs模块
node的fs模块提供了对文件和目录操作的一些功能,例如fs.writeFile()可以让我们将数据写入文件,fs.readFile()可以读取文件返回给客户端。
- process模块
每当我们开启一个node服务时,便可使用process模块获取一些进程信息或者进行进程级别的操作。
除了上述三个比较常用的模块之外,node还提供了许多功能强大的核心模块,例如path,child_process,url等等。我们会在以后的文章中对这些模块进行详细介绍,这里将不再过多赘述。
在NodeJS推出之前就已经存在很多成熟的服务器开发语言,java,php等目前也保有着很庞大的市场份额。NodeJS能够异军突起必然是存在着它自己的优势,下面让我们来列举一下NodeJS服务端开发的一些优点和缺点。
优势:
- 使用nodeJS开发服务器归根结底还是使用js来编写代码,熟悉前端开发的同学自然对js已经轻车熟路,向后端迁移学习成本较低。
- nodeJS的单线程模式促使程序执行上下文不需要向其他服务器端语言一样切换运行时上下文,运行状态加锁,解锁等操作。
- nodeJS本身采用异步io+事件循环模式,并且内部存在大量异步api,线程无须等待当前任务执行完便可执行下个任务,有效防止线程阻塞的问题,非常适合io密集型操作。
劣势:
- 因为nodeJS采用时间循环模式,意味着需要不停的轮询事件队列来来获取异步执行结果,当事件非常多时,对服务器cpu会是一个很大的挑战
- 由于nodeJS是服务端开发平台的新贵,在应用范围,插件数量上确实很难和java这种老牌语言相比。
NodeJS作为服务端开发的后起之秀,具有使用javascript作为开发语言这一得天独厚的优势,深受广大国内外开发者的喜爱,国内大大小小的互联网公司也将node开发作为前端开发者的必备技能。明确的说,nodejs是一个值得你投入的环境,相比其他服务器的编程环境,nodejs高效、现代,是业界最新思考的智慧结晶,与云平台天然的结合。也就是说,不管未来如何发展,nodejs对业界的影响已经存在,并将持续下去。