共计 1978 个字符,预计需要花费 5 分钟才能阅读完成。
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); // 我的项目负责人或者作者