From 8e288039a871b56803a7a5b66cc3766b6c2267db Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 28 Jan 2021 11:05:04 -0500 Subject: [PATCH] fix: hold missing dep requests while re-bundling --- .../src/node/optimizer/registerMissing.ts | 28 +++++++++---------- packages/vite/src/node/plugins/resolve.ts | 4 ++- .../src/node/server/middlewares/transform.ts | 9 +++++- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/packages/vite/src/node/optimizer/registerMissing.ts b/packages/vite/src/node/optimizer/registerMissing.ts index 16db330942158e..86b8fe635e112e 100644 --- a/packages/vite/src/node/optimizer/registerMissing.ts +++ b/packages/vite/src/node/optimizer/registerMissing.ts @@ -44,20 +44,6 @@ export function createMissingImpoterRegisterFn(server: ViteDevServer) { newDeps )) knownOptimized = newData!.optimized - - // Importers' cached transform results have stale imports (resolved to - // old locations) so they need to be invalidated before the page is - // reloaded. - currentImporters.forEach((importer) => { - const mod = server.moduleGraph.getModuleById(importer) - if (mod) server.moduleGraph.invalidateModule(mod) - }) - currentImporters.clear() - - server.ws.send({ - type: 'full-reload', - path: '*' - }) } catch (e) { logger.error( chalk.red(`error while updating dependencies:\n${e.stack}`), @@ -71,6 +57,20 @@ export function createMissingImpoterRegisterFn(server: ViteDevServer) { logger.info(chalk.greenBright(`✨ dependencies updated.`), { timestamp: true }) + + // Importers' cached transform results have stale imports (resolved to + // old locations) so they need to be invalidated before the page is + // reloaded. + currentImporters.forEach((importer) => { + const mod = server.moduleGraph.getModuleById(importer) + if (mod) server.moduleGraph.invalidateModule(mod) + }) + currentImporters.clear() + + server.ws.send({ + type: 'full-reload', + path: '*' + }) } return function registerMissingImport( diff --git a/packages/vite/src/node/plugins/resolve.ts b/packages/vite/src/node/plugins/resolve.ts index 97da826c0281f8..ab1f34523edfc2 100644 --- a/packages/vite/src/node/plugins/resolve.ts +++ b/packages/vite/src/node/plugins/resolve.ts @@ -45,6 +45,7 @@ function resolveExports( // special id for paths marked with browser: false // https://github.com/defunctzombie/package-browser-field-spec#ignore-a-module export const browserExternalId = '__vite-browser-external' +export const pendingDepId = '__vite-pending-dep' const isDebug = process.env.DEBUG const debug = createDebugger('vite:resolve-details', { @@ -365,12 +366,13 @@ export function tryNodeResolve( if (versionHash) { resolved = injectQuery(resolved, `v=${versionHash}`) } + return { id: resolved } } else { // this is a missing import. // queue optimize-deps re-run. server._registerMissingImport?.(id, resolved, importer) + return { id: pendingDepId } } - return { id: resolved } } } diff --git a/packages/vite/src/node/server/middlewares/transform.ts b/packages/vite/src/node/server/middlewares/transform.ts index fb2f13f193bf68..336a21b74f7618 100644 --- a/packages/vite/src/node/server/middlewares/transform.ts +++ b/packages/vite/src/node/server/middlewares/transform.ts @@ -1,6 +1,5 @@ import { ViteDevServer } from '..' import { Connect } from 'types/connect' -import { isCSSRequest, isDirectCSSRequest } from '../../plugins/css' import { cleanUrl, createDebugger, @@ -21,6 +20,8 @@ import { NULL_BYTE_PLACEHOLDER, VALID_ID_PREFIX } from '../../constants' +import { pendingDepId } from '../../plugins/resolve' +import { isCSSRequest, isDirectCSSRequest } from '../../plugins/css' const debugCache = createDebugger('vite:cache') const isDebug = !!process.env.DEBUG @@ -44,6 +45,12 @@ export function transformMiddleware( return next() } + if (server._pendingReload && req.url!.endsWith(pendingDepId)) { + // missing dep pending reload, hold request + server._pendingReload.then(() => res.end()) + return + } + let url = decodeURI(removeTimestampQuery(req.url!)).replace( NULL_BYTE_PLACEHOLDER, '\0'