摘要:開始改建補(bǔ)充安裝依賴與上一次不同,這次我們基于進(jìn)行改建,已經(jīng)有了很多依賴庫了,但我們?nèi)涡枰a(bǔ)充一個(gè)核心修改客戶端的配置修改文件,添加插件添加了這個(gè)配置以后,重新啟動(dòng)項(xiàng)目通過地址就可以訪問到,頁面中出現(xiàn)的內(nèi)容就是所需要的。
從零開始搭建一個(gè)vue-ssr 前言
上次我們已經(jīng)實(shí)現(xiàn)了從零開始,搭建一個(gè)簡單的vue-ssr的demo:從零開始搭建一個(gè)vue-ssr(上)。那么這次呢,我們基于vue-cli,進(jìn)行webpack的改造,實(shí)現(xiàn)vue-cli版本的vue-ssr。
開始改建 補(bǔ)充安裝依賴與上一次不同,這次我們基于vue-cli進(jìn)行改建,已經(jīng)有了很多依賴庫了,但我們?nèi)涡枰a(bǔ)充一個(gè)核心:
npm install vue-server-renderer修改客戶端的webpack配置
修改webpack.dev.conf.js文件,添加插件
const vueSSRClientPlugin = require("vue-server-renderer/client-plugin"); const devWebpackConfig = merge(baseWebpackConfig,{ plugins:[ new vueSSRClientPlugin() ] });
添加了這個(gè)配置以后,重新啟動(dòng)項(xiàng)目通過地址就可以訪問到vue-ssr-client-manifest.json(http://localhost:8082/vue-ssr-client-manifest.json),頁面中出現(xiàn)的內(nèi)容就是所需要的client-bundle。
修改vue的相關(guān)文件此步驟跟從零開始搭建一個(gè)vue-ssr(上)大有相似,不重復(fù)描述,直接上代碼:
修改 router/index.js
import vueRouter from "vue-router"; import Vue from "vue"; import HelloWorld from "@/components/HelloWorld"; import About from "@/components/About"; Vue.use(vueRouter); export default () => { return new vueRouter({ mode:"history", routes:[ { path:"/", component:HelloWorld, name:"HelloWorld" }, { path:"/about", component:About, name:"About" } ] }) }
修改app.js
import Vue from "vue"; import createRouter from "./router"; import App from "./App.vue"; export default (context) => { const router = createRouter(); const app = new Vue({ router, components: { App }, template: "" }); return { app, router } }
修改entry-server.js
import createApp from "./app.js"; export default (context) => { return new Promise((reslove,reject) => { let {url} = context; let {app,router} = createApp(context); router.push(url); router.onReady(() => { let matchedComponents = router.getMatchedComponents(); if(!matchedComponents.length){ return reject(); } reslove(app); },reject) }) }
修改entry-client.js
import createApp from "./app.js"; let {app,router} = createApp(); router.onReady(() => { app.$mount("#app"); });修改webpack客戶端入口以及輸出
修改webpack.base.conf.js
module.exports = { entry:{ app:"./src/entry-client.js" }, output:{ publicPath:"http://localhost:8080/" } };創(chuàng)建服務(wù)端webpakc配置文件
創(chuàng)建build/webpack.server.conf.js文件,目的將插件vue-server-renderer/server-plugin引入server端執(zhí)行。
const webpack = require("webpack"); const merge = require("webpack-merge"); const base = require("./webpack.base.conf"); // 手動(dòng)安裝 // 在服務(wù)端渲染中,所需要的文件都是使用require引入,不需要把node_modules文件打包 const webapckNodeExternals = require("webpack-node-externals"); const vueSSRServerPlugin = require("vue-server-renderer/server-plugin"); module.exports = merge(base,{ // 告知webpack,需要在node端運(yùn)行 target:"node", entry:"./src/entry-server.js", devtool:"source-map", output:{ filename:"server-buldle.js", libraryTarget: "commonjs2" }, externals:[ webapckNodeExternals() ], plugins:[ new webpack.DefinePlugin({ "process.env.NODE_ENV":""development"", "process.ent.VUE_ENV": ""server"" }), new vueSSRServerPlugin() ] });
創(chuàng)建build/dev-server.js,拿到客戶端和服務(wù)端的bundle文件以及讀取到index.html中的模板用作渲染。
const serverConf = require("./webpack.server.conf"); const webpack = require("webpack"); const fs = require("fs"); const path = require("path"); // 讀取內(nèi)存中的.json文件 // 這個(gè)模塊需要手動(dòng)安裝 const Mfs = require("memory-fs"); const axios = require("axios"); module.exports = (cb) => { const webpackComplier = webpack(serverConf); var mfs = new Mfs(); webpackComplier.outputFileSystem = mfs; webpackComplier.watch({},async (error,stats) => { if(error) return console.log(error); stats = stats.toJson(); stats.errors.forEach(error => console.log(error)); stats.warnings.forEach(warning => console.log(warning)); // 獲取server bundle的json文件 let serverBundlePath = path.join(serverConf.output.path,"vue-ssr-server-bundle.json"); let serverBundle = JSON.parse(mfs.readFileSync(serverBundlePath,"utf-8")); // 獲取client bundle的json文件 let clientBundle = await axios.get("http://localhost:8082/vue-ssr-client-manifest.json"); // 獲取模板 let template = fs.readFileSync(path.join(__dirname,"..","index.html"),"utf-8"); cb && cb(serverBundle,clientBundle,template); }) };
在根目錄下創(chuàng)建server.js文件,用于啟動(dòng)服務(wù),并利用createBundleRenderer將兩個(gè)Bundle和html模板渲染出來。
const devServer = require("./build/dev-server.js"); const express = require("express"); const app = express(); const vueRender = require("vue-server-renderer"); app.get("*",(request,respones) => { respones.status(200); respones.setHeader("Content-Type","text/html;charset-utf-8;"); devServer((serverBundle,clientBundle,template) => { let render = vueRender.createBundleRenderer(serverBundle,{ template, clientManifest:clientBundle.data, // 每次創(chuàng)建一個(gè)獨(dú)立的上下文 renInNewContext:false }); render.renderToString({ url:request.url }).then((html) => { respones.end(html); }).catch(error => { respones.end(JSON.stringify(error)); }); }); }) app.listen(5001,() => { console.log("服務(wù)已開啟") });補(bǔ)充一個(gè)html模板
根目錄下創(chuàng)建index.html
vue_cli_ssr
最后在package.json中添加一個(gè)啟動(dòng)服務(wù)端的命令:
"server": "node server.js"
大功告成,開啟兩個(gè)終端,分別輸入
npm run dev npm run server
瀏覽器打開localhost:8082,我們便可以看到由vue-cli改造而成的vue-ssr。
總結(jié)本文是直接基于vue-cli進(jìn)行改造的一個(gè)ssr版本,若想從零開始手撕vue-ssr,可以看上一篇文章從零開始搭建一個(gè)vue-ssr(上)。
項(xiàng)目源碼https://github.com/TheWalking...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/105153.html
摘要:從零開始搭建一個(gè)背景是什么全拼是,服務(wù)端渲染。大家不妨可以打開一些頁面或者一些公司的網(wǎng)站,查看源代碼,你會(huì)發(fā)現(xiàn),也是有這個(gè)標(biāo)記。這時(shí)候,我們發(fā)現(xiàn)頁面的路由切換生效了,并且不同頁面的源代碼也不一樣了。從零開始搭建一個(gè)下項(xiàng)目源碼 從零開始搭建一個(gè)vue-ssr 背景 What?SSR是什么? SSR全拼是Server-Side Rendering,服務(wù)端渲染。 所謂服務(wù)端渲染,指的是把...
摘要:無需使用服務(wù)器實(shí)時(shí)動(dòng)態(tài)編譯,而是使用預(yù)渲染方式,在構(gòu)建時(shí)簡單地生成針對特定路由的靜態(tài)文件。與可以部署在任何靜態(tài)文件服務(wù)器上的完全靜態(tài)單頁面應(yīng)用程序不同,服務(wù)器渲染應(yīng)用程序,需要處于運(yùn)行環(huán)境。更多的服務(wù)器端負(fù)載。 目錄結(jié)構(gòu) -no-ssr-demo 未做ssr之前的項(xiàng)目代碼用于對比 -vuecli2ssr 將vuecli生成的項(xiàng)目轉(zhuǎn)為ssr -prerender-demo 使用prer...
摘要:后端主要使用的框架,數(shù)據(jù)庫采用。后臺(tái)管理登錄采用與后端進(jìn)行登陸狀態(tài)的確認(rèn)。本文首發(fā)于小站,這是一個(gè)積累和分享知識(shí)的個(gè)人博客 這篇文章擱置了很長時(shí)間,最終決定還是把它寫出來,給剛開始學(xué)習(xí)vue并且想用vue寫個(gè)人博客的同學(xué)一個(gè)參考。因?yàn)楫?dāng)初我也是參考了其他人分享的知識(shí),從一個(gè)vue小白變成了一個(gè)入門級(jí)選手,并最終完成了這個(gè)個(gè)人博客的搭建工作,代碼已托管在Github-justJokee。...
摘要:總算是今天成功把自己的孩子托付到阿里云的服務(wù)器上面了。中間還遇到很多很多坑最后看這自己所部署的三個(gè)網(wǎng)站安靜的躺在自己租的阿里云上。 一把桌子,一臺(tái)電腦,一瓶紅牛,一包紙巾,從白天到黑夜。歷經(jīng)一個(gè)多月的時(shí)間,從零到構(gòu)思到設(shè)計(jì),從設(shè)計(jì)到vue-ssr 的框架設(shè)計(jì),然后再從前端的業(yè)務(wù)邏輯代碼的實(shí)現(xiàn),從 后臺(tái)nodejs 的 koa2框架到數(shù)據(jù)庫的設(shè)計(jì)到后端的業(yè)務(wù)邏輯的代碼實(shí)現(xiàn),從購買阿里云服...
閱讀 2048·2023-04-26 02:46
閱讀 2123·2021-11-25 09:43
閱讀 1265·2021-09-29 09:35
閱讀 2235·2019-08-30 15:56
閱讀 3542·2019-08-30 15:54
閱讀 2778·2019-08-29 16:35
閱讀 3249·2019-08-29 15:25
閱讀 3431·2019-08-29 14:01