最近在尝试做vue3.0的服务端渲染,自己也写了一些相关的插件,其中用到一些指令插件的时候,发现在服务端渲染解析的时候会报错,是缺少transform方法导致的,后面经过大佬指点,发现自定义指令的服务端transform方法是要自定义的,不然运行打包都会报Custom directive is missing corresponding SSR transform and will be ignored。
解决方案:
本人用的是vite,所以解法如下,在配置文件中传入自定义指令的服务端transform。
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
export const ssrTransformCustomDir = () => {
return {
props: [],
needRuntime: true
}
}
export default defineConfig({
plugins: [vue(
{
template: {
ssr: true,
compilerOptions: {
directiveTransforms: {
'img-lazy-load': ssrTransformCustomDir,
'rescroll': ssrTransformCustomDir
}
}
}
}
)],
})
对于内置了mounted等这些生命钩子的函数,要把needRuntime置为true,否则客户端接管后,不会触发。
想深入了解的同学可以去阅读vue3.0 compile的源码。
比如官方v-show的transform。
项目demo
自定义插件(欢迎加入造轮子)
官方issure
自定义CompilerOptions源码出处
对于使用者来说,总感觉有点复杂,以后应该会调整吧,目前暂时此解。