From ec7d250b4818e45babe3ab2fdaa8c69bbecc2378 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Fri, 22 Jul 2022 12:09:00 +0100 Subject: [PATCH 1/5] fix(vite): ignore baseurl when pruning manifest --- packages/vite/src/manifest.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/vite/src/manifest.ts b/packages/vite/src/manifest.ts index fdd705e410f..f9236fffada 100644 --- a/packages/vite/src/manifest.ts +++ b/packages/vite/src/manifest.ts @@ -28,7 +28,9 @@ export async function writeManifest (ctx: ViteBuildContext, extraEntries: string ? devClientManifest : await fse.readJSON(resolve(clientDist, 'manifest.json')) - const BASE_RE = new RegExp(`^${escapeRE(withTrailingSlash(withoutLeadingSlash(joinURL(ctx.nuxt.options.app.baseURL, ctx.nuxt.options.app.buildAssetsDir))))}`) + const buildAssetsDir = withTrailingSlash(withoutLeadingSlash(ctx.nuxt.options.app.buildAssetsDir)) + const BASE_RE = new RegExp(`^${escapeRE(buildAssetsDir)}`) + for (const key in clientManifest) { if (clientManifest[key].file) { clientManifest[key].file = clientManifest[key].file.replace(BASE_RE, '') From 8f1d8a10cc85eefb66c58727ec923556832a30c6 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Fri, 22 Jul 2022 13:31:52 +0100 Subject: [PATCH 2/5] fix: apply more fixes for relative base --- packages/vite/src/client.ts | 5 +++-- packages/vite/src/server.ts | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/vite/src/client.ts b/packages/vite/src/client.ts index 3f38ba83a0e..6c06f967f7d 100644 --- a/packages/vite/src/client.ts +++ b/packages/vite/src/client.ts @@ -5,7 +5,7 @@ import viteJsxPlugin from '@vitejs/plugin-vue-jsx' import type { Connect } from 'vite' import { logger } from '@nuxt/kit' import { getPort } from 'get-port-please' -import { joinURL, withLeadingSlash, withoutLeadingSlash, withTrailingSlash } from 'ufo' +import { isRelative, joinURL, withLeadingSlash, withoutLeadingSlash, withTrailingSlash } from 'ufo' import escapeRE from 'escape-string-regexp' import { cacheDirPlugin } from './plugins/cache-dir' import { analyzePlugin } from './plugins/analyze' @@ -94,7 +94,8 @@ export async function buildClient (ctx: ViteBuildContext) { const viteServer = await vite.createServer(clientConfig) ctx.clientServer = viteServer await ctx.nuxt.callHook('vite:serverCreated', viteServer, { isClient: true, isServer: false }) - const BASE_RE = new RegExp(`^${escapeRE(withTrailingSlash(withLeadingSlash(joinURL(ctx.nuxt.options.app.baseURL, ctx.nuxt.options.app.buildAssetsDir))))}`) + const baseURL = joinURL(ctx.nuxt.options.app.baseURL.replace(/^\./, '') || '/', ctx.nuxt.options.app.buildAssetsDir) + const BASE_RE = new RegExp(`^${escapeRE(withTrailingSlash(withLeadingSlash(baseURL)))}`) const viteMiddleware: Connect.NextHandleFunction = (req, res, next) => { // Workaround: vite devmiddleware modifies req.url const originalURL = req.url diff --git a/packages/vite/src/server.ts b/packages/vite/src/server.ts index 0e76e49aef5..a2fbfed3bef 100644 --- a/packages/vite/src/server.ts +++ b/packages/vite/src/server.ts @@ -5,7 +5,7 @@ import viteJsxPlugin from '@vitejs/plugin-vue-jsx' import { logger, resolveModule, isIgnored } from '@nuxt/kit' import fse from 'fs-extra' import { debounce } from 'perfect-debounce' -import { joinURL, withoutLeadingSlash, withTrailingSlash } from 'ufo' +import { joinURL, withLeadingSlash, withoutLeadingSlash, withTrailingSlash } from 'ufo' import { ViteBuildContext, ViteOptions } from './vite' import { wpfs } from './utils/wpfs' import { cacheDirPlugin } from './plugins/cache-dir' @@ -18,7 +18,7 @@ export async function buildServer (ctx: ViteBuildContext) { const _resolve = id => resolveModule(id, { paths: ctx.nuxt.options.modulesDir }) const serverConfig: vite.InlineConfig = vite.mergeConfig(ctx.config, { base: ctx.nuxt.options.dev - ? joinURL(ctx.nuxt.options.app.baseURL, ctx.nuxt.options.app.buildAssetsDir) + ? joinURL(ctx.nuxt.options.app.baseURL.replace(/^\./, '') || '/', ctx.nuxt.options.app.buildAssetsDir) : undefined, experimental: { renderBuiltUrl: (filename, { type, hostType }) => { From 67d3a0321ea49875731523974b312e0e9aa16b4d Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Fri, 22 Jul 2022 13:34:31 +0100 Subject: [PATCH 3/5] test: add test case for relative baseURL --- test/basic.test.ts | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/test/basic.test.ts b/test/basic.test.ts index b4fcb492bf6..fefab873f54 100644 --- a/test/basic.test.ts +++ b/test/basic.test.ts @@ -377,10 +377,32 @@ describe('dynamic paths', () => { await startServer() const html = await $fetch('/foo/assets') + for (const match of html.matchAll(/(href|src)="(.`*?)"/g)) { + const url = match[2] + expect( + url.startsWith('/foo/_other/') || + url === '/foo/public.svg' || + // TODO: webpack does not yet support dynamic static paths + (process.env.TEST_WITH_WEBPACK && url === '/public.svg') + ).toBeTruthy() + } + }) + + it('should allow setting relative baseURL', async () => { + delete process.env.NUXT_APP_BUILD_ASSETS_DIR + process.env.NUXT_APP_BASE_URL = './' + await startServer() + + const html = await $fetch('/assets') for (const match of html.matchAll(/(href|src)="(.*?)"/g)) { const url = match[2] - // TODO: webpack does not yet support dynamic static paths - expect(url.startsWith('/foo/_other/') || url === '/foo/public.svg' || (process.env.TEST_WITH_WEBPACK && url === '/public.svg')).toBeTruthy() + expect( + url.startsWith('./_nuxt/') || + url === './public.svg' || + // TODO: webpack does not yet support dynamic static paths + (process.env.TEST_WITH_WEBPACK && url === '/public.svg') + ).toBeTruthy() + expect(url.startsWith('./_nuxt/_nuxt')).toBeFalsy() } }) @@ -402,8 +424,12 @@ describe('dynamic paths', () => { const html = await $fetch('/foo/assets') for (const match of html.matchAll(/(href|src)="(.*?)"/g)) { const url = match[2] - // TODO: webpack does not yet support dynamic static paths - expect(url.startsWith('https://example.com/_cdn/') || url === 'https://example.com/public.svg' || (process.env.TEST_WITH_WEBPACK && url === '/public.svg')).toBeTruthy() + expect( + url.startsWith('https://example.com/_cdn/') || + url === 'https://example.com/public.svg' || + // TODO: webpack does not yet support dynamic static paths + (process.env.TEST_WITH_WEBPACK && url === '/public.svg') + ).toBeTruthy() } }) }) From fcc17f8d1d784a0290dc56cb6320442ef7be332b Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Fri, 22 Jul 2022 13:39:53 +0100 Subject: [PATCH 4/5] fix: remove unused imports --- packages/vite/src/client.ts | 2 +- packages/vite/src/server.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vite/src/client.ts b/packages/vite/src/client.ts index 6c06f967f7d..751844e53ee 100644 --- a/packages/vite/src/client.ts +++ b/packages/vite/src/client.ts @@ -5,7 +5,7 @@ import viteJsxPlugin from '@vitejs/plugin-vue-jsx' import type { Connect } from 'vite' import { logger } from '@nuxt/kit' import { getPort } from 'get-port-please' -import { isRelative, joinURL, withLeadingSlash, withoutLeadingSlash, withTrailingSlash } from 'ufo' +import { joinURL, withLeadingSlash, withoutLeadingSlash, withTrailingSlash } from 'ufo' import escapeRE from 'escape-string-regexp' import { cacheDirPlugin } from './plugins/cache-dir' import { analyzePlugin } from './plugins/analyze' diff --git a/packages/vite/src/server.ts b/packages/vite/src/server.ts index a2fbfed3bef..6c51e496a50 100644 --- a/packages/vite/src/server.ts +++ b/packages/vite/src/server.ts @@ -5,7 +5,7 @@ import viteJsxPlugin from '@vitejs/plugin-vue-jsx' import { logger, resolveModule, isIgnored } from '@nuxt/kit' import fse from 'fs-extra' import { debounce } from 'perfect-debounce' -import { joinURL, withLeadingSlash, withoutLeadingSlash, withTrailingSlash } from 'ufo' +import { joinURL, withoutLeadingSlash, withTrailingSlash } from 'ufo' import { ViteBuildContext, ViteOptions } from './vite' import { wpfs } from './utils/wpfs' import { cacheDirPlugin } from './plugins/cache-dir' From 64e01a9284c7cf24f1ff573c2edaf0968dd8bfa2 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Fri, 22 Jul 2022 18:33:05 +0100 Subject: [PATCH 5/5] fix: explicitly replace only relative start --- packages/vite/src/server.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vite/src/server.ts b/packages/vite/src/server.ts index 6c51e496a50..d31af334341 100644 --- a/packages/vite/src/server.ts +++ b/packages/vite/src/server.ts @@ -18,7 +18,7 @@ export async function buildServer (ctx: ViteBuildContext) { const _resolve = id => resolveModule(id, { paths: ctx.nuxt.options.modulesDir }) const serverConfig: vite.InlineConfig = vite.mergeConfig(ctx.config, { base: ctx.nuxt.options.dev - ? joinURL(ctx.nuxt.options.app.baseURL.replace(/^\./, '') || '/', ctx.nuxt.options.app.buildAssetsDir) + ? joinURL(ctx.nuxt.options.app.baseURL.replace(/^\.\//, '/') || '/', ctx.nuxt.options.app.buildAssetsDir) : undefined, experimental: { renderBuiltUrl: (filename, { type, hostType }) => {