node 中使用import export
只需把 js 文件后缀改成 .mjs
就能使用import
export
的写法。
1、测试某个路径下文件是否存在,不存在则创建目录
import fs from "fs";
/**
* 测试某个路径下文件是否存在,不存在则创建目录
* @param {*} src 源目录路径
* @param {*} dst 目标目录路径
* @param {*} callback 回调函数(源目录、目标目录路径会作为参数传入)
*/
export const exists = function (src, dst, callback) {
fs.exists(dst, function (exists) {
if (exists) {
callback?.(src, dst);
} else {
fs.mkdir(dst, function () {
//创建目录
callback?.(src, dst);
});
}
});
};
2、复制文件夹目录以及里面的文件。
使用场景:当下载接口内容存在固定文件,又存在部分文件是根据传参内容生成时,需要新增一个文件夹(文件夹名称可以加上时间戳来区分,防止同时点击下载时被覆盖),再将固定文件复制到新增文件夹下。然后将自定义文件写入新增文件夹内。最后下载。
import fs from "fs";
var stat = fs.stat;
/**
* 复制目录下的内容
* @param {*} src 源目录地址
* @param {*} dst 拷贝到的位置
*/
export const copy = function (src, dst) {
//读取目录
fs.readdir(src, function (err, paths) {
if (err) {
throw err;
}
paths.forEach(function (path) {
var _src = src + "/" + path;
var _dst = dst + "/" + path;
var readable;
var writable;
stat(_src, function (err, st) {
if (err) {
throw err;
}
if (st.isFile()) {
readable = fs.createReadStream(_src); //创建读取流
writable = fs.createWriteStream(_dst); //创建写入流
readable.pipe(writable);
} else if (st.isDirectory()) {
exists(_src, _dst, copy);
}
});
});
});
};
使用:
import { exists, copy } from"./util.mjs";
exists("./sourcePath", "./targetPath", copy);
3、删除指定路径下的所有文件夹和文件
import fs from "fs";
export const rmFileAndDir = function (path) {
const files = fs.readdirSync(path);
files.forEach((file) => {
const filePath = `${path}/${file}`;
const stats = fs.statSync(filePath);
if (stats.isDirectory()) {
rmFileAndDir(filePath);
} else {
fs.unlinkSync(filePath);
// console.log(`删除${file}文件成功`);
}
});
fs.rmdirSync(path);
};
4、压缩文件
使用场景:下载接口,下载多个文件时。
用到archiver包,其中 zlib 参数有很多,这里列出两个解释。
level:压缩级别,值在0-9之间,1速度最快,9压缩比最大.
memLevel:指定多少内存应该内部压缩状态进行分配,1是最小内存速度慢压缩比低。9是最大内存,速度最快。默认值为8。
import archiver from "archiver";
function compressFolder(sourcePath, zipFilePath) {
return new Promise((resolve, reject) => {
//压缩文件start
const archiveObject = archiver("zip", {
zlib: { level: 9 }, // 设置压缩级别
});
const output = fs.createWriteStream(zipFilePath); // 先创建一个可写流,用于传入压缩包数据
archiveObject.pipe(output); // 使用pipe将两个流连接,开始写压缩包数据
archiveObject.directory(sourcePath, false); // 第一个参数是源目录路径,第二个参数是压缩目录路径
output.on("close", async function () {
console.log("close");
resolve();
});
// 使用finalize进行压缩
// “close”、“end”或“finish”可能在调用此方法后立即被触发,因此请预先向它们注册
archiveObject.finalize();
//压缩文件end
});
}
5、睡眠
// 睡眠
export function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
使用配合 async 、await
// 我的函数
async function downloadPage(req, response, pageFile, pageName = "index") {
//...
await sleep(50); //这里要等一下再继续,不然下载下来的文件会出现损坏情况
//...
}
6、数组格式转树状结构
利用对象属性唯一特性,以下为高效写法。
/**
* 数组格式转树状结构
* @param {array} array
* @param {String} id
* @param {String} pid
* @param {String} children
* @return {Array}
*/
export function arrayToTree(
array,
id = "id",
pid = "pid",
children = "children"
) {
let data = JSON.parse(JSON.stringify(array));
let result = [];
let hash = {};
data.forEach((item, index) => {
hash[data[index][id]] = data[index];
});
data.forEach((item) => {
let hashVP = hash[item[pid]];
if (hashVP) {
!hashVP[children] && (hashVP[children] = []);
hashVP[children].push(item);
} else {
result.push(item);
}
});
return result;
}
欢迎评论交流
❤️ 更多前端知识欢迎关注公众号交流
❤️ 这里有你想知道的web前端知识