Vite插件学习-01

212 阅读1分钟

Vite插件学习

最近在写移动端组件库时,看了Vant组件库的代码。里面有一个让我很好奇,那就是如何import到没有下载的包的,代码如下 import { config } from 'site-desktop-shared'; 然后我发现这是在Vite配置文件里注册了一个插件,然后吸引了我的注意。

了解vite插件

从vite官方文档了解,vite有通用钩子和单独的钩子,先简单从vant的插件代码看,它使用了两个钩子,resolved(),load(),然后从官方文档中了解到两个钩子都是通用钩子,并且钩子会在每个传入模块请求时被调用 所以这也就是为什么传入的模块并'不存在'也可以import.然后从Rollup文档的resolveId钩子中了解到第一个参数source就是模块的名字,所以我们可以在这个钩子中进行判断,假如存在模块名字,就返回一个改名字特定的名称,然后传给load钩子。Rollup文档的load钩子中写的它的参数id就是resolved返回的名称,拿到名称后来预加载对应的模块。这样目的就达到了。真不戳!又学到了。

看看vant的此段代码

function vitePluginGenVantBaseCode(): PluginOption {
  const virtualMobileModuleId = 'site-mobile-shared';
  const resolvedMobileVirtualModuleId = `vant-cli:${virtualMobileModuleId}`;

  const virtualDesktopModuleId = 'site-desktop-shared';
  const resolvedDesktopVirtualModuleId = `vant-cli:${virtualDesktopModuleId}`;

  const virtualPackageStyleModuleId = /package-style/;
  const resolvedPackageStyleVirtualModuleId = `vant-cli${virtualPackageStyleModuleId}index.${CSS_LANG}`;

  return {
    name: 'vite-plugin(vant-cli):gen-site-base-code',
    resolveId(id) {
      if (id === virtualMobileModuleId) {
        return resolvedMobileVirtualModuleId;
      }

      if (id === virtualDesktopModuleId) {
        return resolvedDesktopVirtualModuleId;
      }

      if (virtualPackageStyleModuleId.test(id)) {
        return resolvedPackageStyleVirtualModuleId;
      }
    },
    load(id) {
      switch (id) {
        case resolvedMobileVirtualModuleId:
          return genSiteMobileShared();
        case resolvedDesktopVirtualModuleId:
          return genSiteDesktopShared();
        case resolvedPackageStyleVirtualModuleId:
          return genPackageStyle();
        default:
          break;
      }
    },
  };
}

下次,继续学习Vite插件,试试写一个这样的插件,打卡下班!美滋滋!