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中执行
- …
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之前执行)
…
事件驱动:
到达某个时候做一些事情,就是事件驱动(服务器端能用异步的不用同步操作)
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 -g2、想在项目中安装模块,和npm的操作步骤类似
yarn init -y 生成package.json
yarn add xxx 安装具体模块,并且保存在生产依赖项中(yarn只能把模块安装在本地项目中不能安装在全局)
yarn add xxx –dev 保存在开发依赖项中
yarn remove xxx 移除安装的模块
yarn install 按照依赖模块清单,跑环境基本上和npm的操作类似,大家可以体验一把哈,看看急速安装是什么状态