NodeJS核心 + 原理

知识清单

        • NodeJS简介
            • 1.什么是Node.js?
            • 2.什么是V8引擎?
            • 3.什么是运行环境?
            • 4.总结
        • NodeJS运行环境搭建
        • NodeJS执行代码
        • NodeJS环境和浏览器环境执行JS代码区别
        • NodeJS全局属性和方法(部分)
        • node模块化(CommonJS规范)
            • 1.nodeJS开发中的模块
            • 2.什么是CommonJS规范?
            • 3.node模块化中暴露数据的几种方式
            • 4.require注意点
        • 包和包管理简介
        • NPM
        • NRM和CNPM的使用

NodeJS简介

1.什么是Node.js?

Node.js 是一个基于"Chrome V8 引擎" 的JavaScript “运行环境”

2.什么是V8引擎?

V8引擎是一款专门解释和执行JS代码的虚拟机, 任何程序只要集成了V8引擎都可以执行JS代码
例如:
将V8引擎嵌入到浏览器中,那么我们写的JavaScript代码就会被浏览器所执行;
将V8引擎嵌入到NodeJS中,那么我们写的JavaScript代码就会被NodeJS所执行。

3.什么是运行环境?

运行环境 就是 生存环境
地球是人类的生存环境
浏览器是网页的生存环境
windows是.exe应用程序的生存环境
Android是.apk应用程序的生存环境
也就是说运行环境就是特定事物的生存环境

NodeJS也是一个生存的环境, 由于NodeJS中集成了V8引擎
所以NodeJS是JavaScript应用程序的一个生存环境

4.总结

NodeJS不是一门编程语言, NodeJS是一个运行环境,
由于这个运行环境集成了V8引擎, 所以在这个运行环境下可以运行我们编写的JS代码,
这个运行环境最大的特点就是提供了操作"操作系统底层的API",通过这些底层API我们可以编写出网页中无法实现的功能(诸如: 打包工具, 网站服务器等)

NodeJS运行环境搭建

搭建方式一:
1.官网下载.msi安装包: https://nodejs.org/zh-cn/
2.全程下一步
3.在命令行工具中输入 node -v

搭建方式二:
1.官网下载.zip安装包: https://nodejs.org/zh-cn/
2.解压下载好的安装包
3.在"高级系统设置"中手动配置环境变量
4.在命令行工具中输入 node -v

搭建方式三:
1.下载NVM: https://github.com/coreybutler/nvm-windows
2.在D盘创建dev目录
3.在Dev目中中创建两个子目录nvm和nodejs, 并且把nvm包解压进去nvm目录中
4.在install.cmd文件上面右键选择【以管理员身份运行】
在终端中直接按下回车
将弹出的文件另存为到NVM目录
打开settings.txt文件. 修改
root: D:\Developer\Dev\NVM
path: D:\Developer\Dev\Node
6.配置环境变量
NVM_HOME: D:\Developer\Dev\NVM
NVM_SYMLINK: D:\Developer\Dev\Node
在Path中添加 %NVM_HOME% %NVM_SYMLINK%
7.在命令行工具中输入 nvm version

NVM常用命令

  • nvm list 查看当前安装的Node.js所有版本
  • nvm install 版本号 安装指定版本的Node.js
  • nvm uninstall 版本号 卸载指定版本的Node.js
  • nvm use 版本号 选择指定版本的Node.js

NodeJS执行代码

Node程序执行方式:
1.由于浏览器中集成了V8引擎, 所以浏览器可以解释执行JS代码
1.1可以直接在浏览器控制台中执行JS代码
1.2可以在浏览器中执行JS文件中的JS代码

2.由于NodeJS中也集成了V8引擎, 所以浏览器可以解释执行JS代码
2.1可以直接在命令行工具中编写执行JS代码(REPL – Read Eval Print Loop:交互式解释器)
NodeJS核心 + 原理_第1张图片
2.2可以在命令行工具中执行JS文件中的JS代码
NodeJS核心 + 原理_第2张图片

NodeJS环境和浏览器环境执行JS代码区别

1.Node环境和浏览器环境区别
NodeJS环境和浏览器环境一样都是一个JS的运行环境, 都可以执行JS代码.
但是由于宿主不同所以特点也有所不同

1.1内置对象不同

  • 浏览器环境中提供了window全局对象
  • NodeJS环境中的全局对象不叫window, 叫global

