前言
业余时间充实自我,入手学习了解一下传说中纯事件驱动/非阻塞的js架构 --nodejs
好记性不如烂笔头,本系列随笔用于整理记录学习nodejs过程中的心得
目录
- nodejs简介
- nodejs安装
- nodejs加载模块
1. nodejs简介
nodejs基于Google开源js引擎V8开发,从2009年诞生起就获得强烈关注,是一套用来编写高性能网络服务器的js工具包。简单的说 nodejs 就是运行在服务端的 JavaScript。
优势:
- 纯事件驱动,异步非阻塞。框架内部提供的大多api都是异步调用风格,无需等待某个操作完成
- 单线程。这里的单线程指主线程为单线程,所有的阻塞的全部放入一个线程池中,然后主线程通过队列的方式跟线程池来协作
- 易入手。基于js语言,js是开发者必备的一项技能,不用再单独新学一门陌生的语言,降低了学习的门槛
- 高效稳定。选择了目前最快的浏览器内核V8做为执行引擎,保证了Nodejs的性能和稳定性
弱势:
- 业务复杂程序。面对复杂业务,需要大量计算显然是没有后台代码给力
- 内存管控。js是一门弱类型语言,数据结构较为单一。对象都是基于json,无法使用内存管控
- 不需要异步的程序。对于nodejs的异步特性来说,不需要异步操作的程序可能会比较麻烦
2. nodejs安装
由于本人基于Windows系统开发,这里只介绍Windows环境安装过程。
打开nodejs官网找到自己环境相匹配的安装文件下载(需要区分32位还是64位),这里我安装的最新版本v10.15.0-x64
下载地址:https://nodejs.org/en/download/releases/
安装下载好的文件,(傻瓜式安装一直下一步即可)
安装过后WIN-R打开cmd命令窗口运行指令 node -v查看是否对应安装的版本,即是否安装成功
扩展:安装和应用包管理(NPM)
NPM是三位一体的系统——第三方包库,管理计算机中安装的包的机制以及定义包依赖关系。当我们使用npm去安装一些第三方库的时候,安装包会放在运行NPM命令时所在的目录中的node_modules文件夹中,从v0.6.0以后npm就已经包含在nodejs的安装包内。
在cmd命令窗口执行npm init先初始化NPM,以填写表单方式初始化生成一个新的package.json文件。(都有默认值一直下一步即可)
初始化后即可通过NPM安装需要的插件,通过命令指向安装的文件夹路径,再执行安装命令npm install <package name>@<version>安装所需的第三方包(version不填代表最新版本),命令行完成之后,我们会看到在文件夹中就新建了一个node_modules文件夹,并且把我们需要的库已经安装在文件夹中,如下图:
NPM两种模式:
本地模式(默认):该模式只工作在本地文件夹层次,不会引起系统范围的变化,如果想安装包时不对本地已安装的包造成影响,本地模式十分合适。
全局模式:全全局模式适合安装那些全局可用的包,比如提供命令行实用工具的包或不被应用程序直接调用的包。
安装包: npm install <package name>@<version>
安装全局模式包:npm install -g ...
卸载包:npm uninstall ...
卸载全局模式包:npm uninstall -g ...
更新包:npm update ...
更新全局模式包:npm update -g ...
3. nodejs加载模块
nodejs取消了JavaScript默认的全局名称空间,使用commonjs模块系统取代,可以直接使用require函数加载模块,如果模块存在并且没有错误语法,那么调用require()函数就会返回这个模块对象
3.1.加载核心模块
核心模块是nodejs框架内部自带且非常重要常用的,核心模块不能通过文件路径引用只能通过模块名引用,即使已经存在一个与其同名的第三方模块也会被优先加载。例如想加载和使用http核心模块
var http = require('http');
这里会返回http模块对象,细节可参见nodejs的httpapi文档
3.2.加载文件/文件夹模块
可以通用提供文件/文件夹路径的方式加载非核心模块。
var module1= require('/script/module1'); 按文件加载此处可省略文件扩展名.js
var module = require('/script');
按文件夹加载,node就会在指定文件夹下查找package.json文件,如果文件夹下不存在该文件,则默认寻找文件夹下index.js文件加载。存在则会解析该配置文件,找到main属性配置的文件路径加载。
如果一个模块名未找到加载文件,node就会尝试在当前目录的node_modules文件夹下查找,如果还是没有找到会继续查找父级文件夹,知道最上级或找到为止。
3.3.缓存模块
模块在首次加载时会被缓存,如果模块名被解析为相同的模块,那么每次调用require(modulename)都会只返回同一模块,且初始化过程只会执行一次