mirror of https://github.com/halo-dev/halo
refactor: optimize global libs filenames for better cache hit rates (#7530)
#### What type of PR is this? /area ui /kind improvement /milestone 2.21.x #### What this PR does / why we need it: Optimize the file suffixes of global dependencies by using content hashes instead of random strings. This ensures that when dependencies do not change, the output filenames remain the same after building, resulting in better cache utilization. #### Does this PR introduce a user-facing change? ```release-note 优化 Console 的全局依赖文件名,以获得更好的缓存利用率。 ```pull/7531/head
parent
2332e09ead
commit
2469043248
|
@ -145,7 +145,6 @@
|
||||||
"prettier": "^2.8.8",
|
"prettier": "^2.8.8",
|
||||||
"prettier-plugin-organize-imports": "^4.1.0",
|
"prettier-plugin-organize-imports": "^4.1.0",
|
||||||
"prettier-plugin-tailwindcss": "^0.1.13",
|
"prettier-plugin-tailwindcss": "^0.1.13",
|
||||||
"randomstring": "^1.2.3",
|
|
||||||
"rollup-plugin-gzip": "^3.1.0",
|
"rollup-plugin-gzip": "^3.1.0",
|
||||||
"sass-embedded": "^1.82.0",
|
"sass-embedded": "^1.82.0",
|
||||||
"start-server-and-test": "^1.14.0",
|
"start-server-and-test": "^1.14.0",
|
||||||
|
|
|
@ -330,9 +330,6 @@ importers:
|
||||||
prettier-plugin-tailwindcss:
|
prettier-plugin-tailwindcss:
|
||||||
specifier: ^0.1.13
|
specifier: ^0.1.13
|
||||||
version: 0.1.13(prettier@2.8.8)
|
version: 0.1.13(prettier@2.8.8)
|
||||||
randomstring:
|
|
||||||
specifier: ^1.2.3
|
|
||||||
version: 1.2.3
|
|
||||||
rollup-plugin-gzip:
|
rollup-plugin-gzip:
|
||||||
specifier: ^3.1.0
|
specifier: ^3.1.0
|
||||||
version: 3.1.0(rollup@4.28.1)
|
version: 3.1.0(rollup@4.28.1)
|
||||||
|
@ -5202,10 +5199,6 @@ packages:
|
||||||
resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
|
resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
|
||||||
array-uniq@1.0.2:
|
|
||||||
resolution: {integrity: sha512-GVYjmpL05al4dNlKJm53mKE4w9OOLiuVHWorsIA3YVz+Hu0hcn6PtE3Ydl0EqU7v+7ABC4mjjWsnLUxbpno+CA==}
|
|
||||||
engines: {node: '>=0.10.0'}
|
|
||||||
|
|
||||||
array.prototype.map@1.0.6:
|
array.prototype.map@1.0.6:
|
||||||
resolution: {integrity: sha512-nK1psgF2cXqP3wSyCSq0Hc7zwNq3sfljQqaG27r/7a7ooNUnn5nGq6yYWyks9jMO5EoFQ0ax80hSg6oXSRNXaw==}
|
resolution: {integrity: sha512-nK1psgF2cXqP3wSyCSq0Hc7zwNq3sfljQqaG27r/7a7ooNUnn5nGq6yYWyks9jMO5EoFQ0ax80hSg6oXSRNXaw==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
@ -8965,16 +8958,9 @@ packages:
|
||||||
ramda@0.29.0:
|
ramda@0.29.0:
|
||||||
resolution: {integrity: sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==}
|
resolution: {integrity: sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==}
|
||||||
|
|
||||||
randombytes@2.0.3:
|
|
||||||
resolution: {integrity: sha512-lDVjxQQFoCG1jcrP06LNo2lbWp4QTShEXnhActFBwYuHprllQV6VUpwreApsYqCgD+N1mHoqJ/BI/4eV4R2GYg==}
|
|
||||||
|
|
||||||
randombytes@2.1.0:
|
randombytes@2.1.0:
|
||||||
resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
|
resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
|
||||||
|
|
||||||
randomstring@1.2.3:
|
|
||||||
resolution: {integrity: sha512-3dEFySepTzp2CvH6W/ASYGguPPveBuz5MpZ7MuoUkoVehmyNl9+F9c9GFVrz2QPbM9NXTIHGcmJDY/3j4677kQ==}
|
|
||||||
hasBin: true
|
|
||||||
|
|
||||||
range-parser@1.2.1:
|
range-parser@1.2.1:
|
||||||
resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
|
resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
|
||||||
engines: {node: '>= 0.6'}
|
engines: {node: '>= 0.6'}
|
||||||
|
@ -16297,24 +16283,24 @@ snapshots:
|
||||||
|
|
||||||
'@types/babel__core@7.20.5':
|
'@types/babel__core@7.20.5':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/parser': 7.26.3
|
'@babel/parser': 7.27.5
|
||||||
'@babel/types': 7.26.3
|
'@babel/types': 7.27.6
|
||||||
'@types/babel__generator': 7.6.7
|
'@types/babel__generator': 7.6.7
|
||||||
'@types/babel__template': 7.4.4
|
'@types/babel__template': 7.4.4
|
||||||
'@types/babel__traverse': 7.20.4
|
'@types/babel__traverse': 7.20.4
|
||||||
|
|
||||||
'@types/babel__generator@7.6.7':
|
'@types/babel__generator@7.6.7':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/types': 7.26.3
|
'@babel/types': 7.27.6
|
||||||
|
|
||||||
'@types/babel__template@7.4.4':
|
'@types/babel__template@7.4.4':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/parser': 7.26.3
|
'@babel/parser': 7.27.5
|
||||||
'@babel/types': 7.26.3
|
'@babel/types': 7.27.6
|
||||||
|
|
||||||
'@types/babel__traverse@7.20.4':
|
'@types/babel__traverse@7.20.4':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/types': 7.26.3
|
'@babel/types': 7.27.6
|
||||||
|
|
||||||
'@types/body-parser@1.19.5':
|
'@types/body-parser@1.19.5':
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -17367,8 +17353,6 @@ snapshots:
|
||||||
|
|
||||||
array-union@2.1.0: {}
|
array-union@2.1.0: {}
|
||||||
|
|
||||||
array-uniq@1.0.2: {}
|
|
||||||
|
|
||||||
array.prototype.map@1.0.6:
|
array.prototype.map@1.0.6:
|
||||||
dependencies:
|
dependencies:
|
||||||
call-bind: 1.0.7
|
call-bind: 1.0.7
|
||||||
|
@ -20069,7 +20053,7 @@ snapshots:
|
||||||
|
|
||||||
jest-worker@26.6.2:
|
jest-worker@26.6.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.14.2
|
'@types/node': 18.19.34
|
||||||
merge-stream: 2.0.0
|
merge-stream: 2.0.0
|
||||||
supports-color: 7.2.0
|
supports-color: 7.2.0
|
||||||
|
|
||||||
|
@ -21613,17 +21597,10 @@ snapshots:
|
||||||
|
|
||||||
ramda@0.29.0: {}
|
ramda@0.29.0: {}
|
||||||
|
|
||||||
randombytes@2.0.3: {}
|
|
||||||
|
|
||||||
randombytes@2.1.0:
|
randombytes@2.1.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
safe-buffer: 5.2.1
|
safe-buffer: 5.2.1
|
||||||
|
|
||||||
randomstring@1.2.3:
|
|
||||||
dependencies:
|
|
||||||
array-uniq: 1.0.2
|
|
||||||
randombytes: 2.0.3
|
|
||||||
|
|
||||||
range-parser@1.2.1: {}
|
range-parser@1.2.1: {}
|
||||||
|
|
||||||
raw-body@2.5.1:
|
raw-body@2.5.1:
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
import randomstring from "randomstring";
|
import crypto from "node:crypto";
|
||||||
|
import fs from "node:fs";
|
||||||
|
import path from "node:path";
|
||||||
import type { HtmlTagDescriptor } from "vite";
|
import type { HtmlTagDescriptor } from "vite";
|
||||||
import { viteExternalsPlugin as ViteExternals } from "vite-plugin-externals";
|
import { viteExternalsPlugin as ViteExternals } from "vite-plugin-externals";
|
||||||
import { createHtmlPlugin as VitePluginHtml } from "vite-plugin-html";
|
import { createHtmlPlugin as VitePluginHtml } from "vite-plugin-html";
|
||||||
|
@ -19,77 +21,80 @@ export const setupLibraryExternal = (
|
||||||
baseUrl: string,
|
baseUrl: string,
|
||||||
entry: string
|
entry: string
|
||||||
) => {
|
) => {
|
||||||
const staticSuffix = randomstring.generate({
|
|
||||||
length: 8,
|
|
||||||
charset: "hex",
|
|
||||||
});
|
|
||||||
|
|
||||||
const staticTargets: Target[] = [
|
const staticTargets: Target[] = [
|
||||||
{
|
{
|
||||||
src: `./node_modules/vue/dist/vue.global${
|
src: `./node_modules/vue/dist/vue.global${
|
||||||
isProduction ? ".prod" : ""
|
isProduction ? ".prod" : ""
|
||||||
}.js`,
|
}.js`,
|
||||||
dest: "assets/vue",
|
dest: "assets/vue",
|
||||||
rename: `vue.global.${staticSuffix}.js`,
|
rename: `vue.[hash].js`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
src: `./node_modules/vue-router/dist/vue-router.global${
|
src: `./node_modules/vue-router/dist/vue-router.global${
|
||||||
isProduction ? ".prod" : ""
|
isProduction ? ".prod" : ""
|
||||||
}.js`,
|
}.js`,
|
||||||
dest: "assets/vue-router",
|
dest: "assets/vue-router",
|
||||||
rename: `vue-router.global.${staticSuffix}.js`,
|
rename: `vue-router.[hash].js`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
src: "./node_modules/axios/dist/axios.min.js",
|
src: "./node_modules/axios/dist/axios.min.js",
|
||||||
dest: "assets/axios",
|
dest: "assets/axios",
|
||||||
rename: `axios.${staticSuffix}.js`,
|
rename: `axios.[hash].js`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
src: `./node_modules/vue-demi/lib/index.iife.js`,
|
src: `./node_modules/vue-demi/lib/index.iife.js`,
|
||||||
dest: "assets/vue-demi",
|
dest: "assets/vue-demi",
|
||||||
rename: `vue-demi.${staticSuffix}.js`,
|
rename: `vue-demi.[hash].js`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
src: "./node_modules/@vueuse/shared/index.iife.min.js",
|
src: "./node_modules/@vueuse/shared/index.iife.min.js",
|
||||||
dest: "assets/vueuse",
|
dest: "assets/vueuse",
|
||||||
rename: `vueuse.shared.iife.${staticSuffix}.js`,
|
rename: `vueuse.shared.[hash].js`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
src: "./node_modules/@vueuse/core/index.iife.min.js",
|
src: "./node_modules/@vueuse/core/index.iife.min.js",
|
||||||
dest: "assets/vueuse",
|
dest: "assets/vueuse",
|
||||||
rename: `vueuse.core.iife.${staticSuffix}.js`,
|
rename: `vueuse.core.[hash].js`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
src: "./node_modules/@vueuse/components/index.iife.min.js",
|
src: "./node_modules/@vueuse/components/index.iife.min.js",
|
||||||
dest: "assets/vueuse",
|
dest: "assets/vueuse",
|
||||||
rename: `vueuse.components.iife.${staticSuffix}.js`,
|
rename: `vueuse.components.[hash].js`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
src: "./node_modules/@vueuse/router/index.iife.min.js",
|
src: "./node_modules/@vueuse/router/index.iife.min.js",
|
||||||
dest: "assets/vueuse",
|
dest: "assets/vueuse",
|
||||||
rename: `vueuse.router.iife.${staticSuffix}.js`,
|
rename: `vueuse.router.[hash].js`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
src: "./node_modules/@halo-dev/components/dist/halo-components.iife.js",
|
src: "./node_modules/@halo-dev/components/dist/halo-components.iife.js",
|
||||||
dest: "assets/components",
|
dest: "assets/components",
|
||||||
rename: `halo-components.iife.${staticSuffix}.js`,
|
rename: `components.[hash].js`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
src: "./node_modules/@halo-dev/console-shared/dist/halo-console-shared.iife.js",
|
src: "./node_modules/@halo-dev/console-shared/dist/halo-console-shared.iife.js",
|
||||||
dest: "assets/console-shared",
|
dest: "assets/console-shared",
|
||||||
rename: `halo-console-shared.iife.${staticSuffix}.js`,
|
rename: `console-shared.[hash].js`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
src: "./node_modules/@halo-dev/richtext-editor/dist/rich-text-editor.iife.js",
|
src: "./node_modules/@halo-dev/richtext-editor/dist/rich-text-editor.iife.js",
|
||||||
dest: "assets/richtext-editor",
|
dest: "assets/editor",
|
||||||
rename: `halo-rich-text-editor.iife.${staticSuffix}.js`,
|
rename: `editor.[hash].js`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
src: "./node_modules/@halo-dev/api-client/dist/halo-api-client.iife.js",
|
src: "./node_modules/@halo-dev/api-client/dist/halo-api-client.iife.js",
|
||||||
dest: "assets/api-client",
|
dest: "assets/api-client",
|
||||||
rename: `halo-api-client.iife.${staticSuffix}.js`,
|
rename: `api-client.[hash].js`,
|
||||||
},
|
},
|
||||||
];
|
].map((target) => {
|
||||||
|
return {
|
||||||
|
...target,
|
||||||
|
rename: `${target.rename.replace(
|
||||||
|
"[hash]",
|
||||||
|
computeLibraryHash(target.src)
|
||||||
|
)}`,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
const injectTags = staticTargets
|
const injectTags = staticTargets
|
||||||
.map((target) => {
|
.map((target) => {
|
||||||
|
@ -132,3 +137,8 @@ export const setupLibraryExternal = (
|
||||||
}),
|
}),
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function computeLibraryHash(file: string) {
|
||||||
|
const content = fs.readFileSync(path.resolve(process.cwd(), file), "utf8");
|
||||||
|
return crypto.createHash("md5").update(content).digest("hex").substring(0, 8);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue