mirror of
https://github.com/terribleplan/next.js.git
synced 2024-01-19 02:48:18 +00:00
Merge with master.
This commit is contained in:
commit
866319c76d
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -11,3 +11,5 @@ npm-debug.log
|
||||||
# coverage
|
# coverage
|
||||||
.nyc_output
|
.nyc_output
|
||||||
coverage
|
coverage
|
||||||
|
|
||||||
|
.DS_Store
|
||||||
|
|
|
@ -22,8 +22,9 @@ if (argv.help) {
|
||||||
Usage
|
Usage
|
||||||
$ next build <dir>
|
$ next build <dir>
|
||||||
|
|
||||||
<dir> represents where the compiled .next folder should go.
|
<dir> represents where the compiled dist folder should go.
|
||||||
If no directory is provided, .next will be created in the current directory
|
If no directory is provided, the dist folder will be created in the current directory.
|
||||||
|
You can set a custom folder in config https://github.com/zeit/next.js#custom-configuration, otherwise it will be created inside '.next'
|
||||||
`)
|
`)
|
||||||
process.exit(0)
|
process.exit(0)
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,8 +29,9 @@ if (argv.help) {
|
||||||
Usage
|
Usage
|
||||||
$ next dev <dir> -p <port number>
|
$ next dev <dir> -p <port number>
|
||||||
|
|
||||||
<dir> represents where the compiled .next folder should go.
|
<dir> represents where the compiled folder should go.
|
||||||
If no directory is provided, .next will be created in the current directory
|
If no directory is provided, the folder will be created in the current directory.
|
||||||
|
You can set a custom folder in config https://github.com/zeit/next.js#custom-configuration.
|
||||||
|
|
||||||
Options
|
Options
|
||||||
--port, -p A port number on which to start the application
|
--port, -p A port number on which to start the application
|
||||||
|
|
|
@ -4,6 +4,7 @@ import { resolve } from 'path'
|
||||||
import parseArgs from 'minimist'
|
import parseArgs from 'minimist'
|
||||||
import Server from '../server'
|
import Server from '../server'
|
||||||
import { existsSync } from 'fs'
|
import { existsSync } from 'fs'
|
||||||
|
import getConfig from '../server/config'
|
||||||
|
|
||||||
process.env.NODE_ENV = process.env.NODE_ENV || 'production'
|
process.env.NODE_ENV = process.env.NODE_ENV || 'production'
|
||||||
|
|
||||||
|
@ -32,9 +33,10 @@ if (argv.help) {
|
||||||
Usage
|
Usage
|
||||||
$ next start <dir> -p <port>
|
$ next start <dir> -p <port>
|
||||||
|
|
||||||
<dir> is the directory that contains the compiled .next folder
|
<dir> is the directory that contains the compiled dist folder
|
||||||
created by running \`next build\`.
|
created by running \`next build\`.
|
||||||
If no directory is provided, the current directory will be assumed.
|
If no directory is provided, the current directory will be assumed.
|
||||||
|
You can set a custom dist folder in config https://github.com/zeit/next.js#custom-configuration
|
||||||
|
|
||||||
Options
|
Options
|
||||||
--port, -p A port number on which to start the application
|
--port, -p A port number on which to start the application
|
||||||
|
@ -45,11 +47,12 @@ if (argv.help) {
|
||||||
}
|
}
|
||||||
|
|
||||||
const dir = resolve(argv._[0] || '.')
|
const dir = resolve(argv._[0] || '.')
|
||||||
|
const dist = getConfig(dir).distDir
|
||||||
|
|
||||||
const srv = new Server({ dir })
|
const srv = new Server({ dir })
|
||||||
|
|
||||||
if (!existsSync(resolve(dir, '.next', 'BUILD_ID'))) {
|
if (!existsSync(resolve(dir, dist, 'BUILD_ID'))) {
|
||||||
console.error(`> Could not find a valid build in the '.next' directory! Try building your app with 'next build' before starting the server.`)
|
console.error(`> Could not find a valid build in the '${dist}' directory! Try building your app with 'next build' before starting the server.`)
|
||||||
process.exit(1)
|
process.exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
30
examples/with-glamorous/README.md
Normal file
30
examples/with-glamorous/README.md
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
|
||||||
|
# Example app with [glamorous](https://github.com/kentcdodds/glamorous)
|
||||||
|
|
||||||
|
## How to use
|
||||||
|
|
||||||
|
Download the example [or clone the repo](https://github.com/zeit/next.js):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl https://codeload.github.com/zeit/next.js/tar.gz/master | tar -xz --strip=2 next.js-master/examples/with-glamorous
|
||||||
|
cd with-glamorous
|
||||||
|
```
|
||||||
|
|
||||||
|
Install it and run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
Deploy it to the cloud with [now](https://zeit.co/now) ([download](https://zeit.co/download))
|
||||||
|
|
||||||
|
```bash
|
||||||
|
now
|
||||||
|
```
|
||||||
|
|
||||||
|
## The idea behind the example
|
||||||
|
|
||||||
|
This example features how to use [glamorous](https://github.com/kentcdodds/glamorous) as the styling solution instead of [styled-jsx](https://github.com/zeit/styled-jsx). It also incorporates [glamor](https://github.com/threepointone/glamor) since `glamor` is a dependency for `glamorous`.
|
||||||
|
|
||||||
|
We are creating three `div` elements with custom styles being shared across the elements. The styles includes the use of pseedo-elements and CSS animations.
|
18
examples/with-glamorous/package.json
Normal file
18
examples/with-glamorous/package.json
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
{
|
||||||
|
"name": "with-glamorous",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "next",
|
||||||
|
"build": "next build",
|
||||||
|
"start": "next start"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"glamor": "^2.20.24",
|
||||||
|
"glamorous": "^1.0.0",
|
||||||
|
"next": "^2.0.1",
|
||||||
|
"react": "^15.4.2",
|
||||||
|
"react-dom": "^15.4.2"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC"
|
||||||
|
}
|
33
examples/with-glamorous/pages/_document.js
Normal file
33
examples/with-glamorous/pages/_document.js
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
import Document, { Head, Main, NextScript } from 'next/document'
|
||||||
|
import { renderStatic } from 'glamor/server'
|
||||||
|
|
||||||
|
export default class MyDocument extends Document {
|
||||||
|
static async getInitialProps ({ renderPage }) {
|
||||||
|
const page = renderPage()
|
||||||
|
const styles = renderStatic(() => page.html)
|
||||||
|
return { ...page, ...styles }
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor (props) {
|
||||||
|
super(props)
|
||||||
|
const { __NEXT_DATA__, ids } = props
|
||||||
|
if (ids) {
|
||||||
|
__NEXT_DATA__.ids = this.props.ids
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
render () {
|
||||||
|
return (
|
||||||
|
<html>
|
||||||
|
<Head>
|
||||||
|
<title>With Glamorous</title>
|
||||||
|
<style dangerouslySetInnerHTML={{ __html: this.props.css }} />
|
||||||
|
</Head>
|
||||||
|
<body>
|
||||||
|
<Main />
|
||||||
|
<NextScript />
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
66
examples/with-glamorous/pages/index.js
Normal file
66
examples/with-glamorous/pages/index.js
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
import React from 'react'
|
||||||
|
import { rehydrate, css } from 'glamor'
|
||||||
|
import glamorous from 'glamorous'
|
||||||
|
|
||||||
|
// Adds server generated styles to glamor cache.
|
||||||
|
// Has to run before any `style()` calls
|
||||||
|
// '__NEXT_DATA__.ids' is set in '_document.js'
|
||||||
|
if (typeof window !== 'undefined') {
|
||||||
|
rehydrate(window.__NEXT_DATA__.ids)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default () => {
|
||||||
|
css.global('html, body', { padding: '3rem 1rem', margin: 0, background: 'papayawhip', 'min-height': '100%', 'font-family': 'Helvetica, Arial, sans-serif', 'font-size': '24px' })
|
||||||
|
|
||||||
|
const basicStyles = {
|
||||||
|
backgroundColor: 'white',
|
||||||
|
color: 'cornflowerblue',
|
||||||
|
border: '1px solid lightgreen',
|
||||||
|
borderRight: 'none',
|
||||||
|
borderBottom: 'none',
|
||||||
|
boxShadow: '5px 5px 0 0 lightgreen, 10px 10px 0 0 lightyellow',
|
||||||
|
transition: 'all 0.1s linear',
|
||||||
|
margin: `3rem 0`,
|
||||||
|
padding: `1rem 0.5rem`
|
||||||
|
}
|
||||||
|
|
||||||
|
const hoverStyles = {
|
||||||
|
':hover': {
|
||||||
|
color: 'white',
|
||||||
|
backgroundColor: 'lightgray',
|
||||||
|
borderColor: 'aqua',
|
||||||
|
boxShadow: `-15px -15px 0 0 aqua, -30px -30px 0 0 cornflowerblue`
|
||||||
|
},
|
||||||
|
'& code': {
|
||||||
|
backgroundColor: 'linen'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const crazyStyles = props => {
|
||||||
|
const crazyStyles = hoverStyles
|
||||||
|
const bounce = css.keyframes({
|
||||||
|
'0%': { transform: `scale(1.01)` },
|
||||||
|
'100%': { transform: `scale(0.99)` }
|
||||||
|
})
|
||||||
|
crazyStyles.animation = `${bounce} 0.2s infinite ease-in-out alternate`
|
||||||
|
return crazyStyles
|
||||||
|
}
|
||||||
|
|
||||||
|
const Basic = glamorous.div(basicStyles)
|
||||||
|
const Combined = glamorous.div(basicStyles, hoverStyles)
|
||||||
|
const Animated = glamorous.div(basicStyles, hoverStyles, crazyStyles)
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<Basic>
|
||||||
|
Cool Styles
|
||||||
|
</Basic>
|
||||||
|
<Combined>
|
||||||
|
With <code>:hover</code>.
|
||||||
|
</Combined>
|
||||||
|
<Animated>
|
||||||
|
Let's bounce.
|
||||||
|
</Animated>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
|
@ -6,8 +6,8 @@
|
||||||
Download the example [or clone the repo](https://github.com/zeit/next.js):
|
Download the example [or clone the repo](https://github.com/zeit/next.js):
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl https://codeload.github.com/zeit/next.js/tar.gz/master | tar -xz --strip=2 next.js-master/examples/basic-css
|
curl https://codeload.github.com/zeit/next.js/tar.gz/master | tar -xz --strip=2 next.js-master/examples/with-universal-configuration
|
||||||
cd basic-css
|
cd with-universal-configuration
|
||||||
```
|
```
|
||||||
|
|
||||||
Install it and run:
|
Install it and run:
|
||||||
|
|
|
@ -65,6 +65,7 @@
|
||||||
"cross-spawn": "5.1.0",
|
"cross-spawn": "5.1.0",
|
||||||
"del": "2.2.2",
|
"del": "2.2.2",
|
||||||
"friendly-errors-webpack-plugin": "1.5.0",
|
"friendly-errors-webpack-plugin": "1.5.0",
|
||||||
|
"glob": "^7.1.1",
|
||||||
"glob-promise": "3.1.0",
|
"glob-promise": "3.1.0",
|
||||||
"htmlescape": "1.1.1",
|
"htmlescape": "1.1.1",
|
||||||
"http-status": "1.0.1",
|
"http-status": "1.0.1",
|
||||||
|
@ -90,7 +91,7 @@
|
||||||
"uuid": "3.0.1",
|
"uuid": "3.0.1",
|
||||||
"webpack": "2.3.3",
|
"webpack": "2.3.3",
|
||||||
"webpack-dev-middleware": "1.10.1",
|
"webpack-dev-middleware": "1.10.1",
|
||||||
"webpack-hot-middleware": "2.17.1",
|
"webpack-hot-middleware": "2.18.0",
|
||||||
"write-file-webpack-plugin": "4.0.0"
|
"write-file-webpack-plugin": "4.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|
13
readme.md
13
readme.md
|
@ -644,6 +644,17 @@ module.exports = {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### Setting a custom build directory
|
||||||
|
|
||||||
|
You can specify a name to use for a custom build directory. For example, the following config will create a `build` folder instead of a `.next` folder. If no configuration is specified then next will create a `.next` folder.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// next.config.js
|
||||||
|
module.exports = {
|
||||||
|
distDir: 'build'
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### Customizing webpack config
|
### Customizing webpack config
|
||||||
|
|
||||||
In order to extend our usage of `webpack`, you can define a function that extends its config via `next.config.js`.
|
In order to extend our usage of `webpack`, you can define a function that extends its config via `next.config.js`.
|
||||||
|
@ -718,7 +729,7 @@ Then run `now` and enjoy!
|
||||||
|
|
||||||
Next.js can be deployed to other hosting solutions too. Please have a look at the ['Deployment'](https://github.com/zeit/next.js/wiki/Deployment) section of the wiki.
|
Next.js can be deployed to other hosting solutions too. Please have a look at the ['Deployment'](https://github.com/zeit/next.js/wiki/Deployment) section of the wiki.
|
||||||
|
|
||||||
Note: we recommend putting `.next` in `.npmignore` or `.gitignore`. Otherwise, use `files` or `now.files` to opt-into a whitelist of files you want to deploy (and obviously exclude `.next`)
|
Note: we recommend putting `.next`, or your custom dist folder (Please have a look at ['Custom Config'](You can set a custom folder in config https://github.com/zeit/next.js#custom-configuration.)), in `.npmignore` or `.gitignore`. Otherwise, use `files` or `now.files` to opt-into a whitelist of files you want to deploy (and obviously exclude `.next` or your custom dist folder)
|
||||||
|
|
||||||
## FAQ
|
## FAQ
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
import { resolve } from 'path'
|
import { resolve } from 'path'
|
||||||
import del from 'del'
|
import del from 'del'
|
||||||
|
import getConfig from '../config'
|
||||||
|
|
||||||
export default function clean (dir) {
|
export default function clean (dir) {
|
||||||
return del(resolve(dir, '.next'))
|
const dist = getConfig(dir).distDir
|
||||||
|
return del(resolve(dir, dist))
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import { tmpdir } from 'os'
|
import { tmpdir } from 'os'
|
||||||
import { join } from 'path'
|
import { join } from 'path'
|
||||||
|
import getConfig from '../config'
|
||||||
import fs from 'mz/fs'
|
import fs from 'mz/fs'
|
||||||
import uuid from 'uuid'
|
import uuid from 'uuid'
|
||||||
import del from 'del'
|
import del from 'del'
|
||||||
|
@ -13,8 +14,10 @@ export default async function build (dir) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await runCompiler(compiler)
|
await runCompiler(compiler)
|
||||||
await writeBuildStats(buildDir)
|
|
||||||
await writeBuildId(buildDir)
|
// Pass in both the buildDir and the dir to retrieve config
|
||||||
|
await writeBuildStats(buildDir, dir)
|
||||||
|
await writeBuildId(buildDir, dir)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error(`> Failed to build on ${buildDir}`)
|
console.error(`> Failed to build on ${buildDir}`)
|
||||||
throw err
|
throw err
|
||||||
|
@ -45,22 +48,24 @@ function runCompiler (compiler) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
async function writeBuildStats (dir) {
|
async function writeBuildStats (buildDir, dir) {
|
||||||
|
const dist = getConfig(dir).distDir
|
||||||
// Here we can't use hashes in webpack chunks.
|
// Here we can't use hashes in webpack chunks.
|
||||||
// That's because the "app.js" is not tied to a chunk.
|
// That's because the "app.js" is not tied to a chunk.
|
||||||
// It's created by merging a few assets. (commons.js and main.js)
|
// It's created by merging a few assets. (commons.js and main.js)
|
||||||
// So, we need to generate the hash ourself.
|
// So, we need to generate the hash ourself.
|
||||||
const assetHashMap = {
|
const assetHashMap = {
|
||||||
'app.js': {
|
'app.js': {
|
||||||
hash: await md5File(join(dir, '.next', 'app.js'))
|
hash: await md5File(join(buildDir, dist, 'app.js'))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const buildStatsPath = join(dir, '.next', 'build-stats.json')
|
const buildStatsPath = join(buildDir, dist, 'build-stats.json')
|
||||||
await fs.writeFile(buildStatsPath, JSON.stringify(assetHashMap), 'utf8')
|
await fs.writeFile(buildStatsPath, JSON.stringify(assetHashMap), 'utf8')
|
||||||
}
|
}
|
||||||
|
|
||||||
async function writeBuildId (dir) {
|
async function writeBuildId (buildDir, dir) {
|
||||||
const buildIdPath = join(dir, '.next', 'BUILD_ID')
|
const dist = getConfig(dir).distDir
|
||||||
|
const buildIdPath = join(buildDir, dist, 'BUILD_ID')
|
||||||
const buildId = uuid.v4()
|
const buildId = uuid.v4()
|
||||||
await fs.writeFile(buildIdPath, buildId, 'utf8')
|
await fs.writeFile(buildIdPath, buildId, 'utf8')
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,13 @@
|
||||||
import mv from 'mv'
|
import mv from 'mv'
|
||||||
import { join } from 'path'
|
import { join } from 'path'
|
||||||
|
import getConfig from '../config'
|
||||||
|
|
||||||
export default async function replaceCurrentBuild (dir, buildDir) {
|
export default async function replaceCurrentBuild (dir, buildDir) {
|
||||||
const _dir = join(dir, '.next')
|
const dist = getConfig(dir).distDir
|
||||||
const _buildDir = join(buildDir, '.next')
|
const buildDist = getConfig(buildDir).distDir
|
||||||
const oldDir = join(buildDir, '.next.old')
|
const _dir = join(dir, dist)
|
||||||
|
const _buildDir = join(buildDir, dist)
|
||||||
|
const oldDir = join(buildDir, `${buildDist}.old`)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await move(_dir, oldDir)
|
await move(_dir, oldDir)
|
||||||
|
|
|
@ -265,7 +265,7 @@ export default async function createCompiler (dir, { dev = false, quiet = false,
|
||||||
context: dir,
|
context: dir,
|
||||||
entry,
|
entry,
|
||||||
output: {
|
output: {
|
||||||
path: join(buildDir || dir, '.next'),
|
path: join(buildDir || dir, config.distDir),
|
||||||
filename: '[name]',
|
filename: '[name]',
|
||||||
libraryTarget: 'commonjs2',
|
libraryTarget: 'commonjs2',
|
||||||
publicPath: '/_webpack/',
|
publicPath: '/_webpack/',
|
||||||
|
|
|
@ -5,7 +5,8 @@ const cache = new Map()
|
||||||
|
|
||||||
const defaultConfig = {
|
const defaultConfig = {
|
||||||
webpack: null,
|
webpack: null,
|
||||||
poweredByHeader: true
|
poweredByHeader: true,
|
||||||
|
distDir: '.next'
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function getConfig (dir) {
|
export default function getConfig (dir) {
|
||||||
|
|
|
@ -27,7 +27,8 @@ export default class Server {
|
||||||
this.hotReloader = dev ? new HotReloader(this.dir, { quiet }) : null
|
this.hotReloader = dev ? new HotReloader(this.dir, { quiet }) : null
|
||||||
this.http = null
|
this.http = null
|
||||||
this.config = getConfig(this.dir)
|
this.config = getConfig(this.dir)
|
||||||
this.buildStats = !dev ? require(join(this.dir, '.next', 'build-stats.json')) : null
|
this.dist = this.config.distDir
|
||||||
|
this.buildStats = !dev ? require(join(this.dir, this.dist, 'build-stats.json')) : null
|
||||||
this.buildId = !dev ? this.readBuildId() : '-'
|
this.buildId = !dev ? this.readBuildId() : '-'
|
||||||
this.renderOpts = {
|
this.renderOpts = {
|
||||||
dev,
|
dev,
|
||||||
|
@ -92,25 +93,25 @@ export default class Server {
|
||||||
|
|
||||||
'/_next/:hash/manifest.js': async (req, res, params) => {
|
'/_next/:hash/manifest.js': async (req, res, params) => {
|
||||||
this.handleBuildHash('manifest.js', params.hash, res)
|
this.handleBuildHash('manifest.js', params.hash, res)
|
||||||
const p = join(this.dir, '.next/manifest.js')
|
const p = join(this.dir, `${this.dist}/manifest.js`)
|
||||||
await this.serveStatic(req, res, p)
|
await this.serveStatic(req, res, p)
|
||||||
},
|
},
|
||||||
|
|
||||||
'/_next/:hash/main.js': async (req, res, params) => {
|
'/_next/:hash/main.js': async (req, res, params) => {
|
||||||
this.handleBuildHash('main.js', params.hash, res)
|
this.handleBuildHash('main.js', params.hash, res)
|
||||||
const p = join(this.dir, '.next/main.js')
|
const p = join(this.dir, `${this.dist}/main.js`)
|
||||||
await this.serveStatic(req, res, p)
|
await this.serveStatic(req, res, p)
|
||||||
},
|
},
|
||||||
|
|
||||||
'/_next/:hash/commons.js': async (req, res, params) => {
|
'/_next/:hash/commons.js': async (req, res, params) => {
|
||||||
this.handleBuildHash('commons.js', params.hash, res)
|
this.handleBuildHash('commons.js', params.hash, res)
|
||||||
const p = join(this.dir, '.next/commons.js')
|
const p = join(this.dir, `${this.dist}/commons.js`)
|
||||||
await this.serveStatic(req, res, p)
|
await this.serveStatic(req, res, p)
|
||||||
},
|
},
|
||||||
|
|
||||||
'/_next/:hash/app.js': async (req, res, params) => {
|
'/_next/:hash/app.js': async (req, res, params) => {
|
||||||
this.handleBuildHash('app.js', params.hash, res)
|
this.handleBuildHash('app.js', params.hash, res)
|
||||||
const p = join(this.dir, '.next/app.js')
|
const p = join(this.dir, `${this.dist}/app.js`)
|
||||||
await this.serveStatic(req, res, p)
|
await this.serveStatic(req, res, p)
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -284,7 +285,7 @@ export default class Server {
|
||||||
}
|
}
|
||||||
|
|
||||||
readBuildId () {
|
readBuildId () {
|
||||||
const buildIdPath = join(this.dir, '.next', 'BUILD_ID')
|
const buildIdPath = join(this.dir, this.dist, 'BUILD_ID')
|
||||||
const buildId = fs.readFileSync(buildIdPath, 'utf8')
|
const buildId = fs.readFileSync(buildIdPath, 'utf8')
|
||||||
return buildId.trim()
|
return buildId.trim()
|
||||||
}
|
}
|
||||||
|
@ -305,7 +306,7 @@ export default class Server {
|
||||||
const errors = this.hotReloader.getCompilationErrors()
|
const errors = this.hotReloader.getCompilationErrors()
|
||||||
if (!errors.size) return
|
if (!errors.size) return
|
||||||
|
|
||||||
const id = join(this.dir, '.next', 'bundles', 'pages', page)
|
const id = join(this.dir, this.dist, 'bundles', 'pages', page)
|
||||||
const p = resolveFromList(id, errors.keys())
|
const p = resolveFromList(id, errors.keys())
|
||||||
if (p) return errors.get(p)[0]
|
if (p) return errors.get(p)[0]
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { createElement } from 'react'
|
||||||
import { renderToString, renderToStaticMarkup } from 'react-dom/server'
|
import { renderToString, renderToStaticMarkup } from 'react-dom/server'
|
||||||
import send from 'send'
|
import send from 'send'
|
||||||
import requireModule from './require'
|
import requireModule from './require'
|
||||||
|
import getConfig from './config'
|
||||||
import resolvePath from './resolve'
|
import resolvePath from './resolve'
|
||||||
import { Router } from '../lib/router'
|
import { Router } from '../lib/router'
|
||||||
import { loadGetInitialProps } from '../lib/utils'
|
import { loadGetInitialProps } from '../lib/utils'
|
||||||
|
@ -42,9 +43,11 @@ async function doRender (req, res, pathname, query, {
|
||||||
|
|
||||||
await ensurePage(page, { dir, hotReloader })
|
await ensurePage(page, { dir, hotReloader })
|
||||||
|
|
||||||
|
const dist = getConfig(dir).distDir
|
||||||
|
|
||||||
let [Component, Document] = await Promise.all([
|
let [Component, Document] = await Promise.all([
|
||||||
requireModule(join(dir, '.next', 'dist', 'pages', page)),
|
requireModule(join(dir, dist, 'dist', 'pages', page)),
|
||||||
requireModule(join(dir, '.next', 'dist', 'pages', '_document'))
|
requireModule(join(dir, dist, 'dist', 'pages', '_document'))
|
||||||
])
|
])
|
||||||
Component = Component.default || Component
|
Component = Component.default || Component
|
||||||
Document = Document.default || Document
|
Document = Document.default || Document
|
||||||
|
|
7
test/integration/dist-dir/next.config.js
Normal file
7
test/integration/dist-dir/next.config.js
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
module.exports = {
|
||||||
|
onDemandEntries: {
|
||||||
|
// Make sure entries are not getting disposed.
|
||||||
|
maxInactiveAge: 1000 * 60 * 60
|
||||||
|
},
|
||||||
|
distDir: 'dist'
|
||||||
|
}
|
3
test/integration/dist-dir/pages/index.js
Normal file
3
test/integration/dist-dir/pages/index.js
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
export default () => (
|
||||||
|
<div>Hello World</div>
|
||||||
|
)
|
49
test/integration/dist-dir/test/index.test.js
Normal file
49
test/integration/dist-dir/test/index.test.js
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
/* global jasmine, describe, it, expect, beforeAll, afterAll */
|
||||||
|
|
||||||
|
import { join } from 'path'
|
||||||
|
import { existsSync } from 'fs'
|
||||||
|
import {
|
||||||
|
nextServer,
|
||||||
|
nextBuild,
|
||||||
|
startApp,
|
||||||
|
stopApp,
|
||||||
|
renderViaHTTP
|
||||||
|
} from 'next-test-utils'
|
||||||
|
|
||||||
|
const appDir = join(__dirname, '../')
|
||||||
|
let appPort
|
||||||
|
let server
|
||||||
|
let app
|
||||||
|
jasmine.DEFAULT_TIMEOUT_INTERVAL = 40000
|
||||||
|
|
||||||
|
describe('Production Usage', () => {
|
||||||
|
beforeAll(async () => {
|
||||||
|
await nextBuild(appDir)
|
||||||
|
app = nextServer({
|
||||||
|
dir: join(__dirname, '../'),
|
||||||
|
dev: false,
|
||||||
|
quiet: true
|
||||||
|
})
|
||||||
|
|
||||||
|
server = await startApp(app)
|
||||||
|
appPort = server.address().port
|
||||||
|
})
|
||||||
|
afterAll(() => stopApp(server))
|
||||||
|
|
||||||
|
describe('With basic usage', () => {
|
||||||
|
it('should render the page', async () => {
|
||||||
|
const html = await renderViaHTTP(appPort, '/')
|
||||||
|
expect(html).toMatch(/Hello World/)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('File locations', () => {
|
||||||
|
it('should build the app within the given `dist` directory', () => {
|
||||||
|
expect(existsSync(join(__dirname, '/../dist/app.js'))).toBeTruthy()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should not build the app within the default `.next` directory', () => {
|
||||||
|
expect(existsSync(join(__dirname, '/../.next/app.js'))).toBeFalsy()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
62
yarn.lock
62
yarn.lock
|
@ -235,7 +235,7 @@ async@2.0.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
lodash "^4.8.0"
|
lodash "^4.8.0"
|
||||||
|
|
||||||
async@^1.4.0, async@^1.4.2:
|
async@^1.4.0:
|
||||||
version "1.5.2"
|
version "1.5.2"
|
||||||
resolved "https://registry.npmjs.org/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
|
resolved "https://registry.npmjs.org/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
|
||||||
|
|
||||||
|
@ -2788,7 +2788,7 @@ istanbul-api@^1.1.0-alpha.1:
|
||||||
mkdirp "^0.5.1"
|
mkdirp "^0.5.1"
|
||||||
once "^1.4.0"
|
once "^1.4.0"
|
||||||
|
|
||||||
istanbul-lib-coverage@^1.0.0, istanbul-lib-coverage@^1.0.0-alpha, istanbul-lib-coverage@^1.0.0-alpha.0:
|
istanbul-lib-coverage@^1.0.0:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.1.tgz#f263efb519c051c5f1f3343034fc40e7b43ff212"
|
resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.1.tgz#f263efb519c051c5f1f3343034fc40e7b43ff212"
|
||||||
|
|
||||||
|
@ -2796,19 +2796,13 @@ istanbul-lib-coverage@^1.0.2:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.2.tgz#87a0c015b6910651cb3b184814dfb339337e25e1"
|
resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.2.tgz#87a0c015b6910651cb3b184814dfb339337e25e1"
|
||||||
|
|
||||||
istanbul-lib-hook@^1.0.0:
|
istanbul-lib-hook@^1.0.0, istanbul-lib-hook@^1.0.5:
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.0.0.tgz#fc5367ee27f59268e8f060b0c7aaf051d9c425c5"
|
|
||||||
dependencies:
|
|
||||||
append-transform "^0.4.0"
|
|
||||||
|
|
||||||
istanbul-lib-hook@^1.0.5:
|
|
||||||
version "1.0.5"
|
version "1.0.5"
|
||||||
resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.5.tgz#6ca3d16d60c5f4082da39f7c5cd38ea8a772b88e"
|
resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.5.tgz#6ca3d16d60c5f4082da39f7c5cd38ea8a772b88e"
|
||||||
dependencies:
|
dependencies:
|
||||||
append-transform "^0.4.0"
|
append-transform "^0.4.0"
|
||||||
|
|
||||||
istanbul-lib-instrument@^1.1.1, istanbul-lib-instrument@^1.1.4, istanbul-lib-instrument@^1.3.0, istanbul-lib-instrument@^1.6.2:
|
istanbul-lib-instrument@^1.1.1, istanbul-lib-instrument@^1.6.2:
|
||||||
version "1.6.2"
|
version "1.6.2"
|
||||||
resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.6.2.tgz#dac644f358f51efd6113536d7070959a0111f73b"
|
resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.6.2.tgz#dac644f358f51efd6113536d7070959a0111f73b"
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -2820,7 +2814,7 @@ istanbul-lib-instrument@^1.1.1, istanbul-lib-instrument@^1.1.4, istanbul-lib-ins
|
||||||
istanbul-lib-coverage "^1.0.0"
|
istanbul-lib-coverage "^1.0.0"
|
||||||
semver "^5.3.0"
|
semver "^5.3.0"
|
||||||
|
|
||||||
istanbul-lib-instrument@^1.7.0:
|
istanbul-lib-instrument@^1.1.4, istanbul-lib-instrument@^1.3.0, istanbul-lib-instrument@^1.7.0:
|
||||||
version "1.7.0"
|
version "1.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.0.tgz#b8e0dc25709bb44e17336ab47b7bb5c97c23f659"
|
resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.0.tgz#b8e0dc25709bb44e17336ab47b7bb5c97c23f659"
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -2832,7 +2826,7 @@ istanbul-lib-instrument@^1.7.0:
|
||||||
istanbul-lib-coverage "^1.0.2"
|
istanbul-lib-coverage "^1.0.2"
|
||||||
semver "^5.3.0"
|
semver "^5.3.0"
|
||||||
|
|
||||||
istanbul-lib-report@^1.0.0:
|
istanbul-lib-report@^1.0.0, istanbul-lib-report@^1.0.0-alpha.3:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.0.0.tgz#d83dac7f26566b521585569367fe84ccfc7aaecb"
|
resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.0.0.tgz#d83dac7f26566b521585569367fe84ccfc7aaecb"
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -2841,27 +2835,7 @@ istanbul-lib-report@^1.0.0:
|
||||||
path-parse "^1.0.5"
|
path-parse "^1.0.5"
|
||||||
supports-color "^3.1.2"
|
supports-color "^3.1.2"
|
||||||
|
|
||||||
istanbul-lib-report@^1.0.0-alpha.3:
|
istanbul-lib-source-maps@^1.1.0, istanbul-lib-source-maps@^1.1.1:
|
||||||
version "1.0.0-alpha.3"
|
|
||||||
resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.0.0-alpha.3.tgz#32d5f6ec7f33ca3a602209e278b2e6ff143498af"
|
|
||||||
dependencies:
|
|
||||||
async "^1.4.2"
|
|
||||||
istanbul-lib-coverage "^1.0.0-alpha"
|
|
||||||
mkdirp "^0.5.1"
|
|
||||||
path-parse "^1.0.5"
|
|
||||||
rimraf "^2.4.3"
|
|
||||||
supports-color "^3.1.2"
|
|
||||||
|
|
||||||
istanbul-lib-source-maps@^1.1.0:
|
|
||||||
version "1.1.0"
|
|
||||||
resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.1.0.tgz#9d429218f35b823560ea300a96ff0c3bbdab785f"
|
|
||||||
dependencies:
|
|
||||||
istanbul-lib-coverage "^1.0.0-alpha.0"
|
|
||||||
mkdirp "^0.5.1"
|
|
||||||
rimraf "^2.4.4"
|
|
||||||
source-map "^0.5.3"
|
|
||||||
|
|
||||||
istanbul-lib-source-maps@^1.1.1:
|
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.1.1.tgz#f8c8c2e8f2160d1d91526d97e5bd63b2079af71c"
|
resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.1.1.tgz#f8c8c2e8f2160d1d91526d97e5bd63b2079af71c"
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -2870,13 +2844,7 @@ istanbul-lib-source-maps@^1.1.1:
|
||||||
rimraf "^2.4.4"
|
rimraf "^2.4.4"
|
||||||
source-map "^0.5.3"
|
source-map "^0.5.3"
|
||||||
|
|
||||||
istanbul-reports@^1.0.0:
|
istanbul-reports@^1.0.0, istanbul-reports@^1.0.2:
|
||||||
version "1.0.1"
|
|
||||||
resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.0.1.tgz#9a17176bc4a6cbebdae52b2f15961d52fa623fbc"
|
|
||||||
dependencies:
|
|
||||||
handlebars "^4.0.3"
|
|
||||||
|
|
||||||
istanbul-reports@^1.0.2:
|
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.0.2.tgz#4e8366abe6fa746cc1cd6633f108de12cc6ac6fa"
|
resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.0.2.tgz#4e8366abe6fa746cc1cd6633f108de12cc6ac6fa"
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -4343,7 +4311,7 @@ right-align@^0.1.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
align-text "^0.1.1"
|
align-text "^0.1.1"
|
||||||
|
|
||||||
rimraf@2, rimraf@^2.2.8, rimraf@^2.3.3, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.4:
|
rimraf@2, rimraf@^2.2.8, rimraf@^2.3.3, rimraf@^2.4.4, rimraf@^2.5.4:
|
||||||
version "2.6.1"
|
version "2.6.1"
|
||||||
resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d"
|
resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d"
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -5000,9 +4968,9 @@ webpack-dev-middleware@1.10.1:
|
||||||
path-is-absolute "^1.0.0"
|
path-is-absolute "^1.0.0"
|
||||||
range-parser "^1.0.3"
|
range-parser "^1.0.3"
|
||||||
|
|
||||||
webpack-hot-middleware@2.17.1:
|
webpack-hot-middleware@2.18.0:
|
||||||
version "2.17.1"
|
version "2.18.0"
|
||||||
resolved "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.17.1.tgz#0c8fbf6f93ff29c095d684b07ab6d6c0f2f951d7"
|
resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.18.0.tgz#a16bb535b83a6ac94a78ac5ebce4f3059e8274d3"
|
||||||
dependencies:
|
dependencies:
|
||||||
ansi-html "0.0.7"
|
ansi-html "0.0.7"
|
||||||
html-entities "^1.2.0"
|
html-entities "^1.2.0"
|
||||||
|
@ -5016,9 +4984,9 @@ webpack-sources@^0.2.3:
|
||||||
source-list-map "^1.1.1"
|
source-list-map "^1.1.1"
|
||||||
source-map "~0.5.3"
|
source-map "~0.5.3"
|
||||||
|
|
||||||
webpack@2.3.2:
|
webpack@2.3.3:
|
||||||
version "2.3.2"
|
version "2.3.3"
|
||||||
resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.3.2.tgz#7d521e6f0777a3a58985c69425263fdfe977b458"
|
resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.3.3.tgz#eecc083c18fb7bf958ea4f40b57a6640c5a0cc78"
|
||||||
dependencies:
|
dependencies:
|
||||||
acorn "^4.0.4"
|
acorn "^4.0.4"
|
||||||
acorn-dynamic-import "^2.0.0"
|
acorn-dynamic-import "^2.0.0"
|
||||||
|
|
Loading…
Reference in a new issue