Skip to content

Commit

Permalink
Improve SSR, add pinia
Browse files Browse the repository at this point in the history
  • Loading branch information
jlpereira committed Apr 20, 2023
1 parent cebfde6 commit 7324a95
Show file tree
Hide file tree
Showing 15 changed files with 223 additions and 122 deletions.
1 change: 1 addition & 0 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
/>
<title><%- project_name %></title>
<!--preload-links-->
<!--app-state-->
</head>
<body>
<div id="app"><!--app-html--></div>
Expand Down
91 changes: 85 additions & 6 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,23 @@
"type": "module",
"scripts": {
"dev": "node server",
"dev:spa": "vite dev",
"build:spa": "vite build",
"build": "npm run build:client && npm run build:server",
"build:client": "vite build --ssrManifest --outDir dist/client",
"build:server": "vite build --ssr src/entry-server.js --outDir dist/server",
"generate": "vite build --ssrManifest --outDir dist/static && npm run build:server && node prerender",
"serve": "NODE_ENV=production node server",
"debug": "node --inspect-brk server",
"preview": "vite preview",
"lint": "eslint --ext .js,.vue --ignore-path .gitignore --fix src"
},
"dependencies": {
"@geoman-io/leaflet-geoman-free": "^2.14.2",
"@nuxt/devalue": "^2.0.0",
"axios": "^1.3.5",
"js-yaml": "^4.1.0",
"leaflet": "^1.9.3",
"pinia": "^2.0.34",
"vue": "^3.2.47",
"vue-router": "^4.1.6"
},
Expand Down
42 changes: 0 additions & 42 deletions prerender.js

This file was deleted.

7 changes: 4 additions & 3 deletions server.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ export async function createServer(
vite = await (
await import('vite')
).createServer({
base: '/test/',
base: '/',
root,
logLevel: isTest ? 'error' : 'info',
server: {
Expand Down Expand Up @@ -67,7 +67,7 @@ export async function createServer(

app.use('*', async (req, res) => {
try {
const url = req.originalUrl.replace('/test/', '/')
const url = req.originalUrl

let template, render
if (!isProd) {
Expand All @@ -81,11 +81,12 @@ export async function createServer(
render = (await import('./dist/server/entry-server.js')).render
}

const [appHtml, preloadLinks] = await render(url, manifest)
const [appHtml, appState, preloadLinks] = await render(url, manifest)

const html = template
.replace(`<!--preload-links-->`, preloadLinks)
.replace(`<!--app-html-->`, appHtml)
.replace(`<!--app-state-->`, appState)

res.status(200).set({ 'Content-Type': 'text/html' }).end(html)
} catch (e) {
Expand Down
10 changes: 4 additions & 6 deletions src/components/Gallery/GalleryMainImage.vue
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
<template>
<div class="h-80 max-h-80 flex items-center justify-center">
<VSpinner v-if="isLoading" />
<ClientOnly>
<VSpinner v-if="isLoading" />
</ClientOnly>
<img
ref="imageElement"
class="max-h-80 h-max w-100 cursor-zoom-in m-auto"
Expand All @@ -11,7 +13,7 @@
</template>

<script setup>
import { ref, onMounted, onUnmounted, watch } from 'vue'
import { ref, onMounted, watch } from 'vue'
const props = defineProps({
image: {
Expand All @@ -30,15 +32,11 @@ watch(
if (newVal.id) {
isLoading.value = true
}
},
{
immediate: true
}
)
onMounted(() => {
imageElement.value.addEventListener('load', () => (isLoading.value = false))
})
onUnmounted(() => {})
</script>
13 changes: 10 additions & 3 deletions src/entry-client.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
import { createApp } from './main'
import { registerOnlyClientComponents } from '@/components/clientComponents'
import { registerGlobalComponents } from './components/globalComponents'
const { app, router } = createApp()

const { app, router, store } = createApp()
const storeInitialState = window.initialState

if (storeInitialState) {
store.state.value = storeInitialState
}

registerOnlyClientComponents(app)
registerGlobalComponents(app)

router.isReady().then(() => {
registerOnlyClientComponents(app)
registerGlobalComponents(app)
app.mount('#app')
})
10 changes: 8 additions & 2 deletions src/entry-server.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@ import { basename } from 'node:path'
import { renderToString } from 'vue/server-renderer'
import { createApp } from './main'
import { registerGlobalComponents } from '@/components/globalComponents'
import devalue from '@nuxt/devalue'

export async function render(url, manifest) {
const { app, router } = createApp()
const { app, router, store } = createApp()

registerGlobalComponents(app)
// set the router to the desired URL before rendering
Expand All @@ -18,11 +19,16 @@ export async function render(url, manifest) {
const ctx = {}
const html = await renderToString(app, ctx)

const renderState = `
<script>
window.initialState = ${devalue(store.state.value)}
</script>`

// the SSR manifest generated by Vite contains module -> chunk/asset mapping
// which we can then use to determine what files need to be preloaded for this
// request.
const preloadLinks = renderPreloadLinks(ctx.modules, manifest)
return [html, preloadLinks]
return [html, renderState, preloadLinks]
}

function renderPreloadLinks(modules, manifest) {
Expand Down
11 changes: 7 additions & 4 deletions src/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,21 @@ const app = initTaxonPagesApp()
app.mount('#app')
*/

import.meta.globEager('@/assets/css/main.css')
import.meta.globEager('../config/style/*.{scss,css}')
import.meta.glob('@/assets/css/main.css', { eager: true })
import.meta.glob('../config/style/*.{scss,css}', { eager: true })

import { createSSRApp } from 'vue'
import App from './App.vue'
import { createPinia } from 'pinia'
import { createSSRApp } from 'vue'
import { createRouter } from './router'

export function createApp() {
const app = createSSRApp(App)
const router = createRouter()
const store = createPinia()

app.use(router)
app.use(store)

return { app, router }
return { app, router, store }
}
Loading

0 comments on commit 7324a95

Please sign in to comment.