1.2this默认指向不同

  • 浏览器环境中全局this默认指向window
  • NodeJS环境中全局this默认指向空对象{}

1.3API不同

  • 浏览器环境中提供了操作节点的DOM相关API和操作浏览器的BOM相关API
  • NodeJS环境中没有HTML节点也没有浏览器, 所以NodeJS环境中没有DOM/BOM

NodeJS全局属性和方法(部分)

1.和浏览器一样Node环境中的全局对象也提供了很多方法属性供我们使用
中文文档地址: http://nodejs.cn/api/

__dirname: 当前文件所在文件夹的绝对路径
__filename: 当前文件的绝对路径
setInterval / clearInterval : 和浏览器中window对象上的定时器一样
setTimeout / clearTimeout : 和浏览器中window对象上的定时器一样
console : 和浏览器中window对象上的打印函数一样

node模块化(CommonJS规范)

1.nodeJS开发中的模块

nodeJS采用CommonJS规范实现了模块系统

2.什么是CommonJS规范?

CommonJS规范规定了如何定义一个模块,如何导出模块中的数据以及如何使用定义好的模块
2.1在CommonJS规范中,一个文件就是一个模块
2.2在CommonJS规范中,每个文件中的数据都是私有地,对其他文件不可见
2.3在CommonJS规范中,每个文件中的数据,必须通过exports导出之后,其他文件才可以使用
2.4在CommonJS规范中,要想使用其他文件暴露的数据,必须通过require导入模块后才可以使用

3.node模块化中暴露数据的几种方式

有三中导出数据的方式,但无论使用哪种方式导出,使用时都必须先用require导入

3.1 exports.xxx = xxx

//a.js
let name = 'andy';
function sum(a,b){
     
	console.log(a + b);
}
exports.str = name;
exports.fn = sum;
//exports是一个对象,暴露数据的过程就是给exports对象添加属性的过程
//b.js
let aModule = require('./a.js');

console.log(aModule.str);//andy
aModule.fn(10,20);//30

3.2 module.exports.xxx = xxx

//a.js
let name = 'andy';
function sum(a,b){
     
	console.log(a + b);
}
module.exports.str = name;
module.exports.fn = sum;
//b.js
let aModule = require('./a.js');

console.log(aModule.str);//andy
aModule.fn(10,20);//30

3.3 global.xxx = xxx(不符合CommonJS规范,一般不使用这种方式)

//a.js
let name = 'andy';
function sum(a,b){
     
	console.log(a + b);
}
global.str = name;
global.fn = sum;
//global为node中的全局对象,类比js中的window
//b.js
let aModule = require('./a.js');

console.log(global.str);//andy
global.fn(10,20);//30

exports和module.exports的区别?
不能直接给exports赋值,但是可以直接给module.exports赋值
(在开发中无论哪种方式都不要直接赋值,这种情况只会出现在面试题中)

let name = 'andy';
exports = name;//这种方式导入后拿不到数据,是个空对象{ }
module.exports = name;//这种方式导入后能拿到数据,‘andy’
//两者的区别在于:不能直接给exports赋值,但是可以直接给module.exports赋值
4.require注意点

1.1require导入模块时可以不添加导入模块的类型
如果没有指定导入模块的类型, 那么会依次查找.js .json .node文件
无论是三种类型中的哪一种, 导入之后都会转换成JS对象返回给我们

1.2导入自定义模块时必须指定路径
require可以导入"自定义模块(文件模块)"、“系统模块(核心模块)”、“第三方模块”
导入"自定义模块"模块时前面必须加上路径
导入"系统模块"和"第三方模块"是不用添加路径

1.3导入"系统模块"和"第三方模块"是不用添加路径的原因
如果是"系统模块"直接到环境变量配置的路径中查找
如果是"第三方模块"会按照module.paths数组中的路径依次查找

包和包管理简介

1.什么是包?
前面说过在编写代码的时候尽量遵守单一原则,
也就是一个函数尽量只做一件事情
例如: 读取数据函数/写入数据函数/生成随机数函数等等,
不要一个函数既读取数据又写入数据又生成随机数,
这样代码非常容易出错, 也非常难以维护

在模块化开发中也一样, 在一个模块(一个文件中)尽量只完成一个特定的功能
但是有些比较复杂的功能可能需要由多个模块组成,
例如: jQuery选择器相关的代码在A模块, CSS相关的代码在B模块, …
我们需要把这些模块组合在一起才是完成的jQuery
那么这个时候我们就需要一个东西来维护多个模块之间的关系
这个维护多个模块之间关系的东西就是"包"

