diff --git a/packages/next-server/lib/router/router.ts b/packages/next-server/lib/router/router.ts index dc14affa8eed1f297228a1c22c9fc01aa5a3a011..a033ece169b2f515b6571c2759ad06aee2a041b2 100644 --- a/packages/next-server/lib/router/router.ts +++ b/packages/next-server/lib/router/router.ts @@ -15,6 +15,7 @@ import { import { rewriteUrlForNextExport } from './rewrite-url-for-export' import { getRouteMatcher } from './utils/route-matcher' import { getRouteRegex } from './utils/route-regex' +import { isDynamicRoute } from './utils/is-dynamic' function toRoute(path: string): string { return path.replace(/\/$/, '') || '/' @@ -273,8 +274,7 @@ export default class Router implements BaseRouter { const route = toRoute(pathname) const { shallow = false } = options - // detect dynamic routing - if (route.indexOf('/$') !== -1) { + if (isDynamicRoute(route)) { const { pathname: asPathname } = parse(as) const rr = getRouteRegex(route) const routeMatch = getRouteMatcher(rr)(asPathname) diff --git a/packages/next-server/lib/router/utils/index.ts b/packages/next-server/lib/router/utils/index.ts index 6cd5b5e8b57ff4cde519bb256027898f1c05747a..561c279631632a30a8ecd1eb1207ed803a2d8499 100644 --- a/packages/next-server/lib/router/utils/index.ts +++ b/packages/next-server/lib/router/utils/index.ts @@ -1,3 +1,4 @@ export { getRouteMatcher } from './route-matcher' export { getRouteRegex } from './route-regex' export { getSortedRoutes } from './sorted-routes' +export { isDynamicRoute } from './is-dynamic' diff --git a/packages/next-server/lib/router/utils/is-dynamic.ts b/packages/next-server/lib/router/utils/is-dynamic.ts new file mode 100644 index 0000000000000000000000000000000000000000..aa161c5e4cfa0bbc872b5f072f4dd9e1eda49ce7 --- /dev/null +++ b/packages/next-server/lib/router/utils/is-dynamic.ts @@ -0,0 +1,3 @@ +export function isDynamicRoute(route: string): boolean { + return route.indexOf('/$') !== -1 +} diff --git a/packages/next-server/server/next-server.ts b/packages/next-server/server/next-server.ts index 7b2c1539750b6529d9a10ed210ab475058cce2d3..fd6575490ab9fc2798b2d7db2ee9c6b0eeb4243e 100644 --- a/packages/next-server/server/next-server.ts +++ b/packages/next-server/server/next-server.ts @@ -19,6 +19,7 @@ import { getRouteMatcher, getRouteRegex, getSortedRoutes, + isDynamicRoute, } from '../lib/router/utils' import * as envConfig from '../lib/runtime-config' import { NextApiRequest, NextApiResponse } from '../lib/utils' @@ -359,8 +360,8 @@ export default class Server { private getDynamicRoutes() { const manifest = require(this.buildManifest) - const dynamicRoutedPages = Object.keys(manifest.pages).filter(p => - p.includes('/$') + const dynamicRoutedPages = Object.keys(manifest.pages).filter( + isDynamicRoute ) return getSortedRoutes(dynamicRoutedPages).map(page => ({ page, diff --git a/packages/next/build/webpack/loaders/next-serverless-loader.ts b/packages/next/build/webpack/loaders/next-serverless-loader.ts index 6914fbf784cb587b34173b83e7d9e4fd889e9452..70bf533460d4570d9d86a3176aefa12a408e9870 100644 --- a/packages/next/build/webpack/loaders/next-serverless-loader.ts +++ b/packages/next/build/webpack/loaders/next-serverless-loader.ts @@ -2,6 +2,7 @@ import { loader } from 'webpack' import { join } from 'path' import { parse } from 'querystring' import { BUILD_MANIFEST, REACT_LOADABLE_MANIFEST } from 'next-server/constants' +import { isDynamicRoute } from 'next-server/dist/lib/router/utils' export type ServerlessLoaderQuery = { page: string @@ -42,7 +43,7 @@ const nextServerlessLoader: loader.Loader = function() { import {renderToHTML} from 'next-server/dist/server/render'; import {sendHTML} from 'next-server/dist/server/send-html'; ${ - page.includes('/$') + isDynamicRoute(page) ? `import {getRouteMatcher, getRouteRegex} from 'next-server/dist/lib/router/utils';` : '' } @@ -82,7 +83,7 @@ const nextServerlessLoader: loader.Loader = function() { try { ${page === '/_error' ? `res.statusCode = 404` : ''} ${ - page.includes('/$') + isDynamicRoute(page) ? `const params = getRouteMatcher(getRouteRegex("${page}"))(parsedUrl.pathname) || {};` : `const params = {};` } diff --git a/packages/next/client/index.js b/packages/next/client/index.js index c83813f5a902429781dd757f0cb46fa03a636565..321c4f1255c5ce635286e64e1a436c8c2c6ed231 100644 --- a/packages/next/client/index.js +++ b/packages/next/client/index.js @@ -12,6 +12,7 @@ import { DataManagerContext } from 'next-server/dist/lib/data-manager-context' import { RouterContext } from 'next-server/dist/lib/router-context' import { DataManager } from 'next-server/dist/lib/data-manager' import { parse as parseQs, stringify as stringifyQs } from 'querystring' +import { isDynamicRoute } from 'next-server/dist/lib/router/utils' // Polyfill Promise globally // This is needed because Webpack's dynamic loading(common chunks) code @@ -83,7 +84,7 @@ class Container extends React.Component { // If it's a dynamic route (/$ inside) or has a querystring if ( data.nextExport && - (router.pathname.indexOf('/$') !== -1 || window.location.search) + (isDynamicRoute(router.pathname) || window.location.search) ) { // update query on mount for exported pages router.replace( diff --git a/packages/next/server/next-dev-server.js b/packages/next/server/next-dev-server.js index 20ffdad0420d65967abedbccf3ef14c741242c6c..cefcff5e3d83bfbb31e7f3e284580feeb83fc5db 100644 --- a/packages/next/server/next-dev-server.js +++ b/packages/next/server/next-dev-server.js @@ -12,7 +12,8 @@ import Watchpack from 'watchpack' import { getRouteMatcher, getRouteRegex, - getSortedRoutes + getSortedRoutes, + isDynamicRoute } from 'next-server/dist/lib/router/utils' import React from 'react' @@ -113,7 +114,7 @@ export default class DevServer extends Server { } let pageName = '/' + relative(pagesDir, fileName).replace(/\\+/g, '/') - if (!pageName.includes('/$')) { + if (!isDynamicRoute(pageName)) { continue }