diff --git a/components/CommonHead.js b/components/CommonHead.js index f4f9a772..32b71fad 100644 --- a/components/CommonHead.js +++ b/components/CommonHead.js @@ -42,15 +42,6 @@ const CommonHead = ({ meta, children }) => { - {/* 预加载字体 */} - {BLOG.FONT_AWESOME && <> - - - } - {BLOG.FONT_URL?.map((fontUrl, index) => { - return - })} - {BLOG.COMMENT_WEBMENTION.ENABLE && ( <> diff --git a/next.config.js b/next.config.js index b97ad538..e6ef9935 100644 --- a/next.config.js +++ b/next.config.js @@ -98,6 +98,13 @@ module.exports = withBundleAnalyzer({ experimental: { scrollRestoration: true }, + // exportPathMap: (defaultPathMap, { dev, dir, outDir, distDir, buildId }) => { + // const pathMap = { ...defaultPathMap } + // // 忽略/sitemap.xml页面的导出 + // pathMap['/sitemap.xml'] = { page: false } + + // return pathMap + // }, publicRuntimeConfig: { // 这里的配置既可以服务端获取到,也可以在浏览器端获取到 NODE_ENV_API: process.env.NODE_ENV_API || 'prod', THEMES: themes diff --git a/pages/[prefix]/[slug].js b/pages/[prefix]/[slug].js new file mode 100644 index 00000000..65d025c1 --- /dev/null +++ b/pages/[prefix]/[slug].js @@ -0,0 +1,122 @@ +import BLOG from '@/blog.config' +import { getPostBlocks } from '@/lib/notion' +import { getGlobalData } from '@/lib/notion/getNotionData' +import { idToUuid } from 'notion-utils' +import { getNotion } from '@/lib/notion/getNotion' +import Slug from '.' + +/** + * 根据notion的slug访问页面 + * @param {*} props + * @returns + */ +const PrefixSlug = props => { + return +} + +export async function getStaticPaths() { + if (!BLOG.isProd) { + return { + paths: [], + fallback: true + } + } + + const from = 'slug-paths' + const { allPages } = await getGlobalData({ from }) + return { + paths: allPages?.filter(row => row.slug.indexOf('/') > 0).map(row => ({ params: { prefix: row.slug.split('/')[0], slug: row.slug.split('/')[1] } })), + fallback: true + } +} + +export async function getStaticProps({ params: { prefix, slug } }) { + let fullSlug = prefix + '/' + slug + if (JSON.parse(BLOG.PSEUDO_STATIC)) { + if (!fullSlug.endsWith('.html')) { + fullSlug += '.html' + } + } + const from = `slug-props-${fullSlug}` + const props = await getGlobalData({ from }) + // 在列表内查找文章 + props.post = props?.allPages?.find((p) => { + return p.slug === fullSlug || p.id === idToUuid(fullSlug) + }) + + // 处理非列表内文章的内信息 + if (!props?.post) { + const pageId = slug.slice(-1)[0] + if (pageId.length >= 32) { + const post = await getNotion(pageId) + props.post = post + } + } + + // 无法获取文章 + if (!props?.post) { + props.post = null + return { props, revalidate: parseInt(BLOG.NEXT_REVALIDATE_SECOND) } + } + + // 文章内容加载 + if (!props?.posts?.blockMap) { + props.post.blockMap = await getPostBlocks(props.post.id, from) + } + + // 推荐关联文章处理 + const allPosts = props.allPages.filter(page => page.type === 'Post' && page.status === 'Published') + if (allPosts && allPosts.length > 0) { + const index = allPosts.indexOf(props.post) + props.prev = allPosts.slice(index - 1, index)[0] ?? allPosts.slice(-1)[0] + props.next = allPosts.slice(index + 1, index + 2)[0] ?? allPosts[0] + props.recommendPosts = getRecommendPost(props.post, allPosts, BLOG.POST_RECOMMEND_COUNT) + } else { + props.prev = null + props.next = null + props.recommendPosts = [] + } + + delete props.allPages + return { + props, + revalidate: parseInt(BLOG.NEXT_REVALIDATE_SECOND) + } +} + +/** + * 获取文章的关联推荐文章列表,目前根据标签关联性筛选 + * @param post + * @param {*} allPosts + * @param {*} count + * @returns + */ +function getRecommendPost(post, allPosts, count = 6) { + let recommendPosts = [] + const postIds = [] + const currentTags = post?.tags || [] + for (let i = 0; i < allPosts.length; i++) { + const p = allPosts[i] + if (p.id === post.id || p.type.indexOf('Post') < 0) { + continue + } + + for (let j = 0; j < currentTags.length; j++) { + const t = currentTags[j] + if (postIds.indexOf(p.id) > -1) { + continue + } + if (p.tags && p.tags.indexOf(t) > -1) { + recommendPosts.push(p) + postIds.push(p.id) + } + } + } + + if (recommendPosts.length > count) { + recommendPosts = recommendPosts.slice(0, count) + } + return recommendPosts +} + +export default PrefixSlug diff --git a/pages/[...slug].js b/pages/[prefix]/index.js similarity index 94% rename from pages/[...slug].js rename to pages/[prefix]/index.js index 1523c674..788cee7d 100644 --- a/pages/[...slug].js +++ b/pages/[prefix]/index.js @@ -89,13 +89,14 @@ export async function getStaticPaths() { const from = 'slug-paths' const { allPages } = await getGlobalData({ from }) return { - paths: allPages?.map(row => ({ params: { slug: [row.slug] } })), + paths: allPages?.filter(row => row.slug.indexOf('/') < 0).map(row => ({ params: { prefix: row.slug } })), fallback: true } } -export async function getStaticProps({ params: { slug } }) { - let fullSlug = slug.join('/') +export async function getStaticProps({ params: { prefix } }) { + // let fullSlug = slug.join('/') + let fullSlug = prefix if (JSON.parse(BLOG.PSEUDO_STATIC)) { if (!fullSlug.endsWith('.html')) { fullSlug += '.html' @@ -110,7 +111,7 @@ export async function getStaticProps({ params: { slug } }) { // 处理非列表内文章的内信息 if (!props?.post) { - const pageId = slug.slice(-1)[0] + const pageId = prefix.slice(-1)[0] if (pageId.length >= 32) { const post = await getNotion(pageId) props.post = post diff --git a/pages/_document.js b/pages/_document.js index bee5073a..ec4f5335 100644 --- a/pages/_document.js +++ b/pages/_document.js @@ -13,8 +13,16 @@ class MyDocument extends Document { return ( - + + {/* 预加载字体 */} + {BLOG.FONT_AWESOME && <> + + + } + {BLOG.FONT_URL?.map((fontUrl, index) => { + return + })}