Skip to content

Commit

Permalink
feat(vite): full source-map support for ssr
Browse files Browse the repository at this point in the history
  • Loading branch information
DylanPiercey committed May 7, 2021
1 parent 70536b4 commit 744bb6a
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 100 deletions.
7 changes: 3 additions & 4 deletions packages/vite/src/node/server/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@ import { TransformOptions as EsbuildTransformOptions } from 'esbuild'
import { DepOptimizationMetadata, optimizeDeps } from '../optimizer'
import { ssrLoadModule } from '../ssr/ssrModuleLoader'
import { resolveSSRExternal } from '../ssr/ssrExternal'
import { ssrRewriteStacktrace } from '../ssr/ssrStacktrace'
import { createMissingImporterRegisterFn } from '../optimizer/registerMissing'

export interface ServerOptions {
Expand Down Expand Up @@ -319,9 +318,9 @@ export async function createServer(
return ssrLoadModule(url, server)
},
ssrFixStacktrace(e) {
if (e.stack) {
e.stack = ssrRewriteStacktrace(e.stack, moduleGraph)
}
this.config.logger.warn(
`ViteDevServer.ssrFixStacktrace is deprecated. Use "node --enable-source-maps" or "node -r source-map-support/register" instead.`
)
},
listen(port?: number, isRestart?: boolean) {
return startServer(server, port, isRestart)
Expand Down
10 changes: 1 addition & 9 deletions packages/vite/src/node/server/send.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { IncomingMessage, ServerResponse } from 'http'
import getEtag from 'etag'
import { SourceMap } from 'rollup'
import { genSourceMapString } from './sourcemap'

const isDebug = process.env.DEBUG

Expand Down Expand Up @@ -43,12 +44,3 @@ export function send(
res.statusCode = 200
return res.end(content)
}

function genSourceMapString(map: SourceMap | string | undefined) {
if (typeof map !== 'string') {
map = JSON.stringify(map)
}
return `\n//# sourceMappingURL=data:application/json;base64,${Buffer.from(
map
).toString('base64')}`
}
10 changes: 10 additions & 0 deletions packages/vite/src/node/server/sourcemap.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { promises as fs } from 'fs'
import path from 'path'
import { SourceMap } from 'rollup'

export async function injectSourcesContent(
map: { sources: string[]; sourcesContent?: string[]; sourceRoot?: string },
Expand All @@ -18,3 +19,12 @@ export async function injectSourcesContent(
})
)
}

export function genSourceMapString(map: SourceMap | string | undefined) {
if (typeof map !== 'string') {
map = JSON.stringify(map)
}
return `\n//# sourceMappingURL=data:application/json;base64,${Buffer.from(
map
).toString('base64')}`
}
57 changes: 28 additions & 29 deletions packages/vite/src/node/ssr/ssrModuleLoader.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import fs from 'fs'
import vm from 'vm'
import path from 'path'
import { ViteDevServer } from '..'
import { cleanUrl, resolveFrom, unwrapId } from '../utils'
import { ssrRewriteStacktrace } from './ssrStacktrace'
import {
ssrExportAllKey,
ssrModuleExportsKey,
Expand All @@ -11,6 +11,7 @@ import {
ssrDynamicImportKey
} from './ssrTransform'
import { transformRequest } from '../server/transformRequest'
import { genSourceMapString } from '../server/sourcemap'

interface SSRContext {
global: NodeJS.Global
Expand Down Expand Up @@ -118,34 +119,32 @@ async function instantiateModule(
}
}

try {
new Function(
`global`,
ssrModuleExportsKey,
ssrImportMetaKey,
ssrImportKey,
ssrDynamicImportKey,
ssrExportAllKey,
result.code + `\n//# sourceURL=${mod.url}`
)(
context.global,
ssrModule,
ssrImportMeta,
ssrImport,
ssrDynamicImport,
ssrExportAll
)
} catch (e) {
e.stack = ssrRewriteStacktrace(e.stack, moduleGraph)
server.config.logger.error(
`Error when evaluating SSR module ${url}:\n${e.stack}`,
{
timestamp: true,
clear: server.config.clearScreen
}
)
throw e
}
vm.runInNewContext(
result.code +
genSourceMapString(
result.map
? mod.file
? {
...result.map,
// When we have a file, we can let node handle sourcesContent
sources: [mod.file],
sourcesContent: []
}
: result.map
: undefined
),
{
global: context.global,
[ssrModuleExportsKey]: ssrModule,
[ssrImportMetaKey]: ssrImportMeta,
[ssrImportKey]: ssrImport,
[ssrDynamicImportKey]: ssrDynamicImport,
[ssrExportAllKey]: ssrExportAll
},
{
filename: mod.file || mod.url
}
)

mod.ssrModule = Object.freeze(ssrModule)
return ssrModule
Expand Down
58 changes: 0 additions & 58 deletions packages/vite/src/node/ssr/ssrStacktrace.ts

This file was deleted.

0 comments on commit 744bb6a

Please sign in to comment.