Skip to content

Commit de60f1e

Browse files
authoredMar 17, 2024··
perf(transformRequest): fast-path watch and sourcemap handling (#16170)
1 parent 50caf67 commit de60f1e

File tree

2 files changed

+45
-24
lines changed

2 files changed

+45
-24
lines changed
 

‎packages/vite/src/node/server/sourcemap.ts

+31-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import path from 'node:path'
22
import fsp from 'node:fs/promises'
3+
import convertSourceMap from 'convert-source-map'
34
import type { ExistingRawSourceMap, SourceMap } from 'rollup'
45
import type { Logger } from '../logger'
5-
import { createDebugger } from '../utils'
6+
import { blankReplacer, createDebugger } from '../utils'
67

78
const debug = createDebugger('vite:sourcemap', {
89
onlyWhenFocused: true,
@@ -143,3 +144,32 @@ export function applySourcemapIgnoreList(
143144
if (!map.x_google_ignoreList) map.x_google_ignoreList = x_google_ignoreList
144145
}
145146
}
147+
148+
export async function extractSourcemapFromFile(
149+
code: string,
150+
filePath: string,
151+
): Promise<{ code: string; map: SourceMap } | undefined> {
152+
const map = (
153+
convertSourceMap.fromSource(code) ||
154+
(await convertSourceMap.fromMapFileSource(
155+
code,
156+
createConvertSourceMapReadMap(filePath),
157+
))
158+
)?.toObject()
159+
160+
if (map) {
161+
return {
162+
code: code.replace(convertSourceMap.mapFileCommentRegex, blankReplacer),
163+
map,
164+
}
165+
}
166+
}
167+
168+
function createConvertSourceMapReadMap(originalFileName: string) {
169+
return (filename: string) => {
170+
return fsp.readFile(
171+
path.resolve(path.dirname(originalFileName), filename),
172+
'utf-8',
173+
)
174+
}
175+
}

‎packages/vite/src/node/server/transformRequest.ts

+14-23
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,12 @@ import fsp from 'node:fs/promises'
22
import path from 'node:path'
33
import { performance } from 'node:perf_hooks'
44
import getEtag from 'etag'
5-
import convertSourceMap from 'convert-source-map'
65
import MagicString from 'magic-string'
76
import { init, parse as parseImports } from 'es-module-lexer'
87
import type { PartialResolvedId, SourceDescription, SourceMap } from 'rollup'
98
import colors from 'picocolors'
109
import type { ModuleNode, ViteDevServer } from '..'
1110
import {
12-
blankReplacer,
1311
createDebugger,
1412
ensureWatchedFile,
1513
injectQuery,
@@ -24,7 +22,11 @@ import { checkPublicFile } from '../publicDir'
2422
import { isDepsOptimizerEnabled } from '../config'
2523
import { getDepsOptimizer, initDevSsrDepsOptimizer } from '../optimizer'
2624
import { cleanUrl, unwrapId } from '../../shared/utils'
27-
import { applySourcemapIgnoreList, injectSourcesContent } from './sourcemap'
25+
import {
26+
applySourcemapIgnoreList,
27+
extractSourcemapFromFile,
28+
injectSourcesContent,
29+
} from './sourcemap'
2830
import { isFileServingAllowed } from './middlewares/static'
2931
import { throwClosedServerError } from './pluginContainer'
3032

@@ -263,21 +265,19 @@ async function loadAndTransform(
263265
throw e
264266
}
265267
}
266-
ensureWatchedFile(server.watcher, file, config.root)
268+
if (code != null) {
269+
ensureWatchedFile(server.watcher, file, config.root)
270+
}
267271
}
268272
if (code) {
269273
try {
270-
map = (
271-
convertSourceMap.fromSource(code) ||
272-
(await convertSourceMap.fromMapFileSource(
273-
code,
274-
createConvertSourceMapReadMap(file),
275-
))
276-
)?.toObject()
277-
278-
code = code.replace(convertSourceMap.mapFileCommentRegex, blankReplacer)
274+
const extracted = await extractSourcemapFromFile(code, file)
275+
if (extracted) {
276+
code = extracted.code
277+
map = extracted.map
278+
}
279279
} catch (e) {
280-
logger.warn(`Failed to load source map for ${url}.`, {
280+
logger.warn(`Failed to load source map for ${file}.\n${e}`, {
281281
timestamp: true,
282282
})
283283
}
@@ -406,15 +406,6 @@ async function loadAndTransform(
406406
return result
407407
}
408408

409-
function createConvertSourceMapReadMap(originalFileName: string) {
410-
return (filename: string) => {
411-
return fsp.readFile(
412-
path.resolve(path.dirname(originalFileName), filename),
413-
'utf-8',
414-
)
415-
}
416-
}
417-
418409
/**
419410
* When a module is soft-invalidated, we can preserve its previous `transformResult` and
420411
* return similar code to before:

0 commit comments

Comments
 (0)
Please sign in to comment.