九、Next.js,发布应用

Next.js是一个新的通用JavaScript框架,它为基于React和服务器的Web应用提供了一个新的可选方案。

Next.js目前已经开源,https://zeit.co/blog/next

你遇到过这个问题吗?

如何部署我的Next.js应用?

我们还没有讨论过这个问题,但它非常简单明了。

您可以部署Next.js应用到任何你可以运行node.js的地方。因此,没有任何类型的锁定,即使部署到ZEIT中也非常简单。

让我们学习部署Next.js应用。

首先,我们需要一个简单的Next.js应用程序。试着下载下面的示例应用程序:

git clone https://github.com/arunoda/learnnextjs-demo.git
cd learnnextjs-demo
git checkout using-shared-components

你可以执行以下命令:

npm install
npm run dev

现在,您可以通过导航到http://localhost:3000来访问该应用程序。

构建和启动

首先,我们需要建立Next.js应用于生产。它将为生产生成一组优化的代码。

为此,只需在package.json添加以下的npm脚本:

"scripts": {
  "build": "next build"
}

然后你需要启动Next.js应用在一个端口上。这将执行副渲染和服务页面(用上面的命令构建)。

为此,只需在package.json添加以下的npm脚本:

"scripts": {
  "start": "next start"
}

这将在3000端口启动我们的应用。

因此,您可以运行以下命令来运行我们的应用程序:

npm run build
npm run start
运行两个实例

现在,我们要运行两个应用程序,通常,我们这样做是为了水平地扩展我们的应用程序。
首先,对我们的start npm脚本做如下更改:

"scripts": {
  "start": "next start -p $PORT"
}

如果你在Windows上,你的启动脚本应该是 next start -p %PORT%.

现在让我们先来构建我们的应用程序。

npm run build

然后尝试在自己的终端中运行以下命令:

PORT=8000 npm start
PORT=9000 npm start

在Windows上,您需要以不同的方式运行命令。一种选择是将npm模块 cross-env
安装到你的应用中。
然后运行 cross-env PORT=9000 npm start 从命令行。

是否有可能在两个端口上访问我们的应用程序?

构建一次,运行多个实例

正如您所看到的,您需要一次构建您的应用程序。然后你可以在任意多的端口上启动它。

部署到 ▲ZEIT now

现在我们知道如何构建和y启动Next.js。我们用npm脚本做了所有的事情。因此,您将能够定制它,以使用您最喜欢的部署服务。

但如果你使用 ▲ZEIT now, 只有一个步骤。

只需添加以下的npm脚本:

"scripts": {
  "build": "next build",
  "start": "next start -p 8000"
}

然后 install now. 然后应用以下命令:

now

基本上,您运行您的应用程序根目录内"现在"命令。

在这里,我们提到端口8000作为我们启动应用程序的端口,但是我们在部署到ZEIT时并没有改变它。

那么,在部署到ZEIT的时候,我们可以在哪个端口访问我们的应用呢?

ZEIT总是使用443

实际上,即使你在端口8000上启动你的应用程序,你也可以使用端口443(默认端口为“https”网站)访问它。

这是ZEIT的一个特点。你只需要在你喜欢的任何端口上启动你的应用程序。ZEIT现在将把它映射到端口443。

构建您的应用程序在本地

▲ZEIT now 将检测npm构建脚本,并在它的构建基础结构中构建它。

但是,并不是所有的主机供应商都有类似的东西。
在这种情况下,你可以在本地创建你的应用:

npm run build

然后将应用程序部署到该应用程序中.next目录。

使用定制服务器部署应用程序

我们刚刚部署的应用程序不使用自定义服务器代码。但是如果我们有这个,我们怎么能部署它呢?

因此,请检出以下分支:

git checkout .
git checkout clean-urls-ssr

在这一点上,我们使用自定义服务器来运行我们的应用程序,所以在你的应用中加入Express:

npm install --save express
构建应用程序

即便如此,你也可以用Next.js来构建你的应用。因此,添加以下的npm脚本:

"scripts": {
  "build": "next build"
}
启动应用程序

我们需要创建自定义服务器代码来说明这是一个生产应用程序,为此,请从我们的server.js中查看这段代码

const express = require('express')
const next = require('next')

const dev = process.env.NODE_ENV !== 'production'
const app = next({ dev })
const handle = app.getRequestHandler()

app.prepare()
.then(() => {
  const server = express()

  server.get('/p/:id', (req, res) => {
    const actualPage = '/post'
    const queryParams = { title: req.params.id }
    app.render(req, res, actualPage, queryParams)
  })

  server.get('*', (req, res) => {
    return handle(req, res)
  })

  server.listen(3000, (err) => {
    if (err) throw err
    console.log('> Ready on http://localhost:3000')
  })
})
.catch((ex) => {
  console.error(ex.stack)
  process.exit(1)
})

看看下面的一行:

const dev = process.env.NODE_ENV !== 'production'

因此,我们可以像这样启动我们的应用程序:

NODE_ENV=production node server.js

因此,我们的“npm start”脚本将如下:

"scripts": {
   "start": "NODE_ENV=production node server.js"
}

这就是你要做的。

最后

现在,您几乎知道了如何部署Next.js应用。

您还可以了解更多关于部署的内容 deploying Next.js 从我们的文档。

本文翻译自:https://learnnextjs.com/basics/deploying-a-nextjs-app

你可能感兴趣的:(九、Next.js,发布应用)