赞
踩
记录一些使用vben
时学习到的新的技巧。
使用 iconify
,是从线上的 Public host 获取图标,当需要本地化(如部署到局域网内),可以借用 purgeIcons
来实现。
对于 vite
有相应的插件 vite-plugin-purge-icons
// vite.config.js
import PurgeIcons from 'vite-plugin-purge-icons';
return {
plugins: [
// ...
PurgeIcons({
content: ['**/*.html', '**/*.js', '**/*.ts', '**/*.vue', '**/*.jsx', '**/*.tsx', '**/*.json'],
})
]
}
这样可以自动提取所有使用到的图标,打包在 '@purge-icons/generated'
下,加在main.js
或者 Icon
组件中即可。
import Iconify from '@purge-icons/generated'; // Icon 组件 const svg = Iconify.renderSVG(icon, {}); if (svg) { // 本地图标 el.textContent = ''; el.appendChild(svg); } else { // 线上图标 const span = document.createElement('span'); span.className = 'iconify'; span.dataset.icon = icon; el.textContent = ''; el.appendChild(span); }
以上是基本的用法,由于purgeIcons
只能检测到拼好的图标,不能检测动态拼接的图标(如 ant-design:
+ alert-outlined
),所以可以借此设定两种图标模式。
PurgeIcons
提取到; (方便部署到局域网内)prefix
+ icon
的格式,让purgeIcons
失效。 (减少打包体积,优化加载体验)将API_URL
写在dotenv
变量里,方便各种环境下的调试。
这需要我们提前预知服务地址,在打包前写好文件。但是在某些情况下,我们未知服务地址,或者前端代码打包后需要更换服务地址,为此重新跑一边打包流程是没有必要的。
所以需要在打包时,通过和window
变量结合,将服务地址放进一个js
文件里,在index.html
中引用。如果需要变更,我们就更改这个js
文件即可,不仅不需要打包,甚至不需要重启部署服务。
在引用服务地址的代码处,我们判断production
模式下,引用window
变量,其他模式则直接用env
变量。
function getAppGlobEnvConfig() {
const ENV_NAME = getConfigFileName(import.meta.env);
const GLOB_ENV = import.meta.env.DEV
? matchGlobEnv(importMetaEnv)
: window[ENV_NAME];
return GLOB_ENV;
}
我们写一个脚本postBuild.ts
,来生成一个app.config.js
文件,利用Object.freeze
技巧来防止修改。
const windowConf = `window.${configName}`;
const configStr = `${windowConf}=${JSON.stringify(config)};
Object.freeze(${windowConf});
Object.defineProperty(window, "${configName}", {
configurable: false,
writable: false,
});
`.replace(/\s/g, '');
fs.mkdirp(getRootPath(OUTPUT_DIR));
writeFileSync(getRootPath(`${OUTPUT_DIR}/app.config.js`), configStr);
在build
脚本之后,执行postBuild.ts
"build": "vite build && esno ./build/script/postBuild.ts"
我们在index.html
中引入生成的app.config.js
,也可以利用构建工具自动注入。
const htmlPlugin = html({ minify: isBuild, inject: { // Inject data into ejs template injectData: { title: VITE_GLOB_APP_TITLE, favicon: `/${isBuild ? '' : 'dev_'}favicon.ico`, }, // Embed the generated app.config.js file tags: isBuild ? [ { tag: 'script', attrs: { src: 'app.config.js', }, }, ] : [], }, });
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。