通常在DevOps CICD流水線部署前端項(xiàng)目時竭钝,一般默認(rèn)都要將dist資源打包為zip忽你,并且把zip名稱改為md5sum哈希值(用于文件完整性驗(yàn)證)。
md5sum是什么垢啼?
md5sum
是一個在 Unix 和類 Unix 系統(tǒng)(如 Linux)中廣泛使用的命令行工具抄伍,它主要用于計(jì)算和驗(yàn)證文件的 MD5 哈希值艘刚。MD5(Message-Digest Algorithm 5)是一種廣泛使用的加密哈希函數(shù),可以產(chǎn)生一個128位(16字節(jié))的哈希值(通常以一個32位的十六進(jìn)制數(shù)表示)截珍。md5sum
工具的主要用途包括:
- 文件完整性驗(yàn)證:通過計(jì)算文件的 MD5 哈希值攀甚,可以驗(yàn)證文件在傳輸或存儲過程中是否被篡改。如果文件的 MD5 哈希值在傳輸前后一致岗喉,那么可以認(rèn)為文件在傳輸過程中未被更改秋度。
-
軟件分發(fā):在軟件分發(fā)過程中,開發(fā)者會提供軟件的 MD5 哈希值钱床。用戶下載軟件后荚斯,可以使用
md5sum
計(jì)算下載文件的 MD5 哈希值,并與開發(fā)者提供的哈希值進(jìn)行比較,以確保下載的軟件包完整且未被篡改事期。 -
備份驗(yàn)證:在備份文件或目錄時滥壕,使用
md5sum
可以為每個備份文件生成一個 MD5 哈希值,并保存這些哈希值兽泣。之后绎橘,可以通過重新計(jì)算備份文件的 MD5 哈希值來驗(yàn)證備份的完整性和一致性。 -
數(shù)據(jù)去重:雖然這不是
md5sum
的主要用途唠倦,但由于 MD5 哈希值對于相同的輸入總是產(chǎn)生相同的輸出称鳞,因此可以用于快速檢測數(shù)據(jù)集中的重復(fù)項(xiàng)。然而稠鼻,由于 MD5 的安全性問題(如存在碰撞攻擊)冈止,這種方法在需要高度安全性的場合并不適用。 - 簡單加密:雖然 MD5 并不適合用于加密(因?yàn)樗且粋€單向哈希函數(shù)候齿,無法從哈希值恢復(fù)原始數(shù)據(jù))熙暴,但在某些簡單場景下,MD5 哈希值可以用于生成一種簡單的“密碼”或校驗(yàn)碼毛肋,盡管這種方式的安全性較低怨咪。
Vite對應(yīng)代碼簡單案例:
1,我們使用vite-plugin-zip-pack和crypto插件
npm i vite-plugin-zip-pack -D
npm i crypto -D
2,Vite配置代碼
// vite.config.ts
import fs from "fs";
import path from "path";
import crypto from "crypto";
export default defineConfig({
plugins: [
//...
zipPack({
inDir: "dist",
outDir: "zip/", // zip存放路徑
outFileName: "dist.zip", // 默認(rèn)名稱為dist
done: () => {
// zip路徑
const originPath = "zip/";
const originFilePath = `${originPath}dist.zip`;
// 讀取zip內(nèi)容
const fileContents = fs.readFileSync(originFilePath);
// 創(chuàng)建哈希對象
const hash = crypto.createHash("md5");
// 更新哈希值
hash.update(fileContents);
// 計(jì)算哈希值屋剑,并以16進(jìn)編碼制輸出md5sum
const md5sum = hash.digest("hex");
// 獲取文件擴(kuò)展名
const fileExtension = path.extname(originFilePath);
// 拼接md5新的文件名
const newFileName = `${originPath}${md5sum}${fileExtension}`;
fs.rename(originFilePath, newFileName, (err) => {
if (err) throw err;
console.log("文件已重命名");
// 需要刪除舊包 就加上這句邏輯润匙。不用的話 那就不加了
fs.readdir(originPath, (error, files) => {
if (error) throw error;
(files || []).forEach((element) => {
if (element !== path.basename(newFileName)) {
// 刪除舊zip
fs.unlink(
path.join(originPath, element),
(unlinkErr) => {
if (unlinkErr) throw unlinkErr;
console.log(element + "舊包已刪除");
},
);
}
});
});
});
},
}),
],
});