mirror of
https://github.com/nuxt/nuxt.git
synced 2024-11-27 08:02:01 +00:00
fix(vue-app, vue-renderer, utils): respect trailingSlash
setting for payloads (#8489)
* fix(utils): don't inject a trailing slash on catchall routes (e.g. `/*/`) closes #8488 * fix(vue-app, vue-renderer): respect `trailingSlash` setting for payloads * refactor: use new ufo `parsePath` utility Co-authored-by: pooya parsa <pyapar@gmail.com>
This commit is contained in:
parent
33143038b1
commit
fb191d2fbd
@ -1,7 +1,7 @@
|
|||||||
import path from 'path'
|
import path from 'path'
|
||||||
import get from 'lodash/get'
|
import get from 'lodash/get'
|
||||||
import consola from 'consola'
|
import consola from 'consola'
|
||||||
import { normalizeURL } from '@nuxt/ufo'
|
import { normalizeURL, withTrailingSlash, withoutTrailingSlash } from '@nuxt/ufo'
|
||||||
import { r } from './resolve'
|
import { r } from './resolve'
|
||||||
|
|
||||||
const routeChildren = function (route) {
|
const routeChildren = function (route) {
|
||||||
@ -209,7 +209,11 @@ export const createRoutes = function createRoutes ({
|
|||||||
})
|
})
|
||||||
if (trailingSlash !== undefined) {
|
if (trailingSlash !== undefined) {
|
||||||
route.pathToRegexpOptions = { ...route.pathToRegexpOptions, strict: true }
|
route.pathToRegexpOptions = { ...route.pathToRegexpOptions, strict: true }
|
||||||
route.path = route.path.replace(/\/+$/, '') + (trailingSlash ? '/' : '') || '/'
|
if (trailingSlash && !route.path.endsWith('*')) {
|
||||||
|
route.path = withTrailingSlash(route.path)
|
||||||
|
} else {
|
||||||
|
route.path = withoutTrailingSlash(route.path) || '/'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
parent.push(route)
|
parent.push(route)
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import Vue from 'vue'
|
import Vue from 'vue'
|
||||||
|
import { parsePath, withoutTrailingSlash } from '@nuxt/ufo'
|
||||||
<% utilsImports = [
|
<% utilsImports = [
|
||||||
...(features.asyncData || features.fetch) ? [
|
...(features.asyncData || features.fetch) ? [
|
||||||
'getMatchedComponentsInstances',
|
'getMatchedComponentsInstances',
|
||||||
@ -296,19 +297,23 @@ export default {
|
|||||||
<% } /* features.layouts */ %>
|
<% } /* features.layouts */ %>
|
||||||
<% if (isFullStatic) { %>
|
<% if (isFullStatic) { %>
|
||||||
getRouterBase() {
|
getRouterBase() {
|
||||||
return (this.$router.options.base || '').replace(/\/+$/, '')
|
return withoutTrailingSlash(this.$router.options.base)
|
||||||
},
|
},
|
||||||
getRoutePath(route = '/') {
|
getRoutePath(route = '/') {
|
||||||
const base = this.getRouterBase()
|
const base = this.getRouterBase()
|
||||||
if (base && route.startsWith(base)) {
|
if (base && route.startsWith(base)) {
|
||||||
route = route.substr(base.length)
|
route = route.substr(base.length)
|
||||||
}
|
}
|
||||||
return (route.replace(/\/+$/, '') || '/').split('?')[0].split('#')[0]
|
let path = parsePath(route).pathname
|
||||||
|
<% if (!nuxtOptions.router.trailingSlash) { %>
|
||||||
|
path = withoutTrailingSlash(path)
|
||||||
|
<% } %>
|
||||||
|
return path || '/'
|
||||||
},
|
},
|
||||||
getStaticAssetsPath(route = '/') {
|
getStaticAssetsPath(route = '/') {
|
||||||
const { staticAssetsBase } = window.<%= globals.context %>
|
const { staticAssetsBase } = window.<%= globals.context %>
|
||||||
|
|
||||||
return urlJoin(staticAssetsBase, this.getRoutePath(route))
|
return urlJoin(staticAssetsBase, withoutTrailingSlash(this.getRoutePath(route)))
|
||||||
},
|
},
|
||||||
<% if (nuxtOptions.generate.manifest) { %>
|
<% if (nuxtOptions.generate.manifest) { %>
|
||||||
async fetchStaticManifest() {
|
async fetchStaticManifest() {
|
||||||
|
@ -4,6 +4,7 @@ import { format } from 'util'
|
|||||||
import fs from 'fs-extra'
|
import fs from 'fs-extra'
|
||||||
import consola from 'consola'
|
import consola from 'consola'
|
||||||
import { TARGETS, urlJoin } from '@nuxt/utils'
|
import { TARGETS, urlJoin } from '@nuxt/utils'
|
||||||
|
import { parsePath, withoutTrailingSlash } from '@nuxt/ufo'
|
||||||
import devalue from '@nuxt/devalue'
|
import devalue from '@nuxt/devalue'
|
||||||
import { createBundleRenderer } from 'vue-server-renderer'
|
import { createBundleRenderer } from 'vue-server-renderer'
|
||||||
import BaseRenderer from './base'
|
import BaseRenderer from './base'
|
||||||
@ -209,7 +210,10 @@ export default class SSRRenderer extends BaseRenderer {
|
|||||||
// Page level payload.js (async loaded for CSR)
|
// Page level payload.js (async loaded for CSR)
|
||||||
const payloadPath = urlJoin(url, 'payload.js')
|
const payloadPath = urlJoin(url, 'payload.js')
|
||||||
const payloadUrl = urlJoin(staticAssetsBase, payloadPath)
|
const payloadUrl = urlJoin(staticAssetsBase, payloadPath)
|
||||||
const routePath = (url.replace(/\/+$/, '') || '/').split('?')[0] // remove trailing slah and query params
|
let routePath = parsePath(url).pathname // remove query params
|
||||||
|
if (!this.options.router.trailingSlash) {
|
||||||
|
routePath = withoutTrailingSlash(routePath) || '/'
|
||||||
|
}
|
||||||
const payloadScript = `__NUXT_JSONP__("${routePath}", ${devalue({ data, fetch, mutations })});`
|
const payloadScript = `__NUXT_JSONP__("${routePath}", ${devalue({ data, fetch, mutations })});`
|
||||||
staticAssets.push({ path: payloadPath, src: payloadScript })
|
staticAssets.push({ path: payloadPath, src: payloadScript })
|
||||||
preloadScripts.push(payloadUrl)
|
preloadScripts.push(payloadUrl)
|
||||||
|
Loading…
Reference in New Issue
Block a user