NodeJS常用内置模块 npm包管理工具 nvm版本管理工具 nrm镜像管理工具

Nodejs

下载

下载地址
在这里插入图片描述

常用命令

  • cls 清空命令
  • shift + 右键 在此处代开命令窗口 快速定位到某个目录
  • cd … 出来一层目录
  • cd 目录名,进入到目录名
  • c: 切换盘符
  • mkdir 创建一个目录
  • ctrl + c 停止正在运行的命令
  • 上箭头 打开上一次输入的地址
  • 运行时 node 名字+tab 自动补全名

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

url 模块

旧版

const url = require("url")

url.parse("http://127.0.0.1:3000/users?id=1")
// {
// 	protocol: 'http:',
// 	slashes: true,
// 	auth: null,
// 	host: '127.0.0.1:3000',
// 	port: '3000',
// 	hostname: '127.0.0.1',
// 	hash: null,
// 	search: '?id=1',
// 	query: 'id=1',
// 	pathname: '/users',
// 	path: '/users?id=1',
// 	href: 'http://127.0.0.1:3000/users?id=1'
// }

// query 参数返回对象形式
url.parse("http://127.0.0.1:3000/users?id=1",true)

新版

new URL('http://127.0.0.1:3000/users?id=1')

// {
// 	href: 'http://127.0.0.1:3000/users?id=1',
// 	origin: 'http://127.0.0.1:3000',
// 	protocol: 'http:',
// 	username: '',
// 	password: '',
// 	host: '127.0.0.1:3000',
// 	hostname: '127.0.0.1',
// 	port: '3000',
// 	pathname: '/users',
// 	search: '?id=1',
// 	searchParams: URLSearchParams { 'id' => '1' },
// 	hash: ''
// }

// 获取 id 
new URL('http://127.0.0.1:3000/users?id=1').searchParams.get("id")

querystring 模块

parse

const qs = require('querystring')

const str = 'name=3&id=1'
console.log(qs.parse(str)) // { name: '3', id: '1' }



stringify

const qs = require('querystring')

const obj = { name: '3', id: '1' }
console.log(qs.stringify(obj)) // name=3&id=1

escape 转义特殊字符

const qs = require('querystring')

const str = "name=3&id=1";
console.log(qs.escape(str)); // name%3D3%26id%3D1

unescape

const qs = require('querystring')

const str2 = "name%3D3%26id%3D1";
console.log(qs.unescape(str2)); // name=3&id=1

events 模块

const eventEmitter = require("events");

const event = new eventEmitter();

// 监听事件
event.on("play", (data) => {
	console.log("play", data);
});

// 触发事件
event.emit("play", { name: "xr" });

crypto

md5

const crypto = require("crypto")

const hash = crypto.createHash("md5")

hash.update("xr")

// console.log(hash.digest('hex'))
console.log(hash.digest('base64'))

sha1

const crypto = require("crypto")

const hash = crypto.createHash("sha1")

hash.update("xr")

console.log(hash.digest('hex'))

hmac

const crypto = require("crypto")
										// 密钥
const hash = crypto.createHmac("sha256", "xr")

hash.update("xr")

console.log(hash.digest('hex'))

模块化

// 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

无法加载文件 C:\Users\xiaor\AppData\Roaming\npm\nrm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。所在位置 行:1 字符: 1

  • 开始菜单中搜索 PowerShell 以管理员身份打开
  • 执行:set-ExecutionPolicy RemoteSigned 选择 y

配置 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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值