十、Next.js,导出静态HTML应用程序

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

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

部署web应用程序的最佳方式是作为静态HTML应用程序,如果可能的话。使用静态应用程序,您可以使用像NGINX这样的快速高效的web服务器,或者像ZEIT now或GitHub页面这样具有成本效益的静态托管服务。

但并不是所有的应用都可以作为静态应用来部署,如果你的应用需要在运行时生成动态页面,你就不能将它作为一个静态应用来部署。

如果你可以将你的应用归类为静态应用,您可以使用next.js来构建它。
Next.js3.0带来了新的特性允许你把一个应用程序作为静态页面导出。

在这节课中,我们将探讨这个特性。
让我们开始吧。

在这节课中,我们需要一个简单的Next.js应用程序。试着下载下面的示例应用程序。
(这是我们在之前的课程中创建的博客应用。)

git clone https://github.com/arunoda/learnnextjs-demo.git
cd learnnextjs-demo
git checkout static-blog-base

你可以执行以下命令:

npm install
npm run dev

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

导出首页

现在,我们将导出首页(pages/index.js)作为一个静态HTML页面。

首先,创建一个名为 next.config.js 的文件,在你的应用程序的根目录,并添加以下内容:

module.exports = {
  exportPathMap: function () {
    return {
      '/': { page: '/' }
    }
  }
}

然后将下面的NPM脚本添加到package.json中。

 "scripts": {
    "build": "next build",
    "export": "next export"
  }

然后运行以下命令:

npm run build
npm run export

现在,您可以在项目中看到一个名为“out”的目录中的导出的HTML内容。

这是一个功能齐全的静态网页应用,你可以把它部署到任何静态主机服务上,而且效果很好。
但在此之前,我们需要在本地测试它。

为了测试这款应用,请在全局安装 serve NPM模块:

npm install -g serve

“serve”是一个非常简单的静态web服务器。您也可以使用其他类似的工具。
但是为了让事情变得简单,使用 serve 在这一课中。

在安装了“serve”之后,可以从应用程序根下面运行以下命令:

cd out
serve -p 8080

现在,您可以使用:http://localhost:8080来访问您的静态应用程序。
一切都应该照常工作。

现在尝试访问这个页面:http://localhost:8080/p/hello-nextjs/

你如何描述输出?

只有首页

正如您所经历的那样,您将得到一个“Not Found”的页面作为内容。当你试图直接访问页面时,你会得到它。除了首页(/),您还可以看到其他页面的相同行为。

这就是这里发生的事情:

您可以通过客户端访问所有页面,因为应用程序加载了相关的JavaScript内容。但是当您尝试直接加载它时,它就没有HTML内容可以使用。

那是因为我们只在Next.js导入出首页 index(/)的原因。

看看我们添加的配置:

module.exports = {
  exportPathMap: function () {
    return {
      '/': { page: '/' }
    }
  }
}
导出其它页面

现在,让我们试着进出口和所有其他页面。

为此,向next.config.js文件 添加以下内容:

module.exports = {
  exportPathMap: function () {
    return {
      '/': { page: '/' },
      '/about': { page: '/about' },
      '/p/hello-nextjs': { page: '/post', query: { title: "Hello Next.js" } },
      '/p/learn-nextjs': { page: '/post', query: { title: "Learn Next.js is awesome" } },
      '/p/deploy-nextjs': { page: '/post', query: { title: "Deploy apps with Zeit" } }
    }
  }
}

正如上面的配置所示,/about 路径与 / 路径非常相似。但其他的则有些不同。

这里是这样的:

为了在我们的应用中呈现博客文章,我们有一个单独的页面叫做/post。我们通过查询字符串将不同的内容传递给该页面。
因此,在导出应用程序时,我们还需要提供这些查询字符串。

这就是我们用上面的配置来处理所有页面,从/p/开始。

现在关闭已经运行的应用程序,并在你的应用程序根中运行以下命令:

npm run build
npm run export
cd out
serve -p 8080

现在,您将能够访问以下页面而没有任何问题:

http://localhost:8080/p/learn-nextjs/


让我们做一个简单的任务。

在您的配置中添加以下内容:

'/p/exporting-pages': { page: '/post', query: { title: "Learn to Export HTML Pages" } }

我们的最终配置将是这样的:

module.exports = {
  exportPathMap: function () {
    return {
      '/': { page: '/' },
      '/about': { page: '/about' },
      '/p/hello-nextjs': {page: '/post', query: { title: "Hello Next.js" } },
      '/p/learn-nextjs': { page: '/post', query: { title: "Learn Next.js is awesome" } },
      '/p/deploy-nextjs': { page: '/post', query: { title: "Deploy apps with Zeit" } },
      '/p/exporting-pages': { page: '/post', query: { title: "Learn to Export HTML Pages" } }
    }
  }
}

然后关闭当前的“serve”实例,并在应用程序根中运行以下命令:

npm run export
cd out
serve -p 8080

现在尝试访问这个页面:http://localhost:8080/p/exporting-pages/
页面的输出是什么?

不需要总是构建

如您所见,我们可以访问页面而不会有任何问题。这个页面在/页面中是不可用的,但是我们可以为它生成静态HTML。

这是因为导出的HTML完全由我们添加到的配置控制 next.config.js.

为了导出该页面,这些是我们调用的命令:

npm run export
cd out
serve -p 8080

正如您所看到的,没有 npm run build 命令。这是为什么呢?

页面已经在那里了

next.js 在运行下一个导出命令时,js不会构建应用程序。在这种情况下,在构建中已经存在/post页面,并且不需要再次构建整个应用程序。

但如果我们对这款应用做了任何改动,我们就需要再次开发应用来获得这些变化。

部署应用程序

部署应用程序非常简单。只需访问“out”目录,并将其部署到您最喜欢的静态主机服务。

如果你现在用的是ZEIT now,这是如何做到的:

cd out
now
Paste_Image.png
就是这样

这都是关于next.js的静态HTML导出特性。你可以开发你的应用,通常是 next (也就是:npm run dev),当你部署这个应用的时候,你可以把它导出为一个静态应用。

但是,如果您需要在部署应用程序后动态创建页面,那么这不是解决方案。

为此,您需要构建应用程序,并在开始时启动它,或者使用我们的programmatic API

本文翻译自:https://learnnextjs.com/excel/static-html-export

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,392评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 《了凡四训》、高我与高维智慧 1,大家好,非常荣幸能够与大家一起分享,首先我说一下,讲的人是最大的受益者,我来讲对...
    梅一健Dave阅读 977评论 0 0
  • 看到这个APP的名字时就喜欢上了好幸运这个时代还有那么多喜欢文字并每天坚持下来的人我也要开启记录了,记录那些小心情...
    浅绿的安静阅读 57评论 0 0