您当前的位置:首页 >> 装修攻略

使用 Next.js 12 和 Cosmic 框架一个可以上线的餐厅网站

2023-04-10 12:16:13

ieFromRequest) {

// set the ----cookie----

response.cookie('location-cookie', ----${country|city|region}----);

}

return response;

}

3.按无需当前动态经年累月ISR

Next.js 发布新闻了一个线性unstable_revalidate(),允许你用到getStaticProps原先授权各个的网站。在getStaticProps中会,你不无必需选定 revalidate 来按无需原先可验证,只无必需在unstable_revalidate()子程序时按无需原先可验证的网站。

镜像

// pages/api/revalidate.js

export default async function handler(req, res) {

try {

await res.unstable_revalidate('/menu/' + req.body.data.slug)

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')

}

}

4. 用到 AVIF 借助极快的图片提高效率和更小的图片

内置的图片提高效率API已新版本以背书与ISR的网站完全相同的作法,即在于是就给予过时的图片并原先可验证。此外,它还背书 AVIF 图片,使图片比 WebP 小 20%。

此机制是可选的,在总编页面装配的时候可以选取动工。在明文next.config.js中会装配比如说变量才会:

镜像

// next.config.js

const nextConfig = {

reactStrictMode: true,

images: {

formats: ['image/avif', 'image/webp'],

domains: ['imgix.cosmicjs.com'],

},

}

module.exports = nextConfig

Cosmic 相似性摘录 可选用的 API:客户端自己并不一定 API 的 schema,models和 controllers。为方便起见, Cosmic 同时给予了REST 和 GraphQL API的作法。 加速且安全的章节行政系统和 API 可移植。 Webhooks在你无必需的任何以前回调,以赢得你不想的机制,用到 Cosmic API 开箱即用。 包涵Imgix复刻,可让你为针对跨平台体验提高效率的一个系统API开展稳固的实时。

Cosmic 操作

第一步建立完全免费的 Cosmic 帐户。让我们选取“刚开始”(Start from scratch)表单。

今天让我们将章节加进groups,用Object Type来共享组里的章节。例如,其余部分旧名、结尾、概述和页面等具有多种不同物件的其余部分,这些接口希望赢得复用以为有所不同其余部分建立章节。

建立Object Type并附加其余部分物件用来在“Content Model”中会并不一定“Metafields”。

今天,你可以为其余部分建立一个Object Type基本概念,并且可以像这样缓冲章节。

以多种不同的作法,你可以按照当前的数据基本概念、架构设计并不一定接口并建立Object Type:

Singleton 为一个单独的基本概念 Multiple 为可重复用到的基本概念

是时候得到 Next.js API的值了

将 Cosmic 接口装有到 Next.js API中会。

镜像

npm i cosmicjs

# or

yarn add cosmicjs

然后,转往到 Cosmic 背板 Your Bucket> Settings> API Access并找到你的 Bucket slug 和 API 读取公钥。

将此 Bucket slug 和 API 读取公钥附加到你的 Next.js API.env中会。

镜像

//.env

COSMIC_BUCKET_SLUG=your_cosmic_slug

COSMIC_READ_KEY=your_cosmic_read_key

要用到堆栈 UI,你无必需在GitHub中会将它奎尔。敞开适配器,粘贴或回传此code以装有所有相反项,然后运转它。

镜像

git clone

cd nextjs-restaurant-website-cms

npm install

#or

yarn install

npm run dev

#or

yarn dev

向我们之前在 Cosmic 背板中会建立的线性getDataFromBucket请,并按子类从 Cosmic 中会得到我们建立的章节params。

镜像

// src/lib/api.js

import Cosmic from 'cosmicjs';

const BUCKET_SLUG = process.env.COSMIC_BUCKET_SLUG

const READ_KEY = process.env.COSMIC_READ_KEY

const bucket = Cosmic().bucket({

slug: BUCKET_SLUG,

read_key: READ_KEY,

});

export async function getDataFromBucket(preview) {

const params = {

type: 'header',

props: 'title,slug,metadata,created_at',

sort: '-created_at',

...(preview && { status: 'all' }),

}

const data = await bucket.getObjects(params)

return data.objects

}

