From aa8b7779935f9535c6970081db2d56f5f88d05e5 Mon Sep 17 00:00:00 2001 From: fxy060608 Date: Wed, 19 Jan 2022 15:36:41 +0800 Subject: [PATCH] fix(h5): serve static file (#3201) --- packages/uni-cli-shared/src/vite/utils/url.ts | 23 +++++++++++++++- .../src/plugin/configureServer/static.ts | 27 ++++++++++++++----- 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/packages/uni-cli-shared/src/vite/utils/url.ts b/packages/uni-cli-shared/src/vite/utils/url.ts index 104133136..3eee3087e 100644 --- a/packages/uni-cli-shared/src/vite/utils/url.ts +++ b/packages/uni-cli-shared/src/vite/utils/url.ts @@ -32,9 +32,30 @@ export function parseVueRequest(id: string) { } } -const importQueryRE = /(\?|&)import(?:&|$)/ +const importQueryRE = /(\?|&)import=?(?:&|$)/ export const isImportRequest = (url: string) => importQueryRE.test(url) +/** + * Prefix for resolved fs paths, since windows paths may not be valid as URLs. + */ +export const FS_PREFIX = `/@fs/` + +/** + * Prefix for resolved Ids that are not valid browser import specifiers + */ +export const VALID_ID_PREFIX = `/@id/` +export const CLIENT_PUBLIC_PATH = `/@vite/client` +export const ENV_PUBLIC_PATH = `/@vite/env` +const internalPrefixes = [ + FS_PREFIX, + VALID_ID_PREFIX, + CLIENT_PUBLIC_PATH, + ENV_PUBLIC_PATH, +] +const InternalPrefixRE = new RegExp(`^(?:${internalPrefixes.join('|')})`) +export const isInternalRequest = (url: string): boolean => + InternalPrefixRE.test(url) + export const queryRE = /\?.*$/ export const hashRE = /#.*$/ diff --git a/packages/uni-h5-vite/src/plugin/configureServer/static.ts b/packages/uni-h5-vite/src/plugin/configureServer/static.ts index ace7ce413..448f3b3f8 100644 --- a/packages/uni-h5-vite/src/plugin/configureServer/static.ts +++ b/packages/uni-h5-vite/src/plugin/configureServer/static.ts @@ -1,10 +1,11 @@ import fs from 'fs' import path from 'path' import debug from 'debug' -import type { ViteDevServer } from 'vite' +import type { Connect, ViteDevServer } from 'vite' import { createFilter } from '@rollup/pluginutils' import { isImportRequest, + isInternalRequest, normalizePath, PUBLIC_DIR, } from '@dcloudio/uni-cli-shared' @@ -34,13 +35,25 @@ export const initStatic = (server: ViteDevServer) => { } }, }) - server.middlewares.use((req, res, next) => { - // skip import request - if (isImportRequest(req.url!)) { - return next() + const viteServePublicMiddlewareIndex = server.middlewares.stack.findIndex( + (middleware) => { + return ( + (middleware.handle as Function).name === 'viteServePublicMiddleware' + ) } - return serve(req, res, next) - }) + ) + // 替换 vite 自带的 public middleware + if (viteServePublicMiddlewareIndex > -1) { + server.middlewares.stack.splice(viteServePublicMiddlewareIndex, 1, { + route: '', + handle: ((req, res, next) => { + if (isImportRequest(req.url!) || isInternalRequest(req.url!)) { + return next() + } + return serve(req, res, next) + }) as Connect.NextHandleFunction, + }) + } } export function createPublicFileFilter(base: string = '/') { -- GitLab