问题难点
在构建Vue.js应用时,客户端渲染(CSR)存在SEO不友好、首屏加载慢、白屏时间长等问题。服务端渲染(SSR)可以有效解决这些问题,但同时也带来了开发约束、构建配置复杂、服务器性能开销等挑战。
解决方案
采用Vue SSR技术栈,通过在服务端渲染完整的HTML页面,然后在客户端激活为可交互应用。
核心实现代码
// server.js - 服务端渲染入口constexpress=require('express');const{createBundleRenderer}=require('vue-server-renderer');constfs=require('fs');constpath=require('path');constapp=express();// 创建渲染器functioncreateRenderer(bundle,options){returncreateBundleRenderer(bundle,{runInNewContext:false,template:fs.readFileSync(path.resolve('./index.template.html'),'utf-8'),clientManifest:options.clientManifest,basedir:options.basedir});}// SSR渲染app.get('*',(req,res)=>{constcontext={url:req.url};renderer.renderToString(context,(err,html)=>{if(err){if(err.url){res.redirect(err.url);}elseif(err.code===404){res.status(404).send('404 | Page Not Found');}else{res.status(500).send('500 | Internal Server Error');}return;}res.send(html);});});module.exports=app;工具封装
// client/app.js - 客户端入口importVuefrom'vue';importAppfrom'@/App.vue';import{createRouter}from'@/router';import{createStore}from'@/store';import{sync}from'vuex-router-sync';exportfunctioncreateApp(){constrouter=createRouter();conststore=createStore();// 将 router 挂载到 store 中,可以通过 store.state.route 访问sync(store,router);constapp=newVue({router,store,render:h=>h(App)});return{app,router,store};}重难点
- 构建配置复杂,需要分别打包客户端和服务端代码
- 状态管理在服务端和客户端之间同步
- 第三方库兼容性问题(避免使用浏览器特定API)