diff --git a/packages/generator/src/generator.js b/packages/generator/src/generator.js
index e18d70af6f..2738330f61 100644
--- a/packages/generator/src/generator.js
+++ b/packages/generator/src/generator.js
@@ -6,7 +6,7 @@ import defu from 'defu'
import htmlMinifier from 'html-minifier'
import { parse } from 'node-html-parser'
-import { isFullStatic, flatRoutes, isString, isUrl, promisifyRoute, waitFor } from '@nuxt/utils'
+import { isFullStatic, flatRoutes, isString, isUrl, promisifyRoute, urlJoin, waitFor } from '@nuxt/utils'
export default class Generator {
constructor (nuxt, builder) {
@@ -28,9 +28,11 @@ export default class Generator {
)
// Payloads for full static
if (this.isFullStatic) {
+ const { build: { publicPath: _publicPath }, router: { base } } = this.options
+ const publicPath = isUrl(_publicPath) ? _publicPath : base
const { staticAssets } = this.options.generate
this.staticAssetsDir = path.resolve(this.distNuxtPath, staticAssets.dir, staticAssets.version)
- this.staticAssetsBase = this.options.generate.staticAssets.versionBase
+ this.staticAssetsBase = urlJoin(publicPath, this.options.generate.staticAssets.versionBase)
}
// Shared payload
diff --git a/packages/vue-app/template/App.js b/packages/vue-app/template/App.js
index c8fcd6403a..abbb6b3cc7 100644
--- a/packages/vue-app/template/App.js
+++ b/packages/vue-app/template/App.js
@@ -306,7 +306,7 @@ export default {
route = route.substr(base.length)
}
route = (route.replace(/\/+$/, '') || '/').split('?')[0].split('#')[0]
- const src = urlJoin(base, staticAssetsBase, route, 'payload.js')
+ const src = urlJoin(staticAssetsBase, route, 'payload.js')
try {
const payload = await window.__NUXT_IMPORT__(decodeURI(route), encodeURI(src))
this.setPagePayload(payload)
diff --git a/packages/vue-renderer/src/renderers/ssr.js b/packages/vue-renderer/src/renderers/ssr.js
index febd475019..ac7e83f37c 100644
--- a/packages/vue-renderer/src/renderers/ssr.js
+++ b/packages/vue-renderer/src/renderers/ssr.js
@@ -175,7 +175,6 @@ export default class SSRRenderer extends BaseRenderer {
if (renderContext.staticAssetsBase) {
const preloadScripts = []
renderContext.staticAssets = []
- const routerBase = this.options.router.base
const { staticAssetsBase, url, nuxt, staticAssets } = renderContext
const { data, fetch, mutations, ...state } = nuxt
@@ -189,7 +188,7 @@ export default class SSRRenderer extends BaseRenderer {
const stateScriptKb = (stateScript.length * 4 /* utf8 */) / 100
if (stateScriptKb > 10) {
const statePath = urlJoin(url, 'state.js')
- const stateUrl = urlJoin(routerBase, staticAssetsBase, statePath)
+ const stateUrl = urlJoin(staticAssetsBase, statePath)
staticAssets.push({ path: statePath, src: stateScript })
APP += ``
preloadScripts.push(stateUrl)
@@ -199,7 +198,7 @@ export default class SSRRenderer extends BaseRenderer {
// Page level payload.js (async loaded for CSR)
const payloadPath = urlJoin(url, 'payload.js')
- const payloadUrl = urlJoin(routerBase, staticAssetsBase, payloadPath)
+ const payloadUrl = urlJoin(staticAssetsBase, payloadPath)
const routePath = (url.replace(/\/+$/, '') || '/').split('?')[0] // remove trailing slah and query params
const payloadScript = `__NUXT_JSONP__("${routePath}", ${devalue({ data, fetch, mutations })});`
staticAssets.push({ path: payloadPath, src: payloadScript })
diff --git a/test/dev/full-static.test.js b/test/dev/full-static.test.js
new file mode 100644
index 0000000000..ac41142f34
--- /dev/null
+++ b/test/dev/full-static.test.js
@@ -0,0 +1,53 @@
+import http from 'http'
+import { resolve } from 'path'
+import serveStatic from 'serve-static'
+import finalhandler from 'finalhandler'
+import { Builder, Generator, getPort, loadFixture, Nuxt, rp } from '../utils'
+
+let port
+const url = route => 'http://localhost:' + port + route
+const rootDir = resolve(__dirname, '..', 'fixtures/full-static')
+const distDir = resolve(rootDir, '.nuxt-generate')
+
+let builder
+let server = null
+let generator = null
+
+describe('full-static', () => {
+ beforeAll(async () => {
+ const config = await loadFixture('full-static', {
+ 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('/payload (custom build.publicPath)', async () => {
+ const { body: html } = await rp(url('/payload'))
+
+ expect(html).toContain('