简而言之: 一个模块是一个单独的文件, 一个包中可以有一个或多个模块

2.NodeJS包的管理
在NodeJS中为了方便开发人员发布、安装和管理包, NodeJS推出了一个包管理工具
NPM(Node Package Manager)
NPM不需要我们单独安装, 只要搭建好NodeJS环境就已经自动安装好了
NPM就相当于电脑上的"QQ管家软件助手", 通过NPM我们可以快速找到我们需要的包,
可以快速安装我们需要的包, 可以快速删除我们不想要的包等等

NPM

npm:Node Package Manager node包管理工具
npm不需要单独安装,只要搭建好了node环境就自动安装了npm
什么是包?
包可以简单的理解为包含一个或者多个模块的文件夹
什么是模块?
在 node开发中,依照CommonJs规范,一个文件就是一个模块
npm的作用
发布、安装和管理包

常用命令
npm config list :查看npm相关的配置 其中prefix为全局安装的地址

全局安装一般用于安装全局使用的工具,存储在全局的node_modules中(npm config list中的prefix)
npm install -g 包名(默认安装最新版本的包)
npm install -g 包名@版本号 (安装指定版本的包)
npm uninstall -g 包名 :卸载全局安装的包
npm update -g 包名:更新包(默认更新到最新的版本)

注意点:如果使用npm update -g 包名 出现问题,那么直接使用npm install -g 包名将包更新为最新版本

本地安装一般用于安装当前项目使用的包,存储在当前项目的node_modules中
本地安装前要先初始化一个package.json,初始化命令:npm init --y

什么是package.json?
package.json是包描述文件,定义了当前项目所需的各种模块,以及项目的配置信息(比如名称、版本号等元数据)

{
     
  "name": "08-npm",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
     
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

注意点:package.json文件中, 不能加入任何注释

npm install 包名
npm install 包名@版本号
npm uninstall 包名
npm update 包名

执行了npm install jquery后,可以看出package.json中添加了一个dependencies

{
     
  "name": "08-npm",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
     
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
     
    "jquery": "^3.4.1"
  }
}

执行了npm install swiper --save后,dependencies中多了一个swiper

{
     
  "name": "08-npm",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
     
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
     
    "jquery": "^3.4.1",
    "swiper": "^5.0.4"
  }
}

执行了npm install iscroll --save-dev后,package.json中多了一项devDependencies

{
     
  "name": "08-npm",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
     
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
     
    "jquery": "^3.4.1",
    "swiper": "^5.0.4"
  },
  "devDependencies": {
     
    "iscroll": "^5.2.0"
  }
}

我们来讨论一下dependencies和devDependencies的区别

  • dependencies:生产环境包的依赖,一个关联数组,由包的名称和版本号组成
  • devDependencies:开发环境包的依赖,一个关联数组,由包的名称和版本号组成

1.将项目拷贝给其它人, 或者发布的时候, 我们不会将node_modules也给别人, 因为太大
2.因为有的包可能只在开发阶段需要, 但是在上线阶段不需要, 所以需要分开指定

拿到package.json后需要执行的命令:
npm i 所有的包都会被安装
npm i --development 所有的包都会被安装
npm i --production 只会安装dependencies中的包

NRM和CNPM的使用

1.什么是nrm?
由于npm默认回去国外下载资源, 所以对于国内开发者来说下载会比较慢
所以就有人写了一个nrm工具, 允许你将资源下载地址从国外切换到国内

npm install -g nrm 安装NRM
nrm --version 查看是否安装成功
nrm ls 查看允许切换的资源地址
nrm use taobao 将下载地址切换到淘宝

PS:淘宝资源地址和国外的地址内容完全同步,。淘宝镜像与官方同步频率目前为 10分钟 一次以保证尽量与官方服务同步

2.什么是cnpm?
由于npm默认回去国外下载资源, 所以对于国内开发者来说下载会比较慢
cnpm 就是将下载源从国外切换到国内下载, 只不过是将所有的指令从npm变为cnpm而已

npm install cnpm -g –registry=https://registry.npm.taobao.org 安装CNPM
cnpm -v 查看是否安装成功
使用方式同npm, 例如: npm install jquery 变成cnpm install jquery 即可

你可能感兴趣的:(node,node.js)