VitePress打包报错
VitePress 打包报错
打包报错,提示 Error: Missing "./preload-helper" export in "vite" package
解决的方法 1

搜索 vite/preload-helper 替换为 \0vite/preload-helper

解决的方法 2
书写 vite 插件处理
// 自定义vite插件,处理vitepress打包 missing './preload-helper' 错误
{
apply: 'build',
enforce: 'pre',
resolveId(id) {
if (id.includes('vite/preload-helper')) return 'vite/preload-helper';
},
},
原理:
因为在源码中使用了动态的import加载,所以实际被解析为存在的模块,编码为\x00vite/preload-helper,但是实际 'vite/preload-helper' 为虚拟模块,应该编码为编码为/@vite/preload-helper\x00vite/preload-helper,所以导致解码回来时解析错误,造成打包错误 Error: Missing "./preload-helper" export in "vite" package
resolveId钩子 用于处理模块路径, 在vite中, 我们可以在代码中, 引入一个不存在的模块路径, 而在resolveId钩子可以获得改路径, 然后对于该路径进行处理, 举个例子, 我们可以在这个钩子中自己实现vite resolve.alias的功能.
resolveId(id) {
if (id.startsWith('@/')) {
const base = path.resolve(process.cwd(), 'src')
return id.replace(/@/,base)
}
},
load钩子 常用于加载虚拟模块, 如何理解这个虚拟模块呢, 也就是, 我们在代码中引入一个不存在的模块路径, 比如import msg from 'virtual:test-module', 按vite文档所说, 我们需要先在上面的resolveId钩子中, 在该路径加上一个\0为前缀.
这是一个来自
Rollup生态系统的惯例。这可以防止其他插件试图处理这个ID(如节点解析),而像sourcemap这样的核心功能可以使用这些信息来区分虚拟模块和普通文件。\0在导入的URL中不是一个允许的字符,所以我们必须在导入分析中替换它们。在浏览器中,一个0{id}的虚拟ID最终被编码为/@id/x00{id}。在进入插件处理管道之前,这个ID会被解码回来。所以这个过程在插件钩子代码中将是不可见的.
转载自:https://juejin.cn/post/7271058595445030971