Skip to content

Commit c49e339

Browse files
committedJul 25, 2024
✨ configure VPV to work with ssr
1 parent 132a84b commit c49e339

File tree

4 files changed

+75
-22
lines changed

4 files changed

+75
-22
lines changed
 

‎src/App.vue

+48-21
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,58 @@
11
<script setup lang="ts">
2-
// This starter template is using Vue 3 <script setup> SFCs
3-
// Check out https://vuejs.org/api/sfc-script-setup.html#script-setup
4-
import HelloWorld from './components/HelloWorld.vue'
2+
import ClientOnly from './components/ClientOnly.vue';
3+
import type { ToolbarOptions } from '@vue-pdf-viewer/viewer';
4+
import { defineAsyncComponent, watch, h, ref } from 'vue';
5+
6+
const toolbarOptions: Partial<ToolbarOptions> | false = false
7+
8+
const VPdfViewerComp = defineAsyncComponent(async () => {
9+
if (import.meta.env.SSR) return Promise.resolve(h('div', 'Loading...'))
10+
const module = await import('./components/PdfViewer.vue');
11+
return module.default;
12+
})
513
</script>
614

715
<template>
816
<div>
9-
<a href="https://vitejs.dev" target="_blank">
10-
<img src="/vite.svg" class="logo" alt="Vite logo" />
11-
</a>
12-
<a href="https://vuejs.org/" target="_blank">
13-
<img src="./assets/vue.svg" class="logo vue" alt="Vue logo" />
14-
</a>
17+
<h1>VPV Starter Toolkit: Vue + SSR + TypeScript</h1>
18+
<br />
19+
<h2>Default Toolbar</h2>
20+
<div>
21+
<ClientOnly class="pdf-viewer-wrapper">
22+
<VPdfViewerComp
23+
src="https://raw.githubusercontent.com/mozilla/pdf.js/ba2edeae/web/compressed.tracemonkey-pldi-09.pdf" />
24+
</ClientOnly>
25+
</div>
26+
<h2>Without Toolbar</h2>
27+
<div>
28+
<ClientOnly class="pdf-viewer-wrapper no-toolbar">
29+
<VPdfViewerComp src="https://raw.githubusercontent.com/mozilla/pdf.js/ba2edeae/web/compressed.tracemonkey-pldi-09.pdf"
30+
:toolbar-options="toolbarOptions" />
31+
</ClientOnly>
32+
</div>
33+
<h2>Mobile</h2>
34+
<div>
35+
<ClientOnly class="pdf-viewer-wrapper-mobile">
36+
<VPdfViewerComp
37+
src="https://raw.githubusercontent.com/mozilla/pdf.js/ba2edeae/web/compressed.tracemonkey-pldi-09.pdf" />
38+
</ClientOnly>
39+
</div>
1540
</div>
16-
<HelloWorld msg="Vite + Vue" />
1741
</template>
1842

1943
<style scoped>
20-
.logo {
21-
height: 6em;
22-
padding: 1.5em;
23-
will-change: filter;
24-
}
25-
.logo:hover {
26-
filter: drop-shadow(0 0 2em #646cffaa);
27-
}
28-
.logo.vue:hover {
29-
filter: drop-shadow(0 0 2em #42b883aa);
30-
}
44+
.pdf-viewer-wrapper {
45+
width: 1028px;
46+
height: 700px;
47+
margin: 0 auto;
48+
}
49+
50+
.pdf-viewer-wrapper-mobile {
51+
width: 468px;
52+
height: 700px;
53+
margin: 0 auto;
54+
}
55+
.no-toolbar :deep(.vpv-variables) {
56+
--vpv-toolbar-size: 0px;
57+
}
3158
</style>

‎src/components/ClientOnly.vue

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<script setup lang="ts">
2+
import { ref, onMounted } from 'vue';
3+
const isMounted = ref(false);
4+
5+
onMounted(() => {
6+
isMounted.value = true;
7+
});
8+
9+
</script>
10+
11+
<template>
12+
<div v-if="isMounted">
13+
<slot></slot>
14+
</div>
15+
</template>

‎src/components/PdfViewer.vue

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<script setup lang="ts">
2+
import { VPdfViewer } from '@vue-pdf-viewer/viewer';
3+
</script>
4+
<template>
5+
<VPdfViewer
6+
v-bind="$attrs"
7+
src="https://raw.githubusercontent.com/mozilla/pdf.js/ba2edeae/web/compressed.tracemonkey-pldi-09.pdf" />
8+
</template>

‎vite.config.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,8 @@ import vue from '@vitejs/plugin-vue'
33

44
// https://vitejs.dev/config/
55
export default defineConfig({
6-
plugins: [vue()]
6+
plugins: [vue()],
7+
ssr: {
8+
noExternal: ['@vue-pdf-viewer/viewer', 'pdfjs-dist']
9+
},
710
})

0 commit comments

Comments
 (0)
Please sign in to comment.