Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat($core): support async enhanceApp (close #2074) #2075

Merged
merged 2 commits into from
Feb 2, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions packages/@vuepress/core/lib/client/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ Vue.prototype.$withBase = function (path) {
}
}

export function createApp (isServer) {
export async function createApp (isServer) {
const routerBase = typeof window !== 'undefined' && window.__VUEPRESS_ROUTER_BASE__
? window.__VUEPRESS_ROUTER_BASE__
: (siteData.routerBase || siteData.base)
Expand Down Expand Up @@ -90,11 +90,11 @@ export function createApp (isServer) {
const options = {}

try {
appEnhancers.forEach(enhancer => {
if (typeof enhancer === 'function') {
enhancer({ Vue, options, router, siteData, isServer })
}
})
await Promise.all(
appEnhancers
.filter(enhancer => typeof enhancer === 'function')
.map(enhancer => enhancer({ Vue, options, router, siteData, isServer }))
)
} catch (e) {
console.error(e)
}
Expand Down
8 changes: 4 additions & 4 deletions packages/@vuepress/core/lib/client/clientEntry.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

import { createApp } from './app'

const { app, router } = createApp(false /* isServer */)

window.__VUEPRESS__ = {
version: VUEPRESS_VERSION,
hash: LAST_COMMIT_HASH
}

router.onReady(() => {
app.$mount('#app')
createApp(false /* isServer */).then(({ app, router }) => {
router.onReady(() => {
app.$mount('#app')
})
})
17 changes: 9 additions & 8 deletions packages/@vuepress/core/lib/client/serverEntry.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import { createApp } from './app'

export default context => new Promise((resolve, reject) => {
const { app, router } = createApp(true /* isServer */)
const { url } = context
const { fullPath } = router.resolve(url).route
createApp(true /* isServer */).then(({ app, router }) => {
meteorlxy marked this conversation as resolved.
Show resolved Hide resolved
const { url } = context
const { fullPath } = router.resolve(url).route

if (fullPath !== url) {
return reject({ url: fullPath })
}
if (fullPath !== url) {
return reject({ url: fullPath })
}

router.push(url)
router.onReady(() => resolve(app))
router.push(url)
router.onReady(() => resolve(app))
})
})
1 change: 1 addition & 0 deletions packages/docs/docs/guide/basic-config.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ To develop a custom theme, see [Writing a theme](../theme/writing-a-theme.md).
Since the VuePress app is a standard Vue app, you can apply app-level enhancements by creating a file `.vuepress/enhanceApp.js`, which will be imported into the app if it’s present. The file should `export default` a hook function which will receive an object containing some app-level values. You can use this hook to install extra Vue plugins, register global components, or add extra router hooks:

``` js
// async function is also supported, too
export default ({
Vue, // the version of Vue being used in the VuePress app
options, // the options for the root Vue instance
Expand Down
1 change: 1 addition & 0 deletions packages/docs/docs/zh/guide/basic-config.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ module.exports = {
由于 VuePress 是一个标准的 Vue 应用,你可以通过创建一个 `.vuepress/enhanceApp.js` 文件来做一些应用级别的配置,当该文件存在的时候,会被导入到应用内部。`enhanceApp.js` 应该 `export default` 一个钩子函数,并接受一个包含了一些应用级别属性的对象作为参数。你可以使用这个钩子来安装一些附加的 Vue 插件、注册全局组件,或者增加额外的路由钩子等:

``` js
// 使用异步函数也是可以的
export default ({
Vue, // VuePress 正在使用的 Vue 构造函数
options, // 附加到根实例的一些选项
Expand Down