VitePress
Quick start
Scaffold your app
If you have an existing VitePress app, you can skip this step.
You can create a new VitePress project following the official guide.
cd into your project directory and install dependencies with npm install.
Install
whyframe comes in two packages, the core library and the UI framework, in this case, Vue.
# Install the core library
$ npm install -D @whyframe/core
# Install the Vue integration
$ npm install -D @whyframe/vue
Setup
whyframe works on the bundler level, so the packages are simply Vite plugins. You can initialize these plugins in your .vitepress/config.js:
import { defineConfig } from 'vitepress'
import { whyframe } from '@whyframe/core'
import { whyframeVue } from '@whyframe/vue'
export default defineConfig({
vite: {
plugins: [
// Initialize core plugin
whyframe({
defaultSrc: '/frames/default' // provide our own html
}),
// Initialize Vue integration plugin
whyframeVue({
include: /\.(?:vue|md)$/ // also scan in markdown files
})
]
}
})
As whyframe’s default HTML doesn’t work in VitePress, a custom HTML source is required. See HTML source for more information.
To setup /frames/default, or in other words http://localhost:5173/frames/default, create an empty /frames/default.md file. Since we want to start from an empty layout, some VitePress configuration is required.
To not inherit VitePress’ special layouts, we need to extend VitePress’ default theme. Create .vitepress/theme/index.js with this:
import Theme from 'vitepress/theme'
import DynamicLayout from '../components/DynamicLayout.vue'
export default {
...Theme,
// use our custom layout component that we'll create next
Layout: DynamicLayout
}
Create .vitepress/components/DynamicLayout.vue with this:
<script setup>
import { useRoute } from 'vitepress'
import Theme from 'vitepress/theme'
// the default layout we'll create next
import FrameDefaultLayout from './FrameDefaultLayout.vue'
const route = useRoute()
</script>
<template>
<!--
replace with the layout entirely for `/frames/default`
so we don't inherit from `Theme.Layout`
-->
<FrameDefaultLayout v-if="route.path.startsWith('/frames/default')" />
<Theme.Layout v-else />
</template>
Create .vitepress/components/FrameDefaultLayout.vue with this:
<script setup>
import { ref, onMounted } from 'vue'
// Special api to mount the app
import { createApp } from 'whyframe:app'
const el = ref()
onMounted(() => {
// Mount the app to the ref
createApp(el.value)
})
</script>
<template>
<div ref="el"></div>
</template>
And done! You can also add more code and styles to FrameDefaultLayout.vue if you prefer.
Usage
In index.md (or any page), you can create an iframe like below:
<iframe data-why>
Hello world!
</iframe>
Start your app with npm run dev and watch Hello world! rendered within the iframe as-is!
Check out Features for more things you can do with whyframe.