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

Use fallbackable path module for node and edge runtime #36306

Merged
merged 7 commits into from Apr 21, 2022
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 4 additions & 1 deletion packages/next/lib/constants.ts
@@ -1,4 +1,7 @@
import { join } from 'path'
import path from '../shared/lib/fallback/path'

const { join } = path
huozhi marked this conversation as resolved.
Show resolved Hide resolved

export const NEXT_PROJECT_ROOT = join(__dirname, '..', '..')
export const NEXT_PROJECT_ROOT_DIST = join(NEXT_PROJECT_ROOT, 'dist')
export const NEXT_PROJECT_ROOT_NODE_MODULES = join(
Expand Down
17 changes: 7 additions & 10 deletions packages/next/server/base-server.ts
Expand Up @@ -18,13 +18,10 @@ import type { PagesManifest } from '../build/webpack/plugins/pages-manifest-plug
import type { BaseNextRequest, BaseNextResponse } from './base-http'
import type { PayloadOptions } from './send-payload'

import { join, resolve } from 'path'
import { parse as parseQs } from 'querystring'
import { format as formatUrl, parse as parseUrl } from 'url'
import { getRedirectStatus } from '../lib/load-custom-routes'
import {
SERVERLESS_DIRECTORY,
SERVER_DIRECTORY,
STATIC_STATUS_PAGES,
TEMPORARY_REDIRECT_STATUS,
} from '../shared/lib/constants'
Expand Down Expand Up @@ -182,6 +179,9 @@ export default abstract class Server {
public readonly hostname?: string
public readonly port?: number

protected abstract getDir(_dir: string): string
protected abstract getDistDir(): string
protected abstract getPagesDir(): string
huozhi marked this conversation as resolved.
Show resolved Hide resolved
protected abstract getPublicDir(): string
protected abstract getHasStaticDir(): boolean
protected abstract getPagesManifest(): PagesManifest | undefined
Expand Down Expand Up @@ -271,7 +271,7 @@ export default abstract class Server {
hostname,
port,
}: Options) {
this.dir = resolve(dir)
this.dir = this.getDir(dir)
this.quiet = quiet
this.loadEnvConfig({ dev })

Expand All @@ -280,7 +280,7 @@ export default abstract class Server {
this.nextConfig = conf as NextConfigComplete
this.hostname = hostname
this.port = port
this.distDir = join(this.dir, this.nextConfig.distDir)
this.distDir = this.getDistDir()
this.publicDir = this.getPublicDir()
this.hasStaticDir = !minimalMode && this.getHasStaticDir()

Expand Down Expand Up @@ -350,15 +350,12 @@ export default abstract class Server {
this.router = new Router(this.generateRoutes())
this.setAssetPrefix(assetPrefix)

const pagesDir = this.getPagesDir()
this.incrementalCache = new IncrementalCache({
fs: this.getCacheFilesystem(),
dev,
distDir: this.distDir,
pagesDir: join(
this.distDir,
this._isLikeServerless ? SERVERLESS_DIRECTORY : SERVER_DIRECTORY,
'pages'
),
pagesDir,
locales: this.nextConfig.i18n?.locales,
max: this.nextConfig.experimental.isrMemoryCacheSize,
flushToDisk: !minimalMode && this.nextConfig.experimental.isrFlushToDisk,
Expand Down
2 changes: 1 addition & 1 deletion packages/next/server/incremental-cache.ts
@@ -1,7 +1,7 @@
import type { CacheFs } from '../shared/lib/utils'

import LRUCache from 'next/dist/compiled/lru-cache'
import path from 'path'
import path from '../shared/lib/fallback/path'
import { PrerenderManifest } from '../build'
import { normalizePagePath } from './normalize-page-path'
import { IncrementalCacheValue, IncrementalCacheEntry } from './response-cache'
Expand Down
16 changes: 16 additions & 0 deletions packages/next/server/next-server.ts
Expand Up @@ -147,10 +147,26 @@ export default class NextNodeServer extends BaseServer {
loadEnvConfig(this.dir, dev, Log)
}

protected getDir(_dir: string): string {
return resolve(_dir)
}

protected getPublicDir(): string {
return join(this.dir, CLIENT_PUBLIC_FILES_PATH)
}

protected getDistDir(): string {
return join(this.dir, this.nextConfig.distDir)
}

protected getPagesDir(): string {
return join(
this.distDir,
this._isLikeServerless ? SERVERLESS_DIRECTORY : SERVER_DIRECTORY,
'pages'
)
}

protected getHasStaticDir(): boolean {
return fs.existsSync(join(this.dir, 'static'))
}
Expand Down
4 changes: 3 additions & 1 deletion packages/next/server/normalize-page-path.ts
@@ -1,6 +1,8 @@
import { posix } from 'path'
import path from '../shared/lib/fallback/path'
import { isDynamicRoute } from '../shared/lib/router/utils'

const { posix } = path

export { normalizePathSep, denormalizePagePath } from './denormalize-page-path'

export function normalizePagePath(page: string): string {
Expand Down
5 changes: 3 additions & 2 deletions packages/next/server/render.tsx
@@ -1,4 +1,5 @@
import type { IncomingMessage, ServerResponse } from 'http'
import type { ParsedUrlQuery } from 'querystring'
import type { NextRouter } from '../shared/lib/router/router'
import type { HtmlProps } from '../shared/lib/html-context'
import type { DomainLocale } from './config'
Expand All @@ -20,7 +21,6 @@ import type { GetServerSideProps, GetStaticProps, PreviewData } from '../types'
import type { UnwrapPromise } from '../lib/coalesced-function'

import React from 'react'
import { ParsedUrlQuery, stringify as stringifyQuery } from 'querystring'
import { createFromReadableStream } from 'next/dist/compiled/react-server-dom-webpack'
import { renderToReadableStream } from 'next/dist/compiled/react-server-dom-webpack/writer.browser.server'
import { StyleRegistry, createStyleRegistry } from 'styled-jsx'
Expand Down Expand Up @@ -79,6 +79,7 @@ import { ImageConfigContext } from '../shared/lib/image-config-context'
import { FlushEffectsContext } from '../shared/lib/flush-effects'
import { interopDefault } from '../lib/interop-default'
import stripAnsi from 'next/dist/compiled/strip-ansi'
import { urlQueryToSearchParams } from '../shared/lib/router/utils/querystring'

let optimizeAmp: typeof import('./optimize-amp').default
let getFontDefinitionFromManifest: typeof import('./font-utils').getFontDefinitionFromManifest
Expand Down Expand Up @@ -518,7 +519,7 @@ export async function renderToHTML(

if (isServerComponent) {
serverComponentsInlinedTransformStream = new TransformStream()
const search = stringifyQuery(query)
const search = urlQueryToSearchParams(query).toString()
Component = createServerComponentRenderer(AppMod, ComponentMod, {
cachePrefix: pathname + (search ? `?${search}` : ''),
inlinedTransformStream: serverComponentsInlinedTransformStream,
Expand Down
14 changes: 13 additions & 1 deletion packages/next/server/web-server.ts
Expand Up @@ -5,8 +5,9 @@ import type { NextParsedUrlQuery } from './request-meta'
import type { Params } from './router'
import type { PayloadOptions } from './send-payload'
import type { LoadComponentsReturnType } from './load-components'
import type { Options } from './base-server'

import BaseServer, { Options } from './base-server'
import BaseServer from './base-server'
import { renderToHTML } from './render'
import { byteLength, generateETag } from './api-utils/web'

Expand All @@ -20,9 +21,11 @@ export default class NextWebServer extends BaseServer {

constructor(options: Options & { webServerConfig: WebServerConfig }) {
super(options)

this.webServerConfig = options.webServerConfig
Object.assign(this.renderOpts, options.webServerConfig.extendRenderOpts)
}

protected generateRewrites() {
// @TODO: assuming minimal mode right now
return {
Expand Down Expand Up @@ -50,10 +53,19 @@ export default class NextWebServer extends BaseServer {
// @TODO
return ''
}
protected getDir() {
return '.'
}
protected getPublicDir() {
// Public files are not handled by the web server.
return ''
}
protected getDistDir() {
return ''
}
protected getPagesDir() {
return ''
}
protected getBuildId() {
return (globalThis as any).__server_context.buildId
}
Expand Down
5 changes: 5 additions & 0 deletions packages/next/shared/lib/fallback/path.ts
@@ -0,0 +1,5 @@
const path = process.browser
? require('next/dist/compiled/path-browserify')
: require('path')

export default path
2 changes: 1 addition & 1 deletion packages/next/shared/lib/router/utils/querystring.ts
@@ -1,4 +1,4 @@
import { ParsedUrlQuery } from 'querystring'
import type { ParsedUrlQuery } from 'querystring'

export function searchParamsToUrlQuery(
searchParams: URLSearchParams
Expand Down
5 changes: 5 additions & 0 deletions packages/next/types/misc.d.ts
Expand Up @@ -340,6 +340,11 @@ declare module 'next/dist/compiled/process' {
export = m
}

declare module 'next/dist/compiled/path-browserify' {
import m from 'path'
export = m
}

declare module 'pnp-webpack-plugin' {
import webpack from 'webpack4'

Expand Down
4 changes: 4 additions & 0 deletions test/integration/react-18/app/pages/index.js
Expand Up @@ -19,3 +19,7 @@ export default function Index() {
</div>
)
}

export const config = {
// runtime: 'edge'
}
3 changes: 3 additions & 0 deletions test/integration/react-18/test/index.test.js
Expand Up @@ -21,6 +21,7 @@ import webdriver from 'next-webdriver'
const appDir = join(__dirname, '../app')
const nextConfig = new File(join(appDir, 'next.config.js'))
const invalidPage = new File(join(appDir, 'pages/invalid.js'))
const indexPage = new File(join(appDir, 'pages/index.js'))

describe('Basics', () => {
runTests('default setting with react 18', basics)
Expand Down Expand Up @@ -67,12 +68,14 @@ function runTestsAgainstRuntime(runtime) {
invalidPage.write(`export const value = 1`)
}
nextConfig.replace("// runtime: 'edge'", `runtime: '${runtime}'`)
indexPage.replace("// runtime: 'edge'", `runtime: '${runtime}'`)
},
afterAll: (env) => {
if (env === 'dev') {
invalidPage.delete()
}
nextConfig.restore()
indexPage.restore()
},
}
)
Expand Down