2022年2月17日 星期四
Next.js 12.1
发布者我们很高兴发布 Next.js 12.1 中最受期待的功能之一
- 按需 ISR(Beta):使用 `getStaticProps` 立即重新验证页面。
- 扩展的 SWC 支持: `styled-components`、Relay 等。
- `next/jest` 插件:使用 SWC 实现零配置 Jest 支持。
- 使用 SWC 实现更快压缩(RC):比 Terser 快 7 倍的压缩速度。
- 自托管 Next.js 改进: Docker 镜像缩小约 80%。
- React 18 & 服务端组件 (Alpha):改进了稳定性和支持。
- 开发者调查:通过您的反馈帮助我们改进 Next.js。
立即运行 npm i next@latest 进行更新。
按需增量静态生成 (Beta)
Next.js 现在公开了一个函数 `unstable_revalidate()`,允许您重新验证使用 `getStaticProps` 的单个页面。这是自我们在 Next.js 9.5 中引入 增量静态生成 (ISR) 以来,我们最受请求的功能之一。
自 ISR 发布以来,我们看到 Tripadvisor、Parachute、HashiCorp 等公司大幅缩短了构建时间,同时保持了令人难以置信的性能。然而,我们听取了您关于基于时间间隔的重新验证的反馈,并很高兴提供更大的灵活性。
目前,如果您将 `revalidate` 时间设置为 `60`,所有访问者将在一分钟内看到您网站的相同生成版本。使缓存失效的唯一方法是有人在一分钟后访问该页面。您现在可以按需手动清除特定页面的 Next.js 缓存。
这使得在以下情况下更新您的网站变得更加容易
- 无头 CMS 的内容已创建或更新
- 电子商务元数据更改(价格、描述、类别、评论等)
export default async function handler(req, res) {
// Check for secret to confirm this is a valid request
if (req.query.secret !== process.env.MY_SECRET_TOKEN) {
return res.status(401).json({ message: 'Invalid token' });
}
try {
await res.unstable_revalidate('/path-to-revalidate');
return res.json({ revalidated: true });
} catch (err) {
// If there was an error, Next.js will continue
// to show the last successfully generated page
return res.status(500).send('Error revalidating');
}
}在 `getStaticProps` 内部,您无需指定 `revalidate` 即可使用按需重新验证。如果省略 `revalidate`,Next.js 将使用默认值 `false`(不重新验证),并且仅在调用 `unstable_revalidate()` 时按需重新验证页面。
增量静态生成适用于任何支持 Next.js 构建 API(`next build`)的提供商。从今天开始,部署到 Vercel 时,按需重新验证在将页面推送到边缘时,将在约 300 毫秒内全局传播。
查看我们的演示,了解按需重新验证的实际效果并提供反馈。Svix(企业级 webhook)和 Clerk(身份验证)也创建了一个按需 ISR 演示。
改进的 SWC 支持
我们希望让每个 Next.js 应用程序都能更快地构建生产版本,并在本地开发中获得即时反馈。Next.js 12 引入了一个新的 基于 Rust 的编译器,利用了原生编译的优势。
通过 12.1 版本,我们为 Next.js 编译器添加了对以下内容的支持
添加了以上六个转换后,我们现在已使用新编译器将最常见的 Babel 插件移植到 Rust。如果您希望看到其他插件,请在讨论中告知我们。此外,我们正在开发一个系统,通过 SWC 实现高性能 WebAssembly 插件。
零配置 Jest 插件
Next.js 现在使用基于 Rust 的 Next.js 编译器自动为您配置 Jest (`next/jest`) 来转换文件,包括
- 自动模拟样式表(`.css`、`.module.css` 及其 `.scss` 变体)和图像导入
- 将 `.env`(及所有变体)加载到 `process.env` 中
- 忽略 `node_modules` 进行测试解析和转换
- 忽略 `.next` 进行测试解析
- 加载 `next.config.js` 以获取启用 Next.js 编译器转换的标志
查看文档以了解更多信息,或从我们的 Jest 示例 开始使用。
使用 SWC 实现更快压缩
Next.js 12 引入了使用 SWC 作为 Next.js 编译器一部分的压缩功能。早期结果显示,它比 Terser 快 7 倍。 使用 SWC 的压缩功能现在在 12.1 版本中达到了发布候选 (RC) 阶段,并将成为 12.2 版本的默认设置。
您可以在 `next.config.js` 中选择使用 SWC 进行压缩
module.exports = {
swcMinify: true,
};请在讨论区中告诉我们您的反馈。
更快的图片优化
内置的图像优化 API 已更新,支持与 ISR 页面 相同的模式,即图像在后台以过期状态提供并重新验证(也称为 `stale-while-revalidate`)。
这对于图像优化来说是一个显著的性能提升。请参阅 图像缓存行为 以了解更多信息。
自托管 Next.js 的改进
Next.js 现在可以自动创建一个 `standalone` 文件夹,该文件夹仅复制生产部署所需的必要文件。这使得自托管 Next.js 应用程序的 Docker 镜像缩小了约 80%。
要在 `next.config.js` 中启用此自动复制功能。
module.exports = {
experimental: {
outputStandalone: true,
},
};这将在 `.next/standalone` 处创建一个文件夹,然后可以单独部署,而无需安装 `node_modules`。
查看文档或从 Docker 示例 开始。我们现在还有一个支持根据环境加载不同 `.env` 文件的 多环境 Docker 示例。
React 18、服务端组件和 SSR 流式传输 (Alpha)
如 Next.js Conf 所示,我们一直在努力将 React 18、服务端 Suspense、流式 SSR 以及最终的服务端组件引入 Next.js。
服务端组件是 React 中的一项新功能,通过分离服务端和客户端代码,您可以减小 JavaScript 包的大小。服务端组件允许开发者构建跨服务器和客户端的应用程序,将客户端应用程序丰富的交互性与传统服务端渲染改进的性能结合起来。
对于在 Next.js 中关注服务端组件从 alpha 到 beta 路径的开发者,以下是一些最近的更新
- 将服务端组件响应内联到 HTML 中,以避免二次请求
- 在流式传输时改进了脚本加载,以实现 React 18 的部分水合
- 支持 React 18 中的新 `useId` API
- 支持将 `_app` 作为服务端组件
- 服务端组件的代码拆分得到改进
- 改进了流式传输性能
- 能够更改 Node.js 和 Edge 之间的默认运行时(RFC)
我们正在努力让您能够在 Edge 上运行整个 Next.js 应用程序的服务端渲染。您可以选择哪些页面应该选择 Edge Runtime,这样您就可以在准备好时逐步将页面从 Node.js 迁移。
我们将很快发布另一篇文章,深入探讨 Edge Runtime。我们的两个演示(next-server-components 和 next-rsc-demo) 都已更新到最新更改。
其他错误修复和改进
- 使用带有 `target="blank"` 的 `` 标签不再提示使用 `next/link` 搭配 ESLint。
- `.d.ts` 文件不再被视为页面。
- 当向屏幕阅读器宣布页面更改时,`document.title` 现在优先于 `h1`。
- 现在可以创建 `pages/index/[...dynamic].js`,这在以前由于 `index` 是保留关键字而无法实现。
- 当使用 `dynamic(() => import('./some-component'), { ssr: false })` 时,该导入将自动从服务器代码中进行 tree-shaking。
- 为了减小安装尺寸并提高安全性,我们正在努力预编译更多依赖项。最新的添加是 `node-fetch`。
- 使用 中间件 时,快速刷新得到改进。
- 支持 ESLint 8,并与我们的 内置 ESLint 集成。
- `styled-jsx` 已升级到 5.0 版本,包括针对所有 `styled-jsx` 编译错误的新实用错误链接。
- Edge Runtime:支持 `AbortController` 和 `AbortSignal`
- Edge Runtime:添加了 `CryptoKey` 和 `globalThis.CryptoKey`。
- 通过最近的改进(重新加载超过 1,000 个模块),大型 Next.js 应用程序的快速刷新时间提高了约 60%。
- 如果快速刷新失败并导致整页重新加载,现在会显示通知。
- 在使用 React 18 严格模式时,已宣布的路由现在可以正确跳过宣布初始页面加载。
- 与 2021 年 12 月相比,我们已将 Next.js 存储库上的 开放问题数量减少了近 300 个(解决了近 1000 个问题)。
Next.js 开发者调查
通过我们的首次开发者调查分享您的反馈,帮助我们改进 Next.js。
本次调查分为两部分:一个包含八个问题的快速调查和一个深入探讨单个功能反馈的扩展调查。如果您有时间,我们非常希望您能填写这两个部分,但如果没有时间,请随时在第一部分之后提交您的答案。
您的答案将完全匿名,但如果您愿意,可以选择与我们分享您的应用程序 URL。
感谢您帮助我们改进 Next.js!
感谢贡献者
Next.js 是 超过 2,000 名独立开发者、Google 和 Facebook 等行业合作伙伴以及我们核心团队共同努力的成果。
为了简化贡献流程,我们将 Next.js 仓库迁移到使用 Turborepo 以提高构建性能。我们还添加了测试脚手架和错误链接,使编写测试变得更容易。最后,我们录制了一个40 分钟的演示视频,展示了如何为 Next.js 贡献代码。
此版本由以下贡献者共同完成:@MaedahBatool, @mutebg, @sokra, @huozhi, @hanford, @shuding, @sean6bucks, @jameshfisher, @devknoll, @yuta-ike, @zh-lx, @amandeepmittal, @alunyov, @stefanprobst, @leerob, @balazsorban44, @kdy1, @brittanyrw, @jord1e, @kara, @vvo, @ismaelrumzan, @dlindenkreuz, @MohammadxAli, @nguyenyou, @thibautsabot, @hanneslund, @vertti, @KateKate, @stefee, @mikinovation, @Leticijak, @mohsen1, @ncphillips, @ehowey, @lancechentw, @krychaxp, @fmacherey, @pklawansky, @RyanClementsHax, @lakbychance, @sannajammeh, @oliviertassinari, @alexander-akait, @u-yas, @Cheprer, @msp5382, @chrispat, @getspooky, @Ryz0nd, @klaasman, @midgleyc, @kumard3, @jesstelford, @neeraj3029, @glenngijsberts, @pie6k, @wouterraateland, @timneutkens, @11koukou, @thesyedbasim, @aeneasr, @ijjk, @lfades, @JuniorTour, @xavhan, @mattyocode, @padmaia, @Skn0tt, @gwer, @Nutlope, @styfle, @stipsan, @xhoantran, @eolme, @sespinosa, @zenorocha, @hjaber, @benmvp, @T-O-R-U-S, @dburrows, @atcastle, @kiriny, @molebox, @Vienio99, @kyliau, @PepijnSenders, @krystofex, @PizzaPete, @souljuse, @Schniz, @Nelsonfrank, @Mhmdrza, @hideokamoto-stripe, @Emrin, @gr-qft, @delbaoliveira, @redbar0n, @lxy-yz, @Divlo, @kachkaev, @teleaziz, @OgbeniHMMD, @goncy, @bennettdams, @hsynlms, @callumgare, @jonrosner, @karaggeorge, @rpie3, @MartijnHols, @bashunaimiroy, @NOCELL, @rishabhpoddar, @omariosouto, @theMosaad, @javivelasco, @pierrenel, @lobsterkatie, @tharakabimal, @saevarb, @nbouvrette, @paulnbrd, @ecklf, @renbaoshuo, @chozzz, @tbezman, @karlhorky, @j-mendez, @ffan0811, @arthurfiorette, @chimit, @joperron, @moh12594, @rasmusjp, @bryanrsmith, @TrySound, @josharsh, @thecrypticace, @arturparkhisenko, @segheysens, @thevinter, @AryanBeezadhur, @xiaohp, @tknickman, @oriolcp, @smakosh, @jorrit, @mix3d, @Clecio013, @michielvangendt, @intergalacticspacehighway, @jbraithwaite, @marcelocarmona, @benmerckx, @haykerman, @steven-tey, @jaredpalmer, @pi-guy-in-the-sky, @JuanM04, @apollisa, @D-Pagey, @Kikobeats, @ramosbugs, @dan-weaver, @chris-stytch, @MikevPeeren, @janpio, @emw3, @nubpro, @cmdcolin, @joostdecock, @sgallese, @housseindjirdeh, @minervabot, @cjboco, @Ryuurock, @dm430, @mkarkachov, @nvh95, @gfortaine, @zifeo, @vicente-s, @Rohithgilla12, @brookton, @skirsten, @davidfateh, @DavidBabel, @mannybecerra, @pveyes, @kaykdm, @xhiroga, @mzaien, @losfair, @ykzts, @knezevicdev, @yang-feng-yfeng, @xuchaobei, @elkevinwolf, @fabienheureux, @nilskaspersson, @Andarist, @mathcrln, @dferber90, @FranciscoMoretti, @benschwarz, @wendellhu95, @gazdagergo, @imabp, @ljosberinn, @samuliasmala, @ka2jun8, @monsonjeremy, @pqt, @leoortizz, @michel-kraemer, @ntkoopman, @iicdii, @chentsulin, @ericmatthys, @lennym, @balogunkeji, @wnr, @chemicalkosek, @KittyGiraudel, @OKinane, @KonstHardy, @BrandonRomano, @furcan, @dusanralic, @elliottsj, @hi-ogawa, @panva, @genetschneider, @thundermiracle, @stefano-rainieri, @ericbiewener, @vordgi, @stevejarvis, @ihmpavel, @matamatanot, @dyarfaradj, @iheyunfei, @ascorbic, @fytriht, @emzoumpo, @onurtemiz, @a-ursino, @mxschmitt, @bywo, @OArnarsson, @TurekBot, @gish, @vadymshymko, @kamsar, @skhaz, @Prashoon123, @IrisvanOllefen, @evan-bradley, @ntltd, @EzequielDM, @oBusk, @martpie, @BruceRodrigues, @luke-h1, @lucasvazq, @velocity23, @AkiraTsuboi, @mitheelgajare, @JamiesWhiteShirt, @leroydev, @JulienZD, @leotaku, @mattfwood 和 @kripod。