You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
........// 如果访问的路径不存在app.get('*',(req,res)=>{constcontext={url: req.url};render.renderToString(context,(err,html)=>{if(err){if(err.code===404){res.status(404).end('Page not found')}else{res.status(500).end('Internal Server Error')}}else{res.end(html)}});});app.listen(4000);
........
# app.jsimportVuefrom'vue';importAppfrom'./App.vue';importcreateVuexfrom'./store.js';importcreateRouterfrom'./router.js';exportdefault()=>{constrouter=createRouter();conststore=createVuex();constapp=newVue({render: (h)=>h(App),
router,
store
});return{ app, router, store };}
Vue服务端渲染
前言: 现在浏览器对于spa页面的抓取能力还是比较差,本文从零开始搭建一个简单的Vue服务端渲染的案例。
本质
server-index.html
和vue-server-renderer
生成一个渲染bundler,返回返回给用户,其中服务端模板需要引入客户端打包的js来进行一下事件和交互。项目构建
创建项目
mkdir vue-ssr && cd vue-ssr
初始化项目
npm init -y
添加对应的依赖
创建目录结构
编写webpack.base.js
编写客户端打包文件webpack.client.js
public目录下存放index.html
简单的编写2个组件
Bar.vue Foo.vue
app.vue的编写
核心部分
入口文件
入口文件app.js
解析:为什么这里要导出一个函数,而不是直接导出一个实例,如果不导出一个函数,在客户端,我们每一个用户都是新建了一个实例,这样不会有问题,但是在服务器,由于程序一直运行,所以的用户都会共享同一个实例,这样就不会出现混乱,所以要每次访问都要返回一个新的实例,这样就不会有冲突
客户端部分
客户端webpack打包文件
webpack.client.js
到这一步我们已经初步搭建了客户端开发的流程,启动webpack-dev-server就可以看到页面了
配置脚步
package.json
服务端部分
通过
vue-server-renderer
来进行服务端渲染服务端入口
entry-server.js
服务端的模板
server-index.html
服务端webpack配置文件
webpack.server.js
解析: 由于打包后的bundler是给服务端使用的,而webpack默认的target是客户端,所以需要指明target是node,打包后,在内部会被
vue-server-renderer
通过require(xxxx)
使用,所以要指定webpack打包后通过commonjs2
导出打包文件
启动node服务
安装express依赖
编写
node-server.js
解析:
注意点
引入Vue-router
核心: 本质上当用户在浏览器上输入
localhost:4000/foo
的时候,服务端只是访问了/
, 然后通过router.push('/foo')
跳转到指定页面。通过VueServerRenderer的render.renderToString传递访问路径参数给服务端的入口文件
entry-server.js
安装依赖
创建初始文件
router.js
解析: 和 vue实例一样,我们需要创建一个函数,来让每一次访问都生成一个新的router实例
修改app.js
修改app.vue
修改entry-server.js
修改node-server.js
引入Vuex
安装依赖
创建初始化文件
store.js
添加Vuex,为每一个实例创建一个store,不同的用户维护不同的store
修改服务端入口
entry-server.js
The text was updated successfully, but these errors were encountered: