Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(ssr): skip resolving browser field for SSR build #3039

Merged
merged 2 commits into from
Apr 21, 2021
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 33 additions & 12 deletions packages/vite/src/node/plugins/resolve.ts
Original file line number Diff line number Diff line change
Expand Up @@ -176,11 +176,14 @@ export function resolvePlugin(baseOptions: InternalResolveOptions): Plugin {
return res
}

if ((res = tryResolveBrowserMapping(id, importer, options, false))) {
if (
!ssr &&
(res = tryResolveBrowserMapping(id, importer, options, false))
) {
return res
}

if ((res = tryNodeResolve(id, importer, options, server))) {
if ((res = tryNodeResolve(id, importer, options, ssr, server))) {
return res
}

Expand Down Expand Up @@ -228,7 +231,8 @@ export function resolvePlugin(baseOptions: InternalResolveOptions): Plugin {
function tryFsResolve(
fsPath: string,
options: InternalResolveOptions,
tryIndex = true
tryIndex = true,
ssr?: boolean
): string | undefined {
let file = fsPath
let postfix = ''
Expand All @@ -244,7 +248,14 @@ function tryFsResolve(

let res: string | undefined
if (
(res = tryResolveFile(file, postfix, options, false, options.tryPrefix))
(res = tryResolveFile(
file,
postfix,
options,
false,
ssr,
options.tryPrefix
))
) {
return res
}
Expand All @@ -256,6 +267,7 @@ function tryFsResolve(
postfix,
options,
false,
ssr,
options.tryPrefix
))
) {
Expand All @@ -264,7 +276,14 @@ function tryFsResolve(
}

if (
(res = tryResolveFile(file, postfix, options, tryIndex, options.tryPrefix))
(res = tryResolveFile(
file,
postfix,
options,
tryIndex,
ssr,
options.tryPrefix
))
) {
return res
}
Expand All @@ -275,6 +294,7 @@ function tryResolveFile(
postfix: string,
options: InternalResolveOptions,
tryIndex: boolean,
ssr?: boolean,
tryPrefix?: string
): string | undefined {
let isReadable = false
Expand All @@ -293,15 +313,15 @@ function tryResolveFile(
if (fs.existsSync(pkgPath)) {
// path points to a node package
const pkg = loadPackageData(pkgPath)
return resolvePackageEntry(file, pkg, options)
return resolvePackageEntry(file, pkg, options, ssr)
}
const index = tryFsResolve(file + '/index', options)
if (index) return index + postfix
}
}
if (tryPrefix) {
const prefixed = `${path.dirname(file)}/${tryPrefix}${path.basename(file)}`
return tryResolveFile(prefixed, postfix, options, tryIndex)
return tryResolveFile(prefixed, postfix, options, tryIndex, ssr)
}
}

Expand All @@ -311,6 +331,7 @@ export function tryNodeResolve(
id: string,
importer: string | undefined,
options: InternalResolveOptions,
ssr?: boolean,
server?: ViteDevServer
): PartialResolvedId | undefined {
const { root, dedupe, isBuild } = options
Expand Down Expand Up @@ -338,7 +359,7 @@ export function tryNodeResolve(

let resolved = deepMatch
? resolveDeepImport(id, pkg, options)
: resolvePackageEntry(id, pkg, options)
: resolvePackageEntry(id, pkg, options, ssr)
if (!resolved) {
return
}
Expand Down Expand Up @@ -466,12 +487,12 @@ function loadPackageData(pkgPath: string, cacheKey = pkgPath) {
export function resolvePackageEntry(
id: string,
{ resolvedImports, dir, data }: PackageData,
options: InternalResolveOptions
options: InternalResolveOptions,
ssr?: boolean
): string | undefined {
if (resolvedImports['.']) {
return resolvedImports['.']
}

let entryPoint: string | undefined | void

// resolve exports field with highest priority
Expand All @@ -484,7 +505,7 @@ export function resolvePackageEntry(
// This is because .mjs files can technically import .cjs files which would
// make them invalid for pure ESM environments - so if other module/browser
// fields are present, prioritize those instead.
if (!entryPoint || entryPoint.endsWith('.mjs')) {
if (!ssr && (!entryPoint || entryPoint.endsWith('.mjs'))) {
// check browser field
// https://github.com/defunctzombie/package-browser-field-spec
const browserEntry =
Expand Down Expand Up @@ -534,7 +555,7 @@ export function resolvePackageEntry(

// resolve object browser field in package.json
const { browser: browserField } = data
if (isObject(browserField)) {
if (!ssr && isObject(browserField)) {
entryPoint = mapWithBrowserField(entryPoint, browserField) || entryPoint
}

Expand Down
2 changes: 1 addition & 1 deletion packages/vite/src/node/ssr/ssrExternal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ export function resolveSSRExternal(
let entry
let requireEntry
try {
entry = tryNodeResolve(id, undefined, resolveOptions)?.id
entry = tryNodeResolve(id, undefined, resolveOptions, true)?.id
requireEntry = require.resolve(id, { paths: [root] })
} catch (e) {
// resolve failed, assume include
Expand Down