Node.JS系统学习
1、命令行窗口(小黑屏)、CMD窗口、终端、shell
- 开始菜单
- 运行
- CMD
- 回车
常用指令:
- dir : 列出当前目录下的所有文件
- cd 目录名:进入到指定目录
- md 目录名:创建文件夹
- rd 目录名:删除文件夹
- 文件名:直接打开文件
目录:
- 。表示当前目录
- 。。表示上一级目录
环境变量(Windows系统中的变量):
- path中存放的路径,每个路径都是分号结尾,所以将想要随时访问的文件所在的文件夹路径加入到path中,即可在命令行窗口随时访问该路径下的文件。
- 原理:当我们在命令行窗口打开一个文件,或调用一个程序时,系统会首先在当前目录下寻找文件程序,如果找到了则直接打开,如果没有找到,则会依次到环境变量path的路径中寻找,知道找到为止。如果没有找到,则报错。
- 所以我们可以将一些经常访问的程序和文件的路径添加到path中,这样我们就可以在任意位置来访问这些文件和程序了。
2、进程和线程
进程:
- 进程负责为程序的运行提供必备的环境
- 进程就相当于工厂中的车间
线程:
- 线程计算机中的最小的计算单位,线程负责执行保存到进程中的程序
- 线程就相当于工厂中的工人
- 单线程:js是单线程的
- 多线程
3、Node.js(节点 )特点:单线程
- Node.js是一个能够在服务器端运行JavaScript的开放源代码、跨平台JavaScript运行环境。
- Node采用的Google开发的V8引擎运行的js代码,使用事件驱动、非阻塞、异步I/O模型等技术来提高性能,可优化应用程序的传输量和规模。
Node的用途
- Web服务API,比如REST
- 实时多人游戏
- 后端的Web服务,例如跨域、服务器端的请求
- 基于Web的应用
- 多客户端的通信,如即时通信
Node特点
- Node的服务器是单线程的
- Node处理器请求时是单线程,但是后台拥有一个I/O线程池
4、Node执行js文件
- 在文件所在目录直接打开命令行窗口,使用node 文件名.js来执行js文件。
5、Node整合webstorm
- 点击settings
- 搜索配置路径
6、ECMAScript标准的缺陷
- 没有模块系统(ES6已经有了)
- 如果程序设计的规模达到了一定程度,则需要对其进行模块化。
- 模块化可以有多种形式,但至少应该提供能够将代码分割为多个源文件的机制。
- CommonJS的模块功能可以帮我们解决该问题。
- 标准库较少
- 没有标准接口
- 缺乏管理系统
7、CommonJS规范
- CommonJS规范的提出,主要是为了弥补当前JavaScript)没有标准的缺陷。
- CommonJS规范为S指定了一个美好的愿景希望S能够在任何地方运行。
- CommonJS对模块的定义十分简单:
- 模块引用
- 模块定义
- 模块标识
Node模块化
定义
-
在Node中,一个js文件就是一个模块。
-
在node中有一个全局对象global,它的作用和网页中window类似
- 在全局中创建的变量都会作为global的属性保存
- 在全局中创建的函数都会作为global的方法保存
-
nodejs代码运行
-
当node在执行模块中的代码时,他会首先在代码的最顶部添加如下代码
function(exports,require,module,__filename,__dirname){
-
在代码的最底部,添加如下代码
}
-
实际上模块中的代码都是包装在一个函数中执行的,并且函数执行时,同时传递进5个实参
- exports
- 该对象用来将变量或函数暴露到外部
- require
- 函数,用来引入外部的模块
- module
- module代表的是当前模块本身
- __filename
- 当前模块的绝对路径
- __dirname
- 当前模块所在文件夹的绝对路径
- exports
-
-
在Node中,每一个js文件中的js代码都是独立运行在一个函数中
- 而不是全局作用域,所以一个模块中的变量和函数在其他模块中无法访问
-
向外部暴露属性或方法
- 我们可以通过exports来向外部暴露变量和方法,只需要将需要暴露给外部的变量或方法设置为exports的属性即可。
- 例如:
exports.x = "我是暴露的变量";
exports.fn = function(){ return "我是暴露的函数"};
- 我们可以通过exports来向外部暴露变量和方法,只需要将需要暴露给外部的变量或方法设置为exports的属性即可。
引入其他模块
- 在Node中,通过**require()**函数来引入外部的模块
- require()可以传递一个文件的路径作为参数,node将自动根据该路径来引入外部模块
- 这里路径,如果使用相对路径,必须以 . 或 … 开头
- 使用require()引入模块以后,该函数返回一个对象,这个对象代表的是引入的模块
- 所以可以定义一个变量来接收这个返回的对象
- 我们使用require()引入外部模块时,使用的就是模块标识,我们可以通过模块标识来找到指定的模块
- 模块分为两大类:
- 核心模块
- 由node引擎提供的模块
- 核心模块的标识就是,模块的名字
- 文件模块
- 由用户自己创建的模块
- 文件模块的标识就是文件的路径(绝对路径,相对路径)
- 核心模块
8、exports和module exports
- 通过exports只能使用
.
的方式向外暴露内部变量- 例如
exports.xxx = xxx
- 例如
- 而module.exports既可以通过
.
的形式,也可以直接赋值- 例如
module.exports.xxx = xxx 或者 module.exports = {}
- 例如
可以理解为NodeJS在运行js代码之前运行以下两行代码:
var module = new Module();
var exports = module.exports;
9、包简介(package)
- CommonJS的包规范允许我们将一组相关的模块组合到一起,形成一组完整的工具。
- CommonJS的包规范由包结构和包描述文件两个部分组成
- 包结构
- 用于组织包中的各种文件
- 包描述文件
- 描述包的相关信息,以供外部读取分析
包结构
包其实就是一个压缩文件,解压以后还原为目录。符合规范的目录,应该包含如下文件:
- package.json 描述文件(必须存在,也就是说明书)
- bin 可执行二进制文件
- lib js代码
- doc 文档
- test 单元测试
包描述文件(json文件中不能写注释)
- 包描述文件用于表达非代码相关的信息,它是一个JSON格式的文件-package.json,位于包的根目录下,是包的重要组成部分。
- package.json中的字段
- name、description、version、keywords、maintainers、contributors、bugs、licenses、repositories、dependencies(依赖描述)、homepage、os、cpu、engine、builtin、directories、.implements、scripts,author,bin、main、devDependencies。
10、NPM(Node Package Manager)
- CommonJS包规范是理论,NPM是其中一种实践。
- 对于Node而言,NPM帮助其完成了第三方模块的发布、安装和依赖等。借助NPM,Node与第三方模块之间形成了很好地一个生态系统。
NPM命令
-
npm -v
- 查看版本
-
npm version
- 打印所有模块的版本
-
npm
- 查看帮助
-
npm search 包名
- 搜索模块包
-
npm install / i 包名
- 在当前目录安装包(需要当前目录存在package.json文件,可以使用npm init进行初始化自动创建)
- 下载之后,npm自动在当前目录创建一个node_modules文件夹,然后将下载的包存储到文件夹内。
-
npm install / i 包名 --save
- 安装包并添加到依赖中(特别重要)
-
npm install / i -g 包名
- 全局模式安装包(全局安装的包一般都是一些工具)
-
npm remove / r 包名
- 删除一个模块
-
npm install 文件路径
- 从本地安装
-
npm install 包名 -registry=地址
- 从镜像安装
-
npm config set registry 地址
- 设置镜像源
-
npm install
- 下载当前项目所依赖的包(特别重要)
可以配置淘宝镜像,然后使用cnpm进行操作可加快速度。
node搜索包流程
- 通过npm下载的包都放到node_modules文件夹中
- 我们通过npm下载的包,直接通过包名引入即可使用
- node在使用模块名字来引入模块时,他会首先在当前目录的node_modules中寻找是否含有该模块
- 如果有则直接使用,如果没有则取上一级目录的node_modules中寻找
- 如果有则直接使用,如果没有则再去上一级进行寻找,直到找到为止
- 直到找到磁盘的根目录,如果依然没有则报错。
e搜索包流程
- 通过npm下载的包都放到node_modules文件夹中
- 我们通过npm下载的包,直接通过包名引入即可使用
- node在使用模块名字来引入模块时,他会首先在当前目录的node_modules中寻找是否含有该模块
- 如果有则直接使用,如果没有则取上一级目录的node_modules中寻找
- 如果有则直接使用,如果没有则再去上一级进行寻找,直到找到为止
- 直到找到磁盘的根目录,如果依然没有则报错。