diff --git a/packages/vue-app/template/App.js b/packages/vue-app/template/App.js index 1cd3be1d55c9..c101bdf2a114 100644 --- a/packages/vue-app/template/App.js +++ b/packages/vue-app/template/App.js @@ -174,23 +174,16 @@ export default { } <% if (loading) { %>this.$loading.start()<% } %> - const promises = pages.map((page) => { - const p = [] + const promises = pages.map(async (page) => { + let p = [] <% if (features.fetch) { %> // Old fetch if (page.$options.fetch && page.$options.fetch.length) { p.push(promisify(page.$options.fetch, this.context)) } - if (page.$fetch) { - p.push(page.$fetch()) - } else { - // Get all component instance to call $fetch - for (const component of getChildrenComponentInstancesUsingFetch(page.$vnode.componentInstance)) { - p.push(component.$fetch()) - } - } <% } %> + <% if (features.asyncData) { %> if (page.$options.asyncData) { p.push( @@ -203,6 +196,22 @@ export default { ) } <% } %> + + <% if (features.fetch) { %> + // Wait for asyncData & old fetch to finish + await Promise.all(p) + // Cleanup refs + p = [] + + if (page.$fetch) { + p.push(page.$fetch()) + } + // Get all component instance to call $fetch + for (const component of getChildrenComponentInstancesUsingFetch(page.$vnode.componentInstance)) { + p.push(component.$fetch()) + } + <% } %> + return Promise.all(p) }) try { diff --git a/packages/vue-app/template/utils.js b/packages/vue-app/template/utils.js index 91bd66ee4ee4..99a4ad6b113b 100644 --- a/packages/vue-app/template/utils.js +++ b/packages/vue-app/template/utils.js @@ -58,7 +58,6 @@ export function getChildrenComponentInstancesUsingFetch(vm, instances = []) { for (const child of children) { if (child.$fetch) { instances.push(child) - continue; // Don't get the children since it will reload the template } if (child.$children) { getChildrenComponentInstancesUsingFetch(child, instances) diff --git a/test/dev/full-static-with-preview.test.js b/test/dev/full-static-with-preview.test.js new file mode 100644 index 000000000000..ab8ee42e3cc9 --- /dev/null +++ b/test/dev/full-static-with-preview.test.js @@ -0,0 +1,107 @@ +import http from 'http' +import { resolve } from 'path' +import serveStatic from 'serve-static' +import finalhandler from 'finalhandler' +import { Builder, Generator, getPort, loadFixture, Nuxt, waitFor } from '../utils' + +let port +const url = route => 'http://localhost:' + port + route +const rootDir = resolve(__dirname, '..', 'fixtures/full-static-with-preview') +const distDir = resolve(rootDir, '.nuxt-generate') + +let builder +let server = null +let generator = null + +describe('full-static-with-preview', () => { + beforeAll(async () => { + const config = await loadFixture('full-static-with-preview', { + generate: { + static: false, + dir: '.nuxt-generate' + } + }) + const nuxt = new Nuxt(config) + await nuxt.ready() + + builder = new Builder(nuxt) + builder.build = jest.fn() + generator = new Generator(nuxt, builder) + + await generator.generate() + + const serve = serveStatic(distDir) + server = http.createServer((req, res) => { + serve(req, res, finalhandler(req, res)) + }) + + port = await getPort() + server.listen(port) + }) + + test('/', async () => { + const window = await generator.nuxt.server.renderAndGetWindow(url('/')) + const html = window.document.body.innerHTML + expect(html).toContain('

page-fetch-called

') + }) + + test('preview: /', async () => { + const window = await generator.nuxt.server.renderAndGetWindow(url('/?preview=true')) + const html = window.document.body.innerHTML + expect(html).toContain('

page-fetch-called-in-preview

') + }) + + test('/with-component', async () => { + const window = await generator.nuxt.server.renderAndGetWindow(url('/with-component')) + const html = window.document.body.innerHTML + expect(html).toContain('

page-fetch-called

') + expect(html).toContain('

component-fetch-called

') + }) + + test('preview: /with-component', async () => { + const window = await generator.nuxt.server.renderAndGetWindow(url('/with-component?preview=true')) + const html = window.document.body.innerHTML + expect(html).toContain('

page-fetch-called-in-preview

') + expect(html).toContain('

component-fetch-called-in-preview

') + }) + + test('/with-nested-components', async () => { + const window = await generator.nuxt.server.renderAndGetWindow(url('/with-nested-components')) + const html = window.document.body.innerHTML + expect(html).toContain('

page-fetch-called

') + expect(html).toContain('

component-fetch-called

') + expect(html).toContain('

sub-component-fetch-called

') + }) + + test('preview: /with-nested-components', async () => { + const window = await generator.nuxt.server.renderAndGetWindow(url('/with-nested-components?preview=true')) + const html = window.document.body.innerHTML + expect(html).toContain('

page-fetch-called-in-preview

') + expect(html).toContain('

component-fetch-called-in-preview

') + expect(html).toContain('

sub-component-fetch-called-in-preview

') + }) + + test('/async-data-dependent-fetch', async () => { + const window = await generator.nuxt.server.renderAndGetWindow(url('/async-data-dependent-fetch')) + const html = window.document.body.innerHTML + expect(html).toContain('

page-fetch-called

') + expect(html).toContain('

component-1-fetch-called

') + expect(html).toContain('

component-2-fetch-called

') + expect(html).toContain('

component-3-fetch-called

') + }) + + test('preview: /async-data-dependent-fetch', async () => { + const window = await generator.nuxt.server.renderAndGetWindow(url('/async-data-dependent-fetch?preview=true')) + await waitFor(100) + const html = window.document.body.innerHTML + expect(html).toContain('

page-fetch-called-in-preview

') + expect(html).toContain('

component-1-fetch-called-in-preview

') + expect(html).toContain('

component-2-fetch-called-in-preview

') + expect(html).toContain('

component-3-fetch-called-in-preview

') + }) + + // Close server and ask nuxt to stop listening to file changes + afterAll(async () => { + await server.close() + }) +}) diff --git a/test/fixtures/full-static-with-preview/components/ComponentRenderer.vue b/test/fixtures/full-static-with-preview/components/ComponentRenderer.vue new file mode 100644 index 000000000000..e0c71eb1bf6b --- /dev/null +++ b/test/fixtures/full-static-with-preview/components/ComponentRenderer.vue @@ -0,0 +1,24 @@ + + + diff --git a/test/fixtures/full-static-with-preview/components/ComponentWithFetch.vue b/test/fixtures/full-static-with-preview/components/ComponentWithFetch.vue new file mode 100644 index 000000000000..456d91237d69 --- /dev/null +++ b/test/fixtures/full-static-with-preview/components/ComponentWithFetch.vue @@ -0,0 +1,29 @@ + + + diff --git a/test/fixtures/full-static-with-preview/full-static-with-preview.test.js b/test/fixtures/full-static-with-preview/full-static-with-preview.test.js new file mode 100644 index 000000000000..dcb2d721ca40 --- /dev/null +++ b/test/fixtures/full-static-with-preview/full-static-with-preview.test.js @@ -0,0 +1,3 @@ +import { buildFixture } from '../../utils/build' + +buildFixture('full-static-with-preview') diff --git a/test/fixtures/full-static-with-preview/nuxt.config.js b/test/fixtures/full-static-with-preview/nuxt.config.js new file mode 100644 index 000000000000..ed827d0ee405 --- /dev/null +++ b/test/fixtures/full-static-with-preview/nuxt.config.js @@ -0,0 +1,7 @@ +export default { + target: 'static', + components: true, + plugins: [ + '~/plugins/preview.client.js' + ] +} diff --git a/test/fixtures/full-static-with-preview/pages/async-data-dependent-fetch.vue b/test/fixtures/full-static-with-preview/pages/async-data-dependent-fetch.vue new file mode 100644 index 000000000000..29cdd9b6d57f --- /dev/null +++ b/test/fixtures/full-static-with-preview/pages/async-data-dependent-fetch.vue @@ -0,0 +1,59 @@ + + + diff --git a/test/fixtures/full-static-with-preview/pages/index.vue b/test/fixtures/full-static-with-preview/pages/index.vue new file mode 100644 index 000000000000..faf8f3cad647 --- /dev/null +++ b/test/fixtures/full-static-with-preview/pages/index.vue @@ -0,0 +1,22 @@ + + + diff --git a/test/fixtures/full-static-with-preview/pages/with-component.vue b/test/fixtures/full-static-with-preview/pages/with-component.vue new file mode 100644 index 000000000000..b00a24683543 --- /dev/null +++ b/test/fixtures/full-static-with-preview/pages/with-component.vue @@ -0,0 +1,23 @@ + + + diff --git a/test/fixtures/full-static-with-preview/pages/with-nested-components.vue b/test/fixtures/full-static-with-preview/pages/with-nested-components.vue new file mode 100644 index 000000000000..3d87ee098210 --- /dev/null +++ b/test/fixtures/full-static-with-preview/pages/with-nested-components.vue @@ -0,0 +1,25 @@ + + + diff --git a/test/fixtures/full-static-with-preview/plugins/preview.client.js b/test/fixtures/full-static-with-preview/plugins/preview.client.js new file mode 100644 index 000000000000..db610489f48e --- /dev/null +++ b/test/fixtures/full-static-with-preview/plugins/preview.client.js @@ -0,0 +1,5 @@ +export default function ({ query, enablePreview }) { + if (query.preview) { + enablePreview() + } +}