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

[Docs] Apply updates based on feedback #10352

Merged
merged 17 commits into from Feb 12, 2020
Merged
6 changes: 6 additions & 0 deletions docs/advanced-features/custom-document.md
Expand Up @@ -37,6 +37,12 @@ export default MyDocument

`<Html>`, `<Head />`, `<Main />` and `<NextScript />` are required for the page to be properly rendered.

Custom attributes are allowed as props, like `lang`:

```jsx
<Html lang="en">
```

The `ctx` object is equivalent to the one received in [`getInitialProps`](/docs/api-reference/data-fetching/getInitialProps.md#context-object), with one addition:

- `renderPage`: `Function` - a callback that executes the actual React rendering logic (synchronously). It's useful to decorate this function in order to support server-rendering wrappers like Aphrodite's [`renderStatic`](https://github.com/Khan/aphrodite#server-side-rendering)
Expand Down
13 changes: 12 additions & 1 deletion docs/advanced-features/dynamic-import.md
Expand Up @@ -17,6 +17,8 @@ You can think of dynamic imports as another way to split your code into manageab

## Basic usage

In the following example, the module `../components/hello` will be dynamically loaded by the page:

```jsx
import dynamic from 'next/dynamic'

Expand All @@ -35,14 +37,21 @@ function Home() {
export default Home
```

`DynamicComponent` will be the default component returned by `../components/hello`, it still works like any other React Component, and any props you add will be received by it.
lfades marked this conversation as resolved.
Show resolved Hide resolved

## With named exports

If the dynamic component is not the default export, you can use a named export too, consider the module `components/hello.js` with the following content:
lfades marked this conversation as resolved.
Show resolved Hide resolved

```jsx
// components/hello.js
export function Hello() {
return <p>Hello!</p>
}
```

To dynamically import the `Hello` component, you can return it from the [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) returned by [`import()`](https://github.com/tc39/proposal-dynamic-import#example), like so:

```jsx
import dynamic from 'next/dynamic'

const DynamicComponent = dynamic(() =>
Expand All @@ -64,6 +73,8 @@ export default Home

## With custom loading component

An optional `loading` component can be added to render a loading state while the dynamic component is being loaded. For example:

```jsx
import dynamic from 'next/dynamic'

Expand Down
8 changes: 5 additions & 3 deletions docs/api-reference/next.config.js/build-target.md
Expand Up @@ -8,17 +8,19 @@ Next.js supports various build targets, each changing the way your application i

## `server` target

> This is the default target, however, we highly recommend the [`serverless` target](#serverless-target). The `serverless` target enforces additional constraints to keep you in the [Pit of Success](https://blog.codinghorror.com/falling-into-the-pit-of-success/).
> This is the default target, however, we highly recommend the [`serverless` target](#serverless-target). The `serverless` target enforces [additional constraints](https://rauchg.com/2020/2019-in-review#serverless-upgrades-itself) to keep you in the [Pit of Success](https://blog.codinghorror.com/falling-into-the-pit-of-success/).

This target is compatible with both `next start` and [custom server](/docs/advanced-features/custom-server.md) setups (it's mandatory for a custom server).

Your application will be built and deployed as a monolith. This is the default target and no action is required on your part to opt-in.

## `serverless` target

> Deployments to [ZEIT Now](https://zeit.co/home) will automatically enable this target. You do not need to opt-into it yourself, but you can.
> Deployments to [ZEIT Now](https://zeit.co) will automatically enable this target. You do not need to opt-into it yourself, but you can.

This target will output each page in a self-contained Serverless Function. It's only compatible with `next start` or Serverless deployment platforms (like ZEIT Now) — you cannot use the custom server API.
This target will output independent pages that don't require a monolithic server.

It's only compatible with `next start` or Serverless deployment platforms (like [ZEIT Now](https://zeit.co)) — you cannot use the custom server API.

To opt-into this target, set the following configuration in your `next.config.js`:

Expand Down
2 changes: 1 addition & 1 deletion docs/api-reference/next/link.md
Expand Up @@ -99,7 +99,7 @@ function NavLink({ href, name }) {
export default NavLink
```

> **Note:** If you’re using [emotion](https://emotion.sh/)’s JSX pragma feature (`@jsx jsx`), you must use `passHref` even if you use an `<a>` tag directly.
> **Note**: If you’re using [emotion](https://emotion.sh/)’s JSX pragma feature (`@jsx jsx`), you must use `passHref` even if you use an `<a>` tag directly.

## If the child is a function component

Expand Down
41 changes: 41 additions & 0 deletions docs/api-routes/dynamic-api-routes.md
Expand Up @@ -19,3 +19,44 @@ export default (req, res) => {
```

Now, a request to `/api/post/abc` will respond with the text: `Post: abc`.

### Catch all API routes

API Routes can be extended to catch all paths by adding three dots (`...`) inside the brackets. For example:

- `pages/api/post/[...slug].js` matches `/api/post/a`, but also `/api/post/a/b`, `/api/post/a/b/c` and so on.

> **Note**: `slug` is only a name, it can be anything, a catch all API route is formed by having the brackets used by dynamic API routes, the three dots, and a parameter name (`[...param]`).
lfades marked this conversation as resolved.
Show resolved Hide resolved

Matched parameters will be sent as a query parameter (`slug` in the example) to the page, and it will always be an array, so, the path `/api/post/a` will have the following `query` object:

```json
{ "slug": ["a"] }
```

And in the case of `/api/post/a/b`, and any other matching path, new parameters will be added to the array, like so:

```json
{ "slug": ["a", "b"] }
```

An API route for `pages/api/post/[...slug].js` could look like this:

```js
export default (req, res) => {
const {
query: { slug },
} = req

res.end(`Post: ${slug.join(', ')}`)
}
```

Now, a request to `/api/post/a/b/c` will respond with the text: `Post: a, b, c`.

## Caveats

- Predefined API routes take precedence over dynamic API routes, and dynamic API routes over catch all API routes. Take a look at the following examples:
- `pages/api/post/create.js` - Will match `/api/post/create`
- `pages/api/post/[pid].js` - Will match `/api/post/1`, `/api/post/abc`, etc. But not `/api/post/create`
- `pages/api/post/[...slug].js` - Will match `/api/post/1/2`, `/api/post/a/b/c`, etc. But not `/api/post/create`, `/api/post/abc`
10 changes: 10 additions & 0 deletions docs/getting-started.md
Expand Up @@ -17,6 +17,16 @@ The interactive course with quizzes will guide you through everything you need t

## Setup

Create a new Next.js app using `create-next-app`:
lfades marked this conversation as resolved.
Show resolved Hide resolved

```bash
npm init next-app
lfades marked this conversation as resolved.
Show resolved Hide resolved
# or
yarn create next-app
```

lfades marked this conversation as resolved.
Show resolved Hide resolved
## Manual Setup
chibicode marked this conversation as resolved.
Show resolved Hide resolved

Install `next`, `react` and `react-dom` in your project:

```bash
Expand Down
11 changes: 7 additions & 4 deletions docs/routing/dynamic-routes.md
Expand Up @@ -67,15 +67,17 @@ Client-side navigations to a dynamic route can be handled with [`next/link`](/do

Dynamic routes can be extended to catch all paths by adding three dots (`...`) inside the brackets. For example:

- `pages/post/[...slug].js` matches `/post/a`, but also `post/a/b`, `post/a/b/c` and so on.
- `pages/post/[...slug].js` matches `/post/a`, but also `/post/a/b`, `/post/a/b/c` and so on.

> **Note**: `slug` is only a name, it can be anything, a catch all route is formed by having the brackets used by dynamic routes, the three dots, and a parameter name (`[...param]`).
lfades marked this conversation as resolved.
Show resolved Hide resolved

Matched parameters will be sent as a query parameter (`slug` in the example) to the page, and it will always be an array, so, the path `/post/a` will have the following `query` object:

```json
{ "slug": ["a"] }
```

And in the case of `post/a/b`, and any other matching path, new parameters will be added to the array, like so:
And in the case of `/post/a/b`, and any other matching path, new parameters will be added to the array, like so:

```json
{ "slug": ["a", "b"] }
Expand All @@ -85,9 +87,10 @@ And in the case of `post/a/b`, and any other matching path, new parameters will

## Caveats

- Predefined routes take precedence over dynamic routes. Take a look at the following examples:
- Predefined routes take precedence over dynamic routes, and dynamic routes over catch all routes. Take a look at the following examples:
- `pages/post/create.js` - Will match `/post/create`
- `pages/post/[pid].js` - Will match `/post/1`, `/post/abc`, etc. but not `/post/create`
- `pages/post/[pid].js` - Will match `/post/1`, `/post/abc`, etc. But not `/post/create`
- `pages/post/[...slug].js` - Will match `/post/1/2`, `/post/a/b/c`, etc. But not `/post/create`, `/post/abc`
- Pages that are statically optimized by [Automatic Static Optimization](/docs/advanced-features/automatic-static-optimization.md) will be hydrated without their route parameters provided, i.e `query` will be an empty object (`{}`).

After hydration, Next.js will trigger an update to your application to provide the route parameters in the `query` object.