Skip to content

Commit

Permalink
Fix paths when built on windows (#5795)
Browse files Browse the repository at this point in the history
This PR Fixes #4920

So the problem is that when a next.js application is built on windows, the `pages-manifest.json` file is created with backslashes. If this built application is deployed to a linux hosting enviroment, the server will fail when trying to load the modules.

```
Error: Cannot find module '/user_code/next/server/bundles\pages\index.js
```

My simple solution is to modify the `pages-manifest.json` to always use linux separator (`/`), then also 
modify `server/require.js` to, when requiring page, replace any separator (`\` or `/`) with current platform-specific file separator (`require('path').sep`).

The fix in `server/require.js` would be sufficient, but my opinion is that having some cross-platform consistency is nice.

This change was tested by bulding an application in windows and running it in linux and windows, aswell as building an application in linux and running it in linux and windows. The related tests was also run.
  • Loading branch information
oBusk authored and timneutkens committed Dec 10, 2018
1 parent c43975a commit c867b0c
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 2 deletions.
3 changes: 2 additions & 1 deletion build/webpack/plugins/pages-manifest-plugin.js
Expand Up @@ -24,7 +24,8 @@ export default class PagesManifestPlugin {
}

const {name} = entry
pages[`/${pagePath.replace(/\\/g, '/')}`] = name
// Write filename, replace any backslashes in path (on windows) with forwardslashes for cross-platform consistency.
pages[`/${pagePath.replace(/\\/g, '/')}`] = name.replace(/\\/g, '/')
}

if (typeof pages['/index'] !== 'undefined') {
Expand Down
13 changes: 12 additions & 1 deletion test/integration/production/test/index.test.js
Expand Up @@ -16,7 +16,7 @@ import fetch from 'node-fetch'
import dynamicImportTests from './dynamic'
import processEnv from './process-env'
import security from './security'
import {BUILD_MANIFEST, REACT_LOADABLE_MANIFEST} from 'next/constants'
import {BUILD_MANIFEST, REACT_LOADABLE_MANIFEST, PAGES_MANIFEST} from 'next/constants'

const appDir = join(__dirname, '../')
let appPort
Expand Down Expand Up @@ -276,6 +276,17 @@ describe('Production Usage', () => {
expect(serverSideJsBody).toMatch(/404/)
})

it('should not put backslashes in pages-manifest.json', () => {
// Whatever platform you build on, pages-manifest.json should use forward slash (/)
// See: https://github.com/zeit/next.js/issues/4920
const pagesManifest = require(join('..', '.next', 'server', PAGES_MANIFEST))

for (let key of Object.keys(pagesManifest)) {
expect(key).not.toMatch(/\\/)
expect(pagesManifest[key]).not.toMatch(/\\/)
}
})

dynamicImportTests(context, (p, q) => renderViaHTTP(context.appPort, p, q))

processEnv(context)
Expand Down

0 comments on commit c867b0c

Please sign in to comment.