安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

使用Next。js创建Blog

11月19日 温柔冢投稿
  Next。js已经成为React应用程序最重要的框架之一。它可以帮助开发人员在没有模板的情况下构建更好的服务器端渲染React应用程序。
  Next。js之所以能成为目前最好的React框架之一,与其很多特性离不开,比如打包构建、路由预取、TypeScript、SEO等。
  对于那些想要拥有一个简单但功能强大的博客的人来说,使用Next。js创建博客是当今的最佳选择。
  SEO(搜索引擎优化)是改进应用程序在搜索引擎排名的过程。对于任何想要在搜索引擎上获得更好排名并带来更多流量的博客来说,这都是非常重要的。
  我们将在本文中使用Next。js来构建博客。我们将介绍SSG(静态站点生成)的工作原理,并完成SEO友好的博客。入门
  使用官方推荐的CreateNextApp创建项目npxcreatenextapplatesttypescriptoryarncreatenextapptypescriptorpnpmcreatenextapptypescript复制代码
  为什么要使用CreateNextApp交互式体验:不带任何参数运行npxcreatenextapplatest,将会开启交互模式,引导创建项目零依赖:CreateNextApp没有依赖,毫秒级创建项目离线支持:CreateNextApp侦测网络状态,无网状态将使用本地依赖缓存支持模板:通过加入example参数,可以拉取官方仓库任何模板集成测试:集成测试功能
  创建完成后项目目录构造如下:。README。mdnextenv。d。tsnext。config。jsnodemodulespackage。jsonpagespnpmlock。yamlpublicstylestsconfig。json复制代码安装依赖pnpminstallglobbygraymatterdayjschakrauireactprismjsemotionreactemotionstyledframermotionnextmdxremoteremarkgfm复制代码创建文章
  根目录新增posts目录,在posts目录下创建两个mdx文件(postsjshelloWorld。mdx,postsdemo。mdx),为什么是mdx文件呢?mdx支持渲染组件,支持引入导出组件,详细文档参考MDX创建公共函数目录
  根目录新增utils目录,在utils目录下创建getAllPosts。js并写入如下函数importfsfromfsimport{globby}fromglobbyimportmatterfromgraymatterconstdayjsrequire(dayjs)constrelativeTimerequire(dayjspluginrelativeTime)dayjs。extend(relativeTime)获取所有文章constGetAllPostsasync(){constpostsawaitglobby(〔posts〕)returnposts。reduce((prev,next){constfileContentsfs。readFileSync(next,utf8)const{data,content}matter(fileContents)constpostData{。。。data,group:dayjs(data。date)。format(MMMYYYY),date:dayjs(data。date)。format(MMMDD,YYYY),fromNow:dayjs(data。date)。fromNow(),modified:dayjs(data。modified)。format(MMMDD,YYYY),content,slug:next。replace(posts,)。replace(。mdx,)}!data。draftprev。push(postData)returnprev},〔〕)。sort((a,b)dayjs(b。date)dayjs(a。date))}根据slug导出文章constGetPostBySlug(slug){eslintdisablenextlinenoundefreturnnewPromise((resolve,reject){GetAllPosts()。then((posts){constpostposts。find((post)post。slug。includes({slug。join()}))resolve(post)})。catch((){reject({})})})}export{GetAllPosts,GetPostBySlug}复制代码创建组件
  根目录新增components目录创建PostPage。tsx组件,内容如下:importReact,{useEffect}fromreactimportPrismfromprismjsimport{Box}fromchakrauireact以下按需引入require(prismjscomponentsprismgo)require(prismjscomponentsprismpython)require(prismjscomponentsprismjavascript)require(prismjscomponentsprismcss)require(prismjscomponentsprismbash)require(prismjscomponentsprismswift)require(prismjscomponentsprismtsx)require(prismjscomponentsprismjsx)require(prismjscomponentsprismtypescript)require(prismjscomponentsprismsql)require(prismjsthemesprismokaidia。min。css)constPostPage({children}){useEffect((){consthighlightasync(){awaitPrism。highlightAll()}highlight()。then((){})},〔children〕)return(Boxpositionrelativew23fontSizetext。sm{children}Box)}exportdefaultPostPage复制代码创建pagesindex。tsximportNextLinkfromnextlinkimport{Fragment}fromreactimport{List,LinkOverlay,ListItem,Container,Heading,Image}fromchakrauireactconstIndexPage({groupByMonthPosts}){return(Container{Object。keys(groupByMonthPosts)。map((group){return(Fragmentkey{group}Headingash3mt{12}mb{4}{group}HeadingListspacing{3}{groupByMonthPosts〔group〕。map((post){return(ListItempositionrelativedisplayflexgap{2}alignItemscenterkey{post。title}NextLinklegacyBehaviorhref{{post。slug}}passHrefLinkOverlay{post。title}LinkOverlayNextLink{post。tags。map((tag){return(Imagekey{tag}boxSize{4}objectFitcoveralt{tag}srca2020imgdataimg。jpgdatasrc{https:picsrust。vercel。appuPicicons{tag}。svg})})}ListItem)})}ListFragment)})}Container)}exportdefaultIndexPageexportasyncfunctiongetStaticProps(){const{GetAllPosts}awaitimport(utilsgetAllPosts)constpostsawaitGetAllPosts()constgroupByMonthPostsposts。reduce((prev,next){if(Array。isArray(prev〔next。group〕)){prev〔next。group〕。push(next)}else{prev〔next。group〕〔〕prev〔next。group〕。push(next)}returnprev},{})return{props:{groupByMonthPosts}}}复制代码创建pages〔。。。slug〕。tsximport{MDXRemote}fromnextmdxremoteimport{serialize}fromnextmdxremoteserializeimportdynamicfromnextdynamicimportErrorPagefromnexterrorimportNextLinkfromnextlinkimport{useRouter}fromnextrouterimportReactfromreactimportremarkGfmfromremarkgfmimportcomponentsfromutilscomponentsimport{Container,Box,Heading,Text,Link,Image,Center}fromchakrauireactconstPostPagedynamic(()import(componentsPostPage))constPost({title,description,date,originalUrl,mdxSource,cover}){constrouteruseRouter()if(!router。isFallback!mdxSource){returnErrorPagestatusCode{404}}return(Containermt{20}maxW{{sm:container。sm,md:container。md,lg:container。2xl,xl:container。xl}}classNamepostNextSeotitle{title}description{description}openGraph{{title,description}}BoxashgroupTexttextAligncentercolorgray。500fontSizexsaspPublished{date}TextHeadingtextAligncenterash1mt{4}mb{2}{title}Heading{originalUrl(Centercolorgray。500fontSizesmmb{8}本文翻译自:NextLinklegacyBehaviorhref{originalUrl}passHrefLink{originalUrl}LinkNextLinkCenter)}BoxImageboxSize100srca2020imgdataimg。jpgdatasrc{cover??https:cdn。jsdelivr。netghmanonicupicsmasteruPicNhSU3O。jpg}alt{title}PostPageMDXRemote{。。。mdxSource}components{components}PostPageContainer)}exportconstgetStaticPathsasync(){const{GetAllPosts}awaitimport(utilsgetAllPosts)constallPostsawaitGetAllPosts()constpathsallPosts。map((post)({params:{slug:post。slug。split()}}))return{paths,fallback:false}}exportconstgetStaticPropsasync({params}){const{GetPostBySlug}awaitimport(utilsgetAllPosts)const{content,。。。data}awaitGetPostBySlug(params。slug)constmdxSourceawaitserialize(content,{mdxOptions:{remarkPlugins:〔〔remarkGfm〕〕,rehypePlugins:〔〕},scope:data})return{props:{。。。data,mdxSource}}}exportdefaultPost复制代码
  至此,基本框架搭建完成,接下来调整样式及组件的引入,以及mdx渲染修正。调整样式
  可选
  引入tailwind。css,执行pnpminstallDtailwindcsspostcssautoprefixernpxtailwindcssinitp
  修改tailwind。config。js,如下:type{import(tailwindcss)。Config}module。exports{content:〔。pages。{js,ts,jsx,tsx},。components。{js,ts,jsx,tsx}〕,theme:{extend:{}},plugins:〔〕}复制代码
  修改全局样式stylesglobals。复制代码
  必须
  修改pagesapp。tsx,引入chakraui的配置pagesapp。jsimport{ChakraProvider}fromchakrauireactfunctionMyApp({Component,pageProps}){return(ChakraProviderComponent{。。。pageProps}ChakraProvider)}exportdefaultMyApp复制代码
  到这里,不出意外,你的界面应该是长这样
  点击链接,应该会报错,未引入utilscomponents,这个是配置mdx内元素渲染的组件,参考MDXComponents,mdx提供默认的渲染组件,所以,这个是非必须的,不需要删除即可
  个人比较喜欢chakraui,所以将组件都转成了chakraui提供的组件,配置如下:importCanIUsefromcomponentsCanIUseimport{Heading,Link,Box}fromchakrauireactimport{FiExternalLink}fromreacticonsficonstcomponents{CanIUse,h2:(props)(Headingash2mb{4}{props。children}Heading),h3:(props)(Headingash3mb{4}{props。children}Heading),h4:(props)(Headingash4mb{4}{props。children}Heading),h5:(props)(Headingash5mb{4}{props。children}Heading),p:(props)(Boxaspmb{4}{props。children}Box),p:(props)Boxmb{4}{props。children}Box,a:(props){return(LinkdisplayinlineflexalignItemscenterhref{props。href}gap{2}isExternal{props。children}FiExternalLinkLink)}}exportdefaultcomponents复制代码
  好了,到这里基本完成了基于Next。js的博客搭建。部署到Vercel
  Next。js部署到Vercel无需更改和配置,无缝衔接。
  【SourceCode】
  也可以参考我的个人网站Manon。icuHome
