现在在中后台,越来越多的公司选择使用NodeJs,Why NodeJs?

从我看来,第一点是NodeJs使用JavaScript编写,对于熟悉JS的前端工程师极其友好。第二点,NodeJs依托于Google的V8引擎,相比于Python,PHP等后端常用语言,NodeJs的算力速度远快于它们。第三点,NodeJs拥有libuv线程池,专门用于异步处理I/O任务,这使得NodeJs在处理高并发的I/O任务时,显得游刃有余。

与JavaScript一样,NodeJs也是单线程的。单线程的好处,在于进程在进行时,不需要去考虑同步的问题,但是带来的问题是在遇到对CPU算力的事件时,NodeJs或许会发生堵塞,影响进程的进行。为什么说是或许呢,因为实际上NodeJs已经解决了单线程的问题,我们可以运用child_process打开子进程,充分利用多核CPU的优势,来处理对CPU算力要求高的事件。同时,NodeJs的模块不仅限于用JavaScript编写,同时它也可以用C/C++编写。用C/C++写的模块,在性能上要远优于用JavaScript写的模块。

node环境为什么需要python 为什么要用nodejs_加载


既然谈到模块,就说一说NodeJs的模块特性。现在NodeJs经由模块,可以轻便地完成各式各样的事件。而模块的引入和导出都根据CommonJS的标准,用var math = require(‘math’)这样的方式导入,导出模块中具体的方法函数,用exports.add = function () {…}这样的形式,无论在导出或者导入,都达到了统一,而且CommonJS构建的这套模块导出和引入机制使得用户完全不必考虑变量污染。

而模块分为核心模块和文件模块。核心模块是NodeJs自带的,在加载NodeJs时,部分自带模块就进行加载了,加载速度十分快。而文件模块即我们自己写的或者是第三方模块,在载入时需要提供具体路径,还要编译,所以加载速度不及核心模块。

模块的加载的优先级是核心模块 -> 缓存过的模块 -> 第一次加载的模块。模块在加载编译的时候,Node会进行模块的缓存,以便下次使用。而对于模块的查找,Node会逐步尝试模块路径中的路径,直到找到文件或者到根目录,那么如果路径越深,模块查找耗时就会越多,加载时间也就会越慢。如果没找到文件,而单是找到同名的目录的话,Node会对目录下的package.json进行解析当作模块来引入。

Node的编译过程会对不同文件采用不同的编译过程。

  1. js文件
    首先会将js模块文件编译为c/c++代码,然后采取C/C++的编译方法。但是,Node会暗戳戳地保存编译成的C/C++代码,以便下次使用
  2. node文件
    通过process.dlopen()进行编译,但是,实际上.node是已经通过c/c++编译完成的文件,因此,这个编译过程只是将.node文件进行关联和加入缓存。
    3.json文件
    node会直接将json在require的作用下解析为可以使用的字符串并关联到exports上,都做完后,还会进行缓存,提高再次调用的效率。
    在日常中,我们用npm工具来管理模块。npm十分简单,它只包括包结构和包描述文件(package.json)。包结构如下所示:

    在我们使用的时候,npm会从package.json里的script找入口,

    npm这样统一了Node依赖包的管理,解决了依赖包安装的问题。对于npm中其他字段的说明,大家可以上网查找,或者深入读一下《深入浅出NodeJs》