Vite
绝对于 Webpack
上手难度小,简略的配置,开箱即用。尽管目前生态不如 Webpack
,不过生态也逐步的丰盛起来。
通过了一些 Vite 插件编写实际,明天来说说虚构模块(Virtual Modules ),也顺便介绍下 vite-plugin-project-info 插件。
虚构模块的概念
虚构模块是 Vite
沿用 Rollup
的虚构模块,虚构模块相似 alias
别名,然而模块的内容并非间接从磁盘中读取,而是编译时生成。
虚构模块是一种很实用的模式,使你能够对应用 ESM 语法的源文件传入一些编译时信息。
虚构模块实现例子
首先你可能须要先理解插件编写的 API。
这里间接搬运官网的例子:
export default function myPlugin() { const virtualModuleId = 'virtual:my-module' const resolvedVirtualModuleId = '\0' + virtualModuleId return { name: 'my-plugin', resolveId(id) { if (id === virtualModuleId) { return resolvedVirtualModuleId } }, load(id) { if (id === resolvedVirtualModuleId) { return `export const msg = "from virtual module"` } } }}
而后代码中引入这些模块:
import { msg } from 'virtual:my-module'console.log(msg)
实际剖析: vite-plugin-project-info
<img width="500" src="https://user-images.githubusercontent.com/1954171/182008160-4030aaf4-46e1-4e99-bace-d27ad9a48814.png"/>
vite-plugin-project-info
是 Vite 我的项目信息插件,应用后会在 Conole 面板输入版本、构建工夫等信息。
配合虚构模块实现插件
- resolveId 钩子函数:实在虚构模块 ID 转换为外部虚构模块 ID。
- load 钩子函数:匹配外部虚构模块 ID,并返回编译时的代码,最终实现了
virtual:project-info
模块。 transform 钩子函数:实现主动
import
性能截止第二步其实曾经实现了虚构模块的性能,然而咱们
export default function projectInfoPlugin(opts: ProjectInfoPluginOptions = {}): PluginOption { const { entry = path.resolve('src/main'), locale } = opts; const lastEntry = entry.split('.')[0]; const virtualModuleId = 'virtual:project-info'; const resolvedVirtualModuleId = '\0' + virtualModuleId; return { name: 'vite:project-info', enforce: 'pre', resolveId(id) { if (id === virtualModuleId) { return resolvedVirtualModuleId; } }, load(id) { if (id === resolvedVirtualModuleId) { return createCode({ locale, }); } }, transform(code, id) { if (id.includes(path.resolve(lastEntry).replace(/\\/g, '/'))) { return { code: `import '${virtualModuleId}';\n${code}`, map: this.getCombinedSourcemap(), }; } }, };}
性能应用
反对间接在浏览器 Console 中输入相干我的项目信息,同时反对如下代码应用:
import projectInfo from 'virtual:project-info';console.log(projectInfo.version); // 版本信息console.log(projectInfo.buildTime); // 构建工夫console.log(projectInfo.name); // 项目名称console.log(projectInfo.description); // 我的项目形容console.log(projectInfo.repository); // 仓库链接console.log(projectInfo.author); // 我的项目负责人或者作者