描述图片

2024年使用Nextjs重构主页

Published on
Authors
  • Name
    Wxm
    Twitter

最近在使用Nextjs完成工作,用的很舒服,遂决定用来重构许久不动的主页

技术选择

首先是框架,除了Nextjs之外,我平时也很常用的tailwindcss,可以快速构建网站页面。 经过查找最后决定使用"开箱即用"的 tailwind-nextjs-starter-blog作为基础来重构主页。

设计参考

很喜欢这种干净的页面,但是同时又有不少小设计,作为参考来制作。

未完成

#todo

  • BlogLayout修改
  • MDX样式修改
  • 动画优化
  • 字体
  • 评论系统
  • i18n国际化
  • rss生成
  • 添加音乐支持
  • 音乐播放器动画
  • PDF预览

问题与一些解决方案

favicons以及manifest

动效框架

页面的动画效果使用的framer-motion

能打打节省开发动画的时间,并且让动画的过渡更加丝滑。

不得不说和vue相比,react的动画库真的多太多了。

github page静态部署

关于静态部署如何设置,在文档中写的很清楚tailwind-nextjs-starter-blog,设置过就可以build了。

唯一需要注意的是,github page使用jekyll部署,会自动忽略下划线开头的文件,导致_next文件夹中的js css无法加载,在其中新建一个.nojekyll即可

meta信息

参考Hugo

过滤Post的修改

在修改Post过滤过程中,其实就是daaft设置为true,在dev模式还能正常显示,在build模式就会消失,如果想要做一些修改 可以搜索一个外部方法 allCoreContent ,这个方法会在NODE_ENV为production的时候过滤掉draft修改。然后做自己的修改即可。

评论系统

tailwind-nextjs-starter-blog 所提供的comments组件似乎有一些加载问题,所以最后还是自己解决吧。

giscus giscus-react

npm i @giscus/react
//作为组件中使用  现在giscus官网获取id 然后将下面替换即可
import Giscus from '@giscus/react';
export default function MyApp() {
  return (
    <Giscus
      id="comments"
      repo="giscus/giscus-component"
      repoId="MDEwOlJlcG9zaXRvcnkzOTEzMTMwMjA="
      category="Announcements"
      categoryId="DIC_kwDOF1L2fM4B-hVS"
      mapping="specific"
      term="Welcome to @giscus/react component!"
      reactionsEnabled="1"
      emitMetadata="0"
      inputPosition="top"
      theme="light"
      lang="en"
      loading="lazy"
    />
  );
}

build后的中文路径问题

我在dev模式中没有问题,但是当我打包build后出现路径问题。

// app/blog/[...slug]/page.tsx
const isDev = process.env.NODE_ENV === 'development'
const isBuild = process.env.NEXT_PUBLIC_IS_BUILD === 'true'
export const generateStaticParams = async () => {
	if (isDev) {
		return allBlogs.map((p) => ({
			slug: p.slug.split('/').map((name) => encodeURIComponent(name)),
		}))
	} else {
		return allBlogs.map((p) => ({
			slug: p.slug.split('/').map((name) => decodeURI(name)),
		}))
	}
}
// next.config.js
const isDev = process.env.NODE_ENV === 'development'
const isBuild =process.env.NODE_ENV === 'production' && process.env.NEXT_PUBLIC_IS_BUILD === 'true'
env: {
	NEXT_PUBLIC_IS_BUILD: isBuild.toString(),
},
// package.json
"scripts":{
	"build": "cross-env NEXT_PUBLIC_IS_BUILD=true && cross-env INIT_CWD=$PWD next build && cross-env NODE_OPTIONS='--experimental-json-modules' node ./scripts/postbuild.mjs",
}

最后

有疑问可以邮件联系我。

0:00/0:00

植松伸夫 - フィナーレ

植松伸夫 - プレリュード

笹井隆司 - 異郷の町

伊藤賢治 - Rising Sun

植松伸夫 - 街のテーマ

植松伸夫 - 怒闘

植松伸夫 - コーネリア城

植松伸夫 - チョコボのテーマ