node.js 相关笔记
一,什么是node.js:
node.js并不是一门语言,而是一个平台 。 node.js是一个构建在Chrome JavaScript运行环境的平台,
因为, node.js很巧妙的借用了web开发人员已经非常熟悉的JavaScript语法,使用V8 JavaScript 引擎(是Goole开发的一个用于Chrome浏览器的底层JavaScript引擎,用于解析JavaScript语句创建其运行环境) 来解析语句,并将其重建可在服务器上使用。所以严格上说node.js并不是服务器端运行的Javascript,而是可以在服务器端运行JavaScript语法(core JavaScript)的平台。node.js并不仅仅运行core JavaScript,node.js中还有文件系统、模块包、操作系统API、网络通信、二进制类型处理等。
node.js 的架构:
其中http、fs、net等都是node.js提供的核心模块,使用C/C++实现,外部用JavaScript封装。
二,node.js的优势:
- node.js致力于使构建速度快、稳定的网络程序更简单
- node.js具有事件驱动和非阻塞I/O的特色,使之轻量级并且高效率
- node.js非常适合在分布式设备运行数据密集型实时应用程序
node.js中代码是单进程、单线程执行的,使用事件轮询机制和非阻塞I/O(在回调函数中处理结果),在不新增额外线程的情况下对任务进行并行处理。
虽然JavaScript是单线程执行的,但浏览器是多线程的,负责调度管理JavaScript代码,让它们在恰当的时机执行。回调函数就是由浏览器调用的。
// 我们所说的node.js单线程,是指node.js并没有给我们创建一个线程的能力,所有我们自己写的代码都是单线程执行的,在同一时间内,只能执行我们写的一句代码。但浏览器并不是单线程的,它会维护一个执行队列,循环检测,调度JavaScript线程来执行。因此单线程执行和并发操作并不冲突。
在这些场景下使用node.js是非常合适的
- web socket服务器
- TCP/UDP套接字应用程序
- 复杂逻辑的web应用
- 命令行工具
- 客户端Javascript编译器
在开发一个复杂的应用程序的时候,我们需要把各个功能拆分、封装到不同的文件,在需要的时候引用该文件。 而node.js使用模块和包来组织,其机制实现参照了CommonJS标准,虽未完全遵守,但差距不大,使用起来非常简单。
在 node.js中,一个node.js文件就是一个模块,文件内容可能是我们封装好的一些JavaScript方法、JSON数据、编译过的C/C++拓展等。
node.js使用exports和require对象来解决对外提供接口和引用模块的问题。
示例:
// test.js ,此为一个模块(module) var name=''; function setName(n){ name=n; } function printName(){ console.log(name); } exports.setName=setName; exports.printName=printName; //index.js 此为另一个模块 var test1=require('./test'), test2=require('./test');
//无论调用多少次require,对于同一模块node.js只会加载一次,引用多次获取的仍是相同的实例
test1.setName('Byron'); test2.printName();
运行结果:
在上面例子中我们使用了相对路径 './test'来获取自定义文件模块,那么node.js有几种搜索加载模块方式呢?
- 核心模块优先级最高,直接使用名字加载,在有命名冲突的时候首先加载核心模块 文件模块只能按照路径加载(可以省略默认的.js拓展名,不是的话需要显示声明书写)
- 绝对路径
- 相对路径
npm是什么
npm是node packaged modules的缩写,其实是一个nodejs的module的管理工具
什么是module
所谓module和java中的包的概念很类似,一些解决方案的集合,官方会提供核心的几个,第三方的很多
如何安装第三方module
因为nodejs的社区很活跃,有很多好用的第三方的包,我们可以在终端中使用npm的命令安装
- npm install [-g] <name>:使用install指令可以把nodule下载安装的nodejs的全局的path处,不加的话会安装到当前路径
- npm remove <name>:移除module
- npm update <name>:更新 module
还有一些常用命令可以看看npm常用命令