NodeJS
命令行
命令行窗口(小黑屏)、CMD窗口、终端、shell
-
常用的指令: dir 列出当前目录下的所有文件 cd 目录名 进入到指定的目录 md 目录名 创建一个文件夹 rd 目录名 删除一个文件夹
-
目录 . 表示当前目录 .. 表示上一级目录
-
环境变量(windows系统中变量) path C:\work\jdk\jdk1.7.0_75/bin; %CATALINA_HOME%/bin; C:\work\soft\tools\AppServ\Apache24\bin; C:\work\soft\tools\AppServ\php5; C:\Users\lilichao\AppData\Local\Programs\Fiddler; C:\work\environment\Egret\Egret Wing 3\bin; C:\Users\lilichao\AppData\Roaming\npm; C:\Program Files\MongoDB\Server\3.2\bin; C:\Users\lilichao\Desktop\hello
-
当我们在命令行窗口打开一个文件,或调用一个程序时, 系统会首先在当前目录下寻找文件程序,如果找到了则直接打开 如果没有找到则会依次到环境变量path的路径中寻找,直到找到为止 如果没找到则报错
-
所以我们可以将一些经常需要访问的程序和文件的路径添加到path中, 这样我们就可以在任意位置来访问这些文件和程序了
-
-
进程和线程
- 进程
- 进程负责微为程序的运行提供必备的环境
- 进程就是一个一个的工作计划(工厂中的车间)
- 线程
- 线程是计算机中最小的运算单位,线程负责执行进程中的程序
- 线程相当于工厂中的工人
- 传统的服务器都是多线程的
- 每进来一个请求,就创建一个线程去处理请求
- Node的服务器是单线程的
- Node处理请求时是单线程,但是在后台拥有一个I/O线程池
Node.JS
Node.js是一个能够在服务器端运行JavaScript的开放源代码、跨平台JavaScript运行环境。
Node采用Google开发的V8引擎运行js代码,使用事件驱动、非阻塞和异步I/O模型等技术来提高性能,可优化应用程序的传输量和规模。
nodejs 的模块
-
内置模块 : 可以直接引入使用
-
第三方模块 : 需要通过 npm 命令下载安装 然后引入使用
-
自定义模块 : 通过 module.exports 和 exports 定义导出模块
-
node的特点: 1.非阻塞、异步的I/O 2.事件和回调函数 3.单线程(主线程单线程,后台I/O线程池) 4.跨平台
-
模块化
-
在node中为了对模块管理,引入了CommonJS规范
- 模块的引用
- 使用 require()函数来引入一个模块
- 例子: let 变量 = require("模块的标识");
- 模块的定义
- 在node中一个js文件就是一个模块
- 默认情况下在js文件中编写的内容,都是运行在一个独立的函数中, 外部的模块无法访问
- 导出变量和函数
- 使用 exports,exports 指向 module.exports
- 例子: exports.属性 = 属性值; exports.方法 = 函数;
- 使用module.exports
- 例子: module.exports.属性 = 属性值; module.exports.方法 = 函数; module.exports = {}; exports只能使用.的方式来向外暴露内部变量而 module.exports既可以通过.的,也可以直接赋值
- 使用 exports,exports 指向 module.exports
- 模块的标识
-
模块的标识就是模块的名字或路径 对于核心模块(内置模块),直接使用模块的名字对其进行引入 var fs = require("fs"); var express = require("express");
-
对于自定义的文件模块,需要通过文件的路径来对模块进行引入 路径可以是绝对路径,如果是相对路径必须以./或 ../开头 var router = require("./router");
-
- 模块的引用
-
-
npm
npm(Node Package Manager node的包管理器)
- 通过npm可以对node中的包进行上传、下载、搜索等操作
- npm会在安装完node以后,自动安装
- npm的命令
- npm -v 查看npm的版本
- npm version 查看所有模块的版本
- npm init 初始化项目(创建package.json)
- npm search 包名 搜索包
- npm install / i 包名 安装包
- npm remove / r 包名 删除包
- npm install 包名 --save 安装包并添加到依赖中 *****
- npm install 包名 -g 全局安装包(全局安装的包一般都是一些工具)
- npm install 包名 -registry=地址 从镜像源安装
- npm config set registry 地址 设置镜像源
- 包(package)
- 将多个模块组合为一个完整的功能,就是一个包
- 包结构
bin
- 二进制的可执行文件,一般都是一些工具包中才有
lib
- js文件
doc
- 文档
test
- 测试代码
package.json
- 包的描述文件
- package.json
- 它是一个json格式的文件,在它里面保存了包各种相关的信息
name 包名
version 版本
dependencies 依赖
main 包的主要的文件
bin 可执行文件
Buffer(缓冲区)
-
Buffer和数组的结构的非常类似,Buffer是用来存储二进制数据的,但是是以十六进制形式显示。
-
Buffer的方法
- Buffer.from(字符串):将一个字符串中内容保存到一个buffer中
- Buffer.toString():将buffer转换为一个字符串
- Buffer.alloc(size):创建一个指定大小的buffer对象
- Buffer.allocUnsafe(size):创建一个指定大小的buffer对象,可以包含敏感数据
- Buffer.write(string):向缓冲区中写入字符串
- Buffer[index]:替换指定索引位置的数据
- Buffer.fill(value):将指定值填入到缓冲区的指定位置
/* 不需要引入模块,可直接使用 buffer中的一个元素,占用内存一个字节 */ let str = "hello world" // 将一个字符串保存到buffer中 let buf = Buffer.from(str) // 占用内存的大小 let length = buf.length // 创建一个指定大小的Buffer let buf2 = Buffer.alloc(10) // 10字节的buffer
-
核心模块API
fs(文件系统)
- fs模块
- 在Node通过fs模块来对系统中的文件进行操作,直接引入即可
- 引入fs:let fs = require("fs");
- fs模块中的大部分操作都提供了两种方法,同步方法和异步方法
-
同步方法带sync,同步文件系统会阻塞程序的执行,也就是除非操作完毕,否则不会向下执行代码。
-
异步方法没有sync,异步文件系统不会阻塞程序的执行,而是在操作完成时,通过回调函数将结果返回。
-
写入文件 1.同步写入 2.异步写入 3.简单写入 4.流式写入
-
读取文件 1.同步读取 2.异步读取 3.简单读取 4.流式读取
-
方法
-
打开文件 fs.open(path, flags[, mode], callback) fs.openSync(path, flags[, mode])
-
读写文件 fs.write(fd, string[, position[, encoding]], callback) fs.writeSync(fd, string[, position[, encoding]])
fs.read(fd, buffer, offset, length, position, callback) fs.readSync(fd, buffer, offset, length, position)
-
关闭文件 fs.close(fd,callback) fs.closeSync(fd);
-
简单文件读取和写入 fs.writeFile(file, data[, options], callback) fs.writeFileSync(file, data[, options])
fs.readFile(path[, options], callback) fs.readFileSync(path[, options])
-
流式文件读取和写入
- 流式读取和写入适用于一些比较大的文件 fs.createWriteStream(path[, options]) fs.createReadStream(path[, options]) open(),close() once(),end()
-
-
-
目录操作
/*
目录操作
1、创建目录
fs.mkdir(path[, mode], callback)
fs.mkdirSync(path[, mode])
2、读取目录
fs.readdir(path[, options], callback)
fs.readdirSync(path[, options])
3、删除目录
fs.rmdir(path, callback)
fs.rmdirSync(path)
*/
const path = require("path");
const fs = require("fs");
// 创建目录
fs.mkdir(path.join(__dirname, "abc"), (err) => {
console.log(err);
});
fs.mkdirSync(path.join(__dirname, "hello"));
// --------------------------------
// 读取目录
fs.readdir(__dirname, (err, files) => {
files.forEach((item, index) => {
fs.stat(path.join(__dirname, item), (err, stat) => {
if (stat.isFile()) {
console.log(item, "文件");
} else if (stat.isDirectory()) {
console.log(item, "目录");
}
});
});
});
let files = fs.readdirSync(__dirname);
files.forEach((item, index) => {
fs.stat(path.join(__dirname, item), (err, stat) => {
if (stat.isFile()) {
console.log(item, "文件");
} else if (stat.isDirectory()) {
console.log(item, "目录");
}
});
});
// ------------------------------
// 删除目录
fs.rmdir(path.join(__dirname, "abc"), (err) => {
console.log(err);
});
fs.rmdirSync(path.join(__dirname, "qqq"));
包
多个模块可以形成包,不过要满足特定的规则才能形成规范的包
全球最大的模块生态系统,里面所有的模块都是开源免费的;也是Node.js的包管理工具。
包的安装方式
- 全局安装
- 本地安装
解决npm安装包被墙的问题
- --registry npm config set registry=https//registry.npm.taobao.org
- cnpm 淘宝NPM镜像,与官方NPM的同步频率目前为10分钟一次 官网: npm.taobao.org/ npm install -g cnpm –registry=https//registry.npm.taobao.org 使用cnpm安装包: cnpm install 包名
- nrm 作用:修改镜像源 项目地址:www.npmjs.com/package/nrm 安装:npm install -g nrm
npm常用命令
-
安装包 npm install package_name@version
-
更新包 npm update package_name@version
-
卸载包 npm uninstall package_name@version
-
save (向生产环境添加依赖 dependencies)
-
save-dev (向开发环境添加的依赖 devDependencies)
yarn基本命令
- 类比npm基本使用
自定义包
包的规范
- package.json必须在包的顶层目录下
- 二进制文件应该在bin目录下
- JavaScript代码应该在lib目录下
- 文档应该在doc目录下
- 单元测试应该在test目录下
package.json字段分析
- name:包的名称,必须是唯一的,由小写英文字母、数字和下划线组成,不能包含空格
- description:包的简要说明
- version:符合语义化版本识别规范的版本字符串
- keywords:关键字数组,通常用于搜索
- maintainers:维护者数组,每个元素要包含name、email(可选)、web(可选)字段
- contributors:贡献者数组,格式与maintainers相同。包的作者应该是贡献者数组的第一- 个元素
- bugs:提交bug的地址,可以是网站或者电子邮件地址
- licenses:许可证数组,每个元素要包含type(许可证名称)和url(链接到许可证文本的- 地址)字段
- repositories:仓库托管地址数组,每个元素要包含type(仓库类型,如git)、url(仓- 库的地址)和path(相对于仓库的路径,可选)字段
- dependencies:生产环境包的依赖,一个关联数组,由包的名称和版本号组成
- devDependencies:开发环境包的依赖,一个关联数组,由包的名称和版本号组成