NODE中一些常用的基础知识讲解

作者:日期:2017-12-31 17:30:56 点击:413

NODE中一些常用的基础知识讲解

 

NODE的特点

常人所说的NODE是后台编程语言,这种说法其实是错误的。NODE只是一个工具(或者环境),我们可以把NODE安装在服务器上,NODE提供的环境可以运行JS代码,这样我们就可以在服务器端使用JavaScript编写一些处理服务器相关操作的程序,也可以理解为JS变为了后台编程语言。

1、NODE是基于V8引擎来渲染JS的(V8是谷歌的引擎)

  • 渲染JS的速度会很快
  • 我们在使用JS开发后台程序的时候,不需要考虑浏览器兼容了,使用JS的最新标准即可(ECMAScript)

2、单线程、无阻塞I/O操作、事件驱动(event-driven)


NODE是如何执行JS代码的

常用的方式有三种

  • 使用NODE的REPL(Read-Evaluate-Print-Loop,输入-求值-输出-循环)命令
  • 使用命令行:node xxx.js (在命令行中把xxx.js文件中的代码执行)
  • 在webStorm中直接右键 -> Run xxx.js 也可以把JS代码在NODE中执行

Alt text

Alt text

Alt text


I/O操作

I(input):输入
O(output):输出
I/O操作泛指对文件及文件中内容的操作(包括:增删改查)

JS作为前端编程语言(运行在客户端浏览器中),不能直接对客户端的本地文件进行I/O操作

  • 目的是为了保证客户端信息的安全
  • 有一些机制可以操作客户端内容(input type=’file’),但是需要用户手动选择某些文件上传才可以

JS作为后台编程语言(运行在服务器端NODE环境下),可以对服务器上的资源文件进行I/O操作

  • NODE中绝对提供了供JS代码操作I/O的方法(后面讲到的fs模块就是做这件事情的)
let fs = require('fs');
//=>异步读取:异步读取文件中的内容就是无阻塞I/O操作
//fs.readFile()
 
//=>同步读取
let con = fs.readFileSync('./readme.md', 'utf8');
console.log(con);

JS中的同步异步

客户端:

  • 定时器都是异步操作的
  • AJAX中也提供异步操作(Promise设计模式是异步编程的处理模式)
  • 事件绑定也是异步编程
  • 回调函数也可以理解为异步编程

同步:一件事一件事的来进行处理,A做完了,B才能做,A做不完,B也无法执行…

异步:上一件事没有彻底完成,下一件事可以先干着,A(异步)没做完,B(同步)先做,等B做完了,在把A进行处理…

JS本身是单线程的(有很多的进程), 一次只能做一件事情


NODE中的异步操作:

  • 定时器
  • 异步的I/O
  • 回调函数
  • setImmediate:在等待任务队列的顶部最先执行
  • process.nextTick:在主任务队列的最底部执行(永远会在setImmediate之前执行)

事件驱动:
到达某个时候做一些事情,就是事件驱动(服务器端能用异步的不用同步操作)

Alt text

NODE和客户端浏览器的主要区别:全局对象
浏览器全局对象: window
NODE全局对象: global

NODE天生就是基于模块化开发的

NODE中模块这个概念非常强(强到我们每创建一个新的JS,都相当于创建了一个新的模块)

NODE是基于commonjs规范来完成模块设计的(如何创建模块、如何调取模块、如何导出模块 这些就是规范里提及的内容)

  • CMD模块开发思想:seajs (按需导入:用到的时候在导入进来使用)
  • AMD模块开发思想:requirejs (提前导入所有需要的依赖)

1、自定义模块:自己创建的
2、第三方模块:别人写好的我来用
3、内置模块:天生自带的

自定义模块的原理

创建一个JS就相当于创建一个模块,而模块之间是独立的(也可以共享),为了实现这样的需求,每当创建一个JS,NODE都帮助我们做了很多的事情

//=>NODE为了实现模块之间的独立,会自动包一层闭包,而且给每一个模块传递五个值
(function (exports, require, module, __filename, __dirname) {
/*
* module模块:NODE模块管理的对象
* exports叫做导出,等同于module.exports,用来把模块进行导出的
* require是导入的方法,通过这个方法可以把一些模块导入到当前模块中使用
*/
 
//=>内部代码中有一个类似于这样的操作,可以把一些想要供别人使用的属性和方法暴露出来
module.exports=exports=this={
fn:()=>{}
};
})();
 
//=>下一个模块
(function (exports, require, module, __filename, __dirname) {
let obj=require('pre');//=>导入上边的模块
//=>我们的obj就是上面模块导出的对象
//{fn:()=>{}}
})();

require
导入某个模块,目的是使用其它模块中的属性和方法

require('./xxx') : 指定目录的情况下,都是为了要导入自己定义的模块
 
require('xxx'):不指定目录情况下,可能是导入第三方安装的模块,也可能是导入内置模块(首先到node_modules文件夹中找第三方模块,有的话,导入的就是第三方模块,没有的话,看内置模块中有没有,内置中这个模块,导入的就是内置模块,内置中没有就会报错)

module.exports
把当前模块中的某些属性和方法导出

module.exports.fn=fn;
module.exports.a=12;
//=>上面写起来麻烦(上面属于向原有内置对象的堆内存中增加属性和方法,下面属于导出一个新的堆内存)
module.exports={
fn:fn,
a:12
};
 
---
//=>直接使用exports也可以,但是这种模式只能使用原有内置内容,自己开辟新内存不行
exports.fn=fn;
exports={};//=>这种方式不行

思考题:
有三个自定义模块
A:任意数求和 sum :sum(1,2,3,4) => 10
B:求平均数 avg : avg(12,23,34) =>平均数 (先求和[调取A中的sum],除以长度,求出平均数)
C:最后调取 : 调取B中的avg ,传递几个数,算出平均数即可

第三方模块的安装

除了npm我们还可以使用yarn来安装模块

1、首先在全局安装yarn
npm install yarn -g

2、想在项目中安装模块,和npm的操作步骤类似
yarn init -y 生成package.json
yarn add xxx 安装具体模块,并且保存在生产依赖项中(yarn只能把模块安装在本地项目中不能安装在全局)
yarn add xxx –dev 保存在开发依赖项中
yarn remove xxx 移除安装的模块
yarn install 按照依赖模块清单,跑环境

基本上和npm的操作类似,大家可以体验一把哈,看看急速安装是什么状态

上一篇: Git基础知识精讲

下一篇: Promise 详解与实现(遵循Promise/A+规范)