From 3867db67ec1923777c62b85287aa8b8c1c2b36b2 Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Sun, 4 Jun 2023 18:57:24 +0900 Subject: [PATCH] feat: import public non-asset URL --- packages/vite/src/node/plugins/asset.ts | 4 +-- .../vite/src/node/plugins/importAnalysis.ts | 16 ++++++++---- .../src/node/server/middlewares/transform.ts | 25 +++++++++++++------ playground/assets/__tests__/assets.spec.ts | 13 ++++++++++ playground/assets/index.html | 11 ++++++++ playground/assets/static/foo.json | 3 +++ 6 files changed, 57 insertions(+), 15 deletions(-) create mode 100644 playground/assets/static/foo.json diff --git a/packages/vite/src/node/plugins/asset.ts b/packages/vite/src/node/plugins/asset.ts index 174b3e5826646c..bf6ce07dd49fa1 100644 --- a/packages/vite/src/node/plugins/asset.ts +++ b/packages/vite/src/node/plugins/asset.ts @@ -28,7 +28,7 @@ import { FS_PREFIX } from '../constants' export const assetUrlRE = /__VITE_ASSET__([a-z\d]+)__(?:\$_(.*?)__)?/g const rawRE = /(?:\?|&)raw(?:&|$)/ -const urlRE = /(\?|&)url(?:&|$)/ +export const urlRE = /(\?|&)url(?:&|$)/ const jsSourceMapRE = /\.[cm]?js\.map$/ const unnededFinalQueryCharRE = /[?&]$/ @@ -146,7 +146,7 @@ export function assetPlugin(config: ResolvedConfig): Plugin { }, resolveId(id) { - if (!config.assetsInclude(cleanUrl(id))) { + if (!config.assetsInclude(cleanUrl(id)) && !urlRE.test(id)) { return } // imports to absolute urls pointing to files in /public diff --git a/packages/vite/src/node/plugins/importAnalysis.ts b/packages/vite/src/node/plugins/importAnalysis.ts index 21f8b807fa13c7..e820f005eac4a4 100644 --- a/packages/vite/src/node/plugins/importAnalysis.ts +++ b/packages/vite/src/node/plugins/importAnalysis.ts @@ -54,7 +54,7 @@ import { shouldExternalizeForSSR, } from '../ssr/ssrExternal' import { getDepsOptimizer, optimizedDepNeedsInterop } from '../optimizer' -import { checkPublicFile } from './asset' +import { checkPublicFile, urlRE } from './asset' import { ERR_OUTDATED_OPTIMIZED_DEP, throwOutdatedRequest, @@ -506,14 +506,20 @@ export function importAnalysisPlugin(config: ResolvedConfig): Plugin { // warn imports to non-asset /public files if ( specifier[0] === '/' && - !config.assetsInclude(cleanUrl(specifier)) && - !specifier.endsWith('.json') && + !( + config.assetsInclude(cleanUrl(specifier)) || + urlRE.test(specifier) + ) && checkPublicFile(specifier, config) ) { throw new Error( - `Cannot import non-asset file ${specifier} which is inside /public.` + + `Cannot import non-asset file ${specifier} which is inside /public. ` + `JS/CSS files inside /public are copied as-is on build and ` + - `can only be referenced via