Nodejs
下载
下载地址
node 是什么
node.js 是一个开源的,跨平台的 JavaScript 运行环境
运行 js 文件
node 文件.js
nodemon 监听文件变化
npm i nodemon -g
nodemon 文件名
全局变量
global globalThis
node 中顶级对象为 global ,也可以使用 globalThis 访问顶级对象
__dirname
当前文件夹目录
console.log(__dirname); // `D:\node\src`
__filename
当前文件位置
console.log(__filename); // 'D:\node\src\fs.js'
定时器
console
process
它用于描述当前 Node.js 进程状态的对象,提供了一个与操作系统的简单接口。
Buffer (缓冲区)
用来创建一个专门存放二进制数据的缓存区
创建 Buffer 类
- Buffer.alloc(size[, fill[, encoding]]): 返回一个指定大小的 Buffer 实例,如果没有设置 fill,则默认填满 0
- Buffer.allocUnsafe(size): 返回一个指定大小的 Buffer 实例,但是它不会被初始化,所以它可能包含敏感的数据
- Buffer.from(array): 返回一个被 array 的值初始化的新的 + Buffer 实例(传入的 array 的元素只能是数字,不然就会自动被 0 覆盖)
- Buffer.from(arrayBuffer[, byteOffset[, length]]): 返回一个新建的与给定的 ArrayBuffer 共享同一内存的 Buffer。
- Buffer.from(buffer): 复制传入的 Buffer 实例的数据,并返回一个新的 Buffer 实例
- Buffer.from(string[, encoding]): 返回一个被 string 的值初始化的新的 Buffer 实例
const buf1 = Buffer.alloc(10);
const buf2 = Buffer.allocUnsafe(10);
const buf3 = Buffer.from([1, 2, 3]);
const buf4 = Buffer.from("tést");
const buf5 = Buffer.from("tést", "latin1");
- Buffer 转换为 JSON 对象
- Buffer 转换为 string
buf.toJSON();
buf.toString();
fs 文件系统
writeFile 异步写入
fs.writeFile(file, data[, options], callback)
参数
- file - 文件名或文件描述符。
- data - 要写入文件的数据,可以是 String(字符串) 或 Buffer(缓冲) 对象。
- options - 该参数是一个对象,包含 {encoding, mode, flag}。默认编码为 utf8, 模式为 0666 , flag 为 ‘w’
- callback - 回调函数,回调函数只包含错误信息参数(err),在写入失败时返回。
flag
Flag | 描述 |
---|---|
r | 以读取模式打开文件。如果文件不存在抛出异常。 |
w | 以写入模式打开文件,如果文件不存在则创建。 |
a | 以追加模式打开文件,如果文件不存在则创建。 |
… | … |
const fs = require("fs");
fs.writeFile("./test.txt", "xr", (err) => {
// err 错误对象 成功 为 null
if (err) return console.log("写入失败", err);
console.log("写入成功");
});
writeFileSync 同步写入
fs.writeFileSync("./test.txt", "writeFileSync");
appendFile
\r\n
写入换行
fs.appendFile("./test.txt", "\r\n追加appendFile", (err) => {
if (err) return console.log("追加失败", err);
console.log("追加成功");
});
appendFileSync
fs.appendFileSync("./test.txt", "append");
readFile
fs.readFile("./test.txt", (err, data) => {
if (err) return console.log("读取失败", err);
// data 是一个 Buffer
// 使用 toString 方法,把 Buffer 转换为字符串
console.log(data.toString());
});
readFileSync
const data = fs.readFileSync("./test.txt");
rename 文件重命名和移动
fs.rename("./test.txt", "./testrename.txt", (err) => {
if (err) return console.log("重命名失败", err);
console.log("成功");
});
unlink rm 删除文件
fs.unlink("./testrename.txt", (err) => {
if (err) return console.log("删除失败", err);
console.log("成功");
});
fs.rm("./test2.txt", (err) => {
if (err) return console.log("删除失败", err);
console.log("成功");
});
Stream(流)
Stream 有四种流类型:
- Readable - 可读操作。
- Writable - 可写操作。
- Duplex - 可读可写操作.
- Transform - 操作被写入数据,然后读出结果。
Stream 常用的事件:
- data - 当有数据可读时触发。
- end - 没有更多的数据可读时触发。
- error - 在接收和写入过程中发生错误时触发。
- finish - 所有数据已被写入到底层系统时触发。
写入流 createWriteStream
// 创建写入流对象
const ws = fs.createWriteStream("./test.txt");
// 写
ws.write("createWriteStream\n");
ws.write("createWriteStream");
// 关闭通道,可不写
wx.close();
读取流 createReadStream
const rs = fs.createReadStream("./test.txt");
rs.on("data", (chunk) => {
// chunk 读取的数据流,分段读取
console.log(chunk);
});
rs.on("end", () => {
console.log("读取完成");
});
流式操作
const rs = fs.createReadStream("./test.txt");
const ws = fs.createWriteStream("./test2.txt");
rs.on("data", (chunk) => {
wx.write(chunk);
});
mkdir 创建文件夹
fs.mkdir("./view", (err) => {
if (err) return console.log("创建失败", err);
console.log("成功");
});
递归创建文件夹
fs.mkdir("./pages/login", { recursive: true }, (err) => {
if (err) return console.log("创建失败", err);
console.log("成功");
});
readdir 读取文件夹
fs.readdir("./", (err, files) => {
if (err) return console.log("读取失败", err);
// files 文件夹/文件列表
console.log("成功", files);
});
rmdir rm 删除文件夹
fs.rmdir("./pages", (err) => {
if (err) return console.log("删除失败", err);
console.log("成功");
});
递归删除文件夹 rmdir rm
fs.rm("./pages", { recursive: true }, (err) => {
if (err) return console.log("删除失败", err);
console.log("成功");
});
stat 查看资源状态
fs.stat("./test.txt", (err, data) => {
if (err) return console.log(err);
console.log(`是文件${data.isFile()}`); // 返回布尔值
console.log(`是文件${data.isDirectory()}`); // 返回布尔值
});
path 模块
join
const path = require("path");
console.log(path.join("a", "b", "./c", "/d", "..", "e"));
console.log(path.join("a", "b", "./c", "../"));
console.log(path.join("a", "b", "./c", ".."));
.. 切换上一级目录
a\b\c\e
a\b\
a\b
basename
const path = require("path");
const fpath = "a/b.js";
console.log(path.basename(fpath));
console.log(path.basename(fpath, ".js"));
b.js;
b;
extname
const path = require("path");
const fpath = "a/b.js";
console.log(path.extname(fpath));
.js
resolve
给定的路径序列是从右到左处理的 每个后续 path 路径都在前面,直到构造出绝对路径
如果没有 path 传递段,path.resolve()将返回当前工作目录的绝对路径
console.log(path.resolve("/a", "b", "/c"));
console.log(path.resolve("/a", "b", "c"));
D:\c
D:\a\b\c
模块化
// b.js 向外导出多个
exports.a = "aa";
exports.b = "bb";
// a.js 接收
let aExports = require("./b");
console.log(aExports); // 是个对象 { a: 'aa', b: 'bb' }
// b.js 向外导出多个还可以使用 module.exports
module.exports = {
a: "aa",
b() {
console.log("bb");
},
};
// a.js 接收
let aExports = require("./b");
console.log(aExports); // 是个对象 { a: 'aa', b: [Function: b] }
Node 包管理工具
查看 npm 安装位置
npm root -g
查看版本
npm --version
npm -v
查看 npm 源地址
npm config list
查看当前镜像源
npm config get registry
更改镜像源
npm config set registry https://registry.npm.taobao.org
初始化 package.json
npm init
npm init -y
安装包
npm install dayjs -D --save-dev 开发环境
npm install dayjs -S --save 生产环境
npm install dayjs -g --global 全局安装
npm install jquery@1.11.1
卸载包
npm uninstall dayjs
npm remove dayjs -g
更新包
npm update
nvm
nvm 是一个 nodejs 的版本管理工具
下载地址
https://github.com/coreybutler/nvm-windows/releases
下载 nvm-setup.zip
查看本地安装的所有版本 有可选参数 available 显示所有可下载的版本
nvm list [available]
安装不同的版本
nvm install 18.10.0
使用指定版本
nvm use 18.10.0
下载指定版本
nvm uninstall 18.10.0
开启 node.js 版本管理
nvm on
关闭 node.js 版本管理
nvm off
配置 nvm 镜像
在安装目录下 settings 文件中新增如下两行
node_mirror: https://npm.taobao.org/mirrors/node/
npm_mirror: https://npm.taobao.org/mirrors/npm/
nrm
nrm(npm registry manager )是 npm 的镜像源管理工具 快速地在 npm 源间切换
安装
npm install -g nrm
查看可选源列表
nrm ls
查看当前使用源
nrm current
切换源
nrm use taobao
添加源
nrm add
registry 为源名,url 为源地址,nrm add aaa https://aaa.com
删除源
nrm del
测试源速度(响应时间)
nrm test
nrm test
nrm 查看源不带星解决方案
nrm/cli.js
大约 211 行代码 把 && 改为 ||
if (
hasOwnProperty(customRegistries, name) &&
(name in registries || customRegistries[name].registry === registry.registry)
) {
registry[FIELD_IS_CURRENT] = true;
customRegistries[name] = registry;
}
修改如下
if (
hasOwnProperty(customRegistries, name) ||
name in registries ||
customRegistries[name].registry === registry.registry
) {
registry[FIELD_IS_CURRENT] = true;
customRegistries[name] = registry;
}
npx
npx 是 npm5.2 之后发布的一个命令
npx 是为了解决什么
针对 node_modules 目录下.bin 下的可执行文件,如果是项目安装而非全局安装,使用时会非常麻烦,npx 帮助解决这个问题
sequelize-cli 管理数据库
使用的时候需要这样子调用
./node_modules/.bin/sequelize-cli db:seed:all
使用 npx
npx sequelize-cli db:seed:all