结果显示我们的章节,将其与我们的 UI 复刻,并将一些原素呈现到的网站。为此,你无必需将此附加到index.js。

镜像

// pages/index.js

import Head from 'next/head';

import Home from 'components/Home';

import Layout from 'components/Layout';

import Footer from 'components/Footer';

import AboutUs from 'components/AboutUs';

import SpacialMenu from 'components/Menu';

import Introduction from 'components/Introduction';

import VideoIntro from 'components/VideoIntro';

import Gallery from 'components/Gallery';

import Contacts from 'components/Contact';

import { getDataFromBucket } from 'lib/api';

import chooseByType from 'utils/chooseValueByType';

function Template({ data }) {

return (

<>

Next.js Restaurant CMS

}

export async function getStaticProps({ preview }) {

const data = (await getDataFromBucket(preview)) || [];

return {

props: { data },

}

}

export default Template;

比如说线性chooseByType将过滤我们在 Cosmic 背板中会建立的 Object Type。(Slug)

镜像

(Slug)

// src/utils/chooseValueByType.js

const chooseByType = (data, slugName) => {

if( data && slugName ) {

const chooseBySlug = data?.filter(content => Object.values(content).includes(slugName));

return chooseBySlug ? chooseBySlug[0] : [];

}

}

export default chooseByType;

自制菜单项的网站

在 Next.js 中会,你可以建立一个系统传输,可以考虑用比如说pages/menu/[slug].js的网站来建立单个菜单项的网站和一个系统传输:

镜像

// pages/menu/[slug].js

import Head from 'next/head';

import { useRouter } from 'next/router';

import Layout from 'components/Layout';

import Footer from 'components/Footer';

import Contacts from 'components/Contact';

import MenuIntro from 'components/MenuIntro';

import VideoIntro from 'components/VideoIntro';

import Gallery from 'components/Gallery';

import { getAllDataWithSlug,getDataFromBucket } from 'lib/api';

import chooseByType from 'utils/chooseValueByType';

function Menu({ data }) {

const {

query: {slug},

} = useRouter();

return (

<>

Next.js Restaurant CMS

}

export async function getStaticProps({ params, preview = null }) {

const data = (await getDataFromBucket(preview)) || [];

return {

props: { data },

}

}

export async function getStaticPaths() {

const dataWithSlug = (await getAllDataWithSlug()) || [];

return {

paths: dataWithSlug.map((menu) => ----/menu/${menu.slug}----),

fallback: true,

}

}

export default Menu;

该线性getServerSideProps可用每次子程序此传输时从 Cosmic 得到数据。在pages/api/revalidate.js中会,我们在unstable_revalidate()被子程序时用到unstable_revalidate线性来按无需原先可验证的网站。如果显现出来错误,Next.js 将继续结果显示最后失败转化的的网站。

在Vercel上部署code库后,你可以通过转往到 Cosmic 背板并通讯系统到Bucket Settings> Webhooks来动工章节更原先原先可验证。总编章节时要触发的事件是object.edited.published。Webhook URL 端点将如下表:${YOUR_VERCEL_DEPLOYMENT_URL}/api/revalidate。

这也使得在建立或新版本来自无头部的CMS 的章节时,你的网上更容易新版本。

今天来测试一下,在 Cosmic 背板中会总编章节,并详细信息动态章节立即新版本。

正确性

今天,你已持有一个一个系统的、可选用的、基本上复刻的堆栈,其中会包涵原先 Next.js 和 Cosmic 机制。你可以为其他子类的企业选用,并按照自己的习惯来用到。

英文版参阅

杨并州,51CTO社区总编,具有5年工作方面,投身消费市场就其IT工作。擅较宽于是就研发,大数据,算法等。

中文翻译结尾:Build a Production Ready Restaurant Website with Next.js 12 and Cosmic,笔记:Naira Gezhoyan

郑州不孕不育医院哪家比较专业
福州男科
成都甲状腺医院哪家好
治疗类风湿性关节炎的特效药
腱鞘炎吃什么药好得快
相关阅读
友情链接