投诉 评论 转载

苹果售后拉胯?人民网揭下手机厂商遮羞布,小米售后深入人心不知道大家买手机是怎么个买法,我想应该不是那种只盯着手机的参数,而对品牌的售后等等毫不关心吧?如果那样的话,手机一旦出了什么问题,那真的是投诉无门,想找地方维权都难。记得18年……程式码也附上给你Google以广告呼吁打通iMessage及早在2022年8月,Google发起GetTheMessage,并建立网页呼吁苹果要在iMessage接通Android用户。相信大家都知道使用iMessage发送信息给苹果用……姐弟俩进入3年级成绩突变妈妈感叹学龄前这项启蒙教育太重要文早教妈妈育儿优选10岁龙凤胎,姐姐比较欢动喜欢唱歌跳舞,弟弟却爱读书喜欢地理历史。刚到3年级,两个孩子的表现差别迥异,妈妈后悔5岁时没有一起培养孩子这项能力。……生态云南(四十七)昆明大观公园秋景,碧水蓝天,彩菊缤纷大观公园位于昆明市以西约2公里的滇池湖畔,始建于明朝洪武元年(公元1368年)。清康熙三十五年(公元1696年)建大观楼,公园也因此而得名,为昆明市区最大的公园。大观楼濒……华能新能源装机,突破5000万千瓦华能阿拉善左旗巴彦诺日公30万千瓦风电项目,属于典型的沙戈荒项目,共安装60台5兆瓦风电机组,配备90兆瓦180兆瓦时储能装置。12月30日上午10时18分,随着华能阿拉……人类航天史上十大重要时刻人类航天史是一部充满了坎坷和悲壮的科技奋斗史,今天让我们来回顾一下人类航天史上的重要时刻。一、卡西尼惠更斯号卡西尼惠更斯号卡西尼惠更斯号是美国国家航空航天局、……使用Next。js创建BlogNext。js已经成为React应用程序最重要的框架之一。它可以帮助开发人员在没有模板的情况下构建更好的服务器端渲染React应用程序。Next。js之所以能成为目前最好……川南唯一四川宜宾长宁县入选中国旅游百强县市宋成均封面新闻记者伍雪梅11月24日,《中国县域旅游竞争力报告2022》发布,《报告》同时揭晓了2022(第五届)中国县域旅游综合竞争力百强县市、2022(第五届)中国县……沃恩比赛间隙球员们会交谈并做出调整我们之前没有这种交流直播吧12月13日讯篮网今日客场112100击败奇才,取得四连胜。赛后,篮网主帅沃恩接受了采访。沃恩表示:在一次集合时,球员们拿着平板在看刚才的回放,他们会交互交谈,并努……10!韩国队迎来噩耗,英超前锋伤退,或对世界杯比赛有影响北京时间9月27日晚19:00,韩国队在主场迎战喀麦隆队,最终,在两队均浪费了多次机会的前提下,韩国队队依靠天王级球员孙兴慜在上半场第34分钟的进球,最终以10击败了喀麦隆。从……郑明明凝时抗皱胶囊精华真的有效果吗?拒绝肌肤松垮、没有光泽是所有女生毕生所追求的吧,忍不住熬夜追剧、玩手机的你们,化妆台上也应该放一些抗老护肤品啦,但是市面上的抗老护肤品琳琅满目,让人挑到眼花缭乱,稍有不注意就会……中央电视台录播10月30日至11月6日乒乓球比赛安排头条创作挑战赛10月31日(周一)CCTV522:05实况录像(奥林匹克)2022年世乒联世界杯决赛1CCTV519:30实况录像(奥林匹克)20……
散文新岁之念印尼将禁婚外性行为及未婚同居外国观光客也适用引忧虑使用ESPS3上进行手势识别笑着活下去15年,男主身败名裂,女主让人惋惜,杨幂逆袭重燃烟火气消费在复苏!元旦假期各大商圈景区消费热学历是你踏入社会的敲门砖春节总抢不到票?别再花钱买加速包了,这样抢票回家才稳锡安回归!西部最大黑马诞生女性变老的4个特征,一个不占为好,日常做好3件事,帮助延缓衰双十一换手机不能贪便宜,只有这几款机型值得入手,不会踩坑梅香44相聚时难别也难,12小时的新沂之行,虽了心愿,仍有遗刚刚!江苏省连云港市最新获批的建设工程项目出炉,含具体投资额我在凤台度过一个不一样的早晨武夷茶二年级写人作文爱英语的我在作管理水平量化时老板都在打算什么呢林心如甜美发型7趣1爱的老人养生法则安卓11来了,三星GalaxyNote10系列升级OneUI人间是牢狱,我们都在服刑期子华兄生日五首笑看风云奶奶家的院产后恢复装修坚决不能犯的5个错误,看看你中招了几个?

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利