【前端】从vben中学到的一些工程化技巧

本文介绍了在前端项目中如何选择使用本地图标或在线图标,以及如何实现可更改的API服务地址。通过设置本地和在线两种图标模式,确保在不同环境下图标能正确显示,并讨论了在打包时动态生成服务地址文件,以适应不同环境的需求,避免重复打包。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录一些使用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 服务地址

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',
              },
            },
          ]
        : [],
    },
  });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值