vite
vite
vite的特性
快
生产环境下,本地开发服务器使用的原生的esmodule
,在打包node_modules
中的package
时用的esbuild
(用go写的,速度很快)
开箱即用
vite很多配置都是预配置的,你甚至可以不用配置就能使用
插件
与rollup共享插件
插件
由于vite的打包用的是rollup
,因此vite可以使用rollup的插件。在写插件的之前需要注意这个插件是不是没有用到vite独特的配置项,如果没有,那么你应该写的是一个rollup
插件
常见的hooks
首先需要了解hooks
这个概念,在rollup
中打包分成好几个阶段,如图所示:
每一个阶段都可以理解成一个hook
,我们可以在每一个hook
对打包流程进行相应的处理。这个图可以理解为从入口文件出发,每个import
的包都进行resolveId
,然后load
被resolve的包,load
主要用于加载操作,可以是读取文件也可以是virtual module
, load完成了之后,对其进行transform
,transform
是最常用的,用于对模块就行改写。
还有一部分hooks
是在文件写入的时候进行的
比较常见的应该是resolveImportMeta
, 是对i
的扩展,像vite中的i
,i
都可以用resolveImportMeta
实现
try it
这个案例是histoire
中custom block
的实现
plugins.push({
name: 'histoire-vue-docs-block',
transform (code, id) {
if (!id.includes('?vue&type=docs')) return
if (!id.includes('lang.md')) return
const file = id.substring(0, id.indexOf('?vue'))
const html = md.render(code, {
file,
})
return `export default Comp => {
Comp.doc = ${JSON.stringify(html)}
}`
},
})
虽然没有看过vue sfc
插件的实现,但是大概能看出来,vue sfc
会把<docs></docs>
转换成import
一个模块的方式,不然也能通过transform
获取到。然后该模块的id大概是:原.vue文件的id加上?vue&type=docs
如果custom block
是<docs lang='md'></docs>
,那么还会加上&lang.md
。