折腾记录|使用 Nuxt.js 重写个人主页,使用 SSR 优化 SEO ,实现一些期待已久的效果

grtsinry43
9/19/2024
227 views
预计阅读时长 10 分钟

AI Summary

Powered By DeepSeek-R1
|

在 22 年刚创建个人主页的时候,由于我的技术水平不够,只能用一些 wordpress typecho 这种直观的工具,后来因为换域名等等一系列的问题就被搁置了...再后来为了过备案,用图形化工具和 bootstrap 糊了一个,而如今熟练掌握 Vue 和 React 等框架之后,也到了完全重写的时候了,于是就有了这段记录。

<!--more-->

关键词:Vue SSR,Nuxt.js

网页的开发一直在持续哇...本文章会持续跟进更新

最后链接:https://www.grtsinry43.com/

框架选择

首先,对于这种主页类的网站,单纯的 Vue React SPA(单页面应用)肯定是不行的,比如说这里我们使用 pure-admin 模板创建的一个后台系统(Vue3),对于搜索引擎来说不会等待页面完全加载和渲染,而抓到的这些内容无法分析网站的关键词和主题等,导致很难被搜索引擎排名考前,因此我们不得不从历史中汲取经验,从服务端生成静态网页,到了客户端渲染的单页面应用,又回到了服务端渲染

这样是很难做好 SEO 的

对于个人主页这种比较小的项目,我更喜欢使用 Vue 来完成开发,也就是其对应的 SSR 框架——Nuxt.js

快速上手

由于要使用 NuxtUI,我们便可以使用官方的创建工程的脚手架

bash
1npx nuxi@latest init -t ui [项目名称]

创建好项目之后,我们便可以像正常写 Vue 一样来进行开发啦

前置准备工作

在代码块以及项目名称中,我们选用一个等宽而且适用于代码的字体 JetBrains Mono,于是我们可以在 assets/fonts.css 中这样进行引入

css
1@font-face {
2    font-family: 'JetBrains Mono';
3    src: url('https://cdn.jsdelivr.net/gh/JetBrains/JetBrainsMono/web/woff2/JetBrainsMono-Medium.woff2') format('woff2');
4    font-weight: 500;
5    font-style: normal;
6}
7
8.font-jb-mono {
9    /* 设置fallback防止出现宋体 */
10    font-family: 'JetBrains Mono', 'Courier New', Courier, 'Lucida Sans Typewriter', 'Lucida Console', 'Microsoft YaHei', 'WenQuanYi Micro Hei', monospace;

注意这里要设置好 fallback 字体,因为某些 Windows 系统(雾)默认会回落到宋体,导致中文字体不堪入目

以后当我们需要使用的时候只需要挂上这个类名就好

防止掉头发

经典防止掉头发几件套:assets/global.css

css
1* {
2    margin: 0;
3    padding: 0;
4    box-sizing: border-box;
5}
6
7a {
8    text-decoration: none;
9    color: inherit;
10}

疑难解决方案与创新点

桌面与移动端导航栏适配

为了达到最完美的使用效果,我直接写了 NavBarNavBarMobile 两个组件,通过简单的媒体查询来进行切换

css
1@media (max-width: 800px) {
2  .nav-bar-desktop {
3    display: none;
4  }
5
6  .nav-bar-mobile {
7    display: block;
8  }
9}

对于移动段的 Navbar,我选择了可收起菜单来优化体验

vue
1const toggleMenu = () => {
2  isMenuOpen.value = !isMenuOpen.value
3}
4
5const toggleLocale = () => {
6  locale.value = locale.value === 'en' ? 'zh' : 'en';
7};
8</script>
9
10<template>

深浅色模式的极不优雅解决方案

js
1import {onMounted} from "vue";
2const colorMode = useColorMode();
3
4const toggleTheme = () => {
5  if (colorMode.preference === 'system') {
6    colorMode.preference = colorMode.value === 'dark' ? 'light' : 'dark';
7    buttonState.value = colorMode.preference === 'dark';
8  } else {
9    colorMode.preference = colorMode.preference === 'dark' ? 'light' : 'dark';
10    buttonState.value = colorMode.preference === 'dark';

这里深色模式的实现有点太不优雅了,我发现 NuxtUI 官网确实有一个跟随主题的开关,但是自己实现起来就是很奇怪,对于输出的 colorMode 有两个用的上的属性,一个是 preference 对应偏好主题(light dark system),一个是 value 对应当前主题(light dark),由于偏好能被保存下来,于是选择在切换按钮时改变 preference 的对应的值

当组件被挂载(onMounted),首先根据 value 设置初始的状态,当点击切换时,对于当前是否偏好系统要采取不同的方式来切换,不知道大佬们有没有什么好办法,或者过几天我再看看 Nuxt 源码

COPYRIGHT
作者grtsinry43
版权年份© 2024
许可协议

折腾记录|使用 Nuxt.js 重写个人主页,使用 SSR 优化 SEO ,实现一些期待已久的效果》采用知识共享署名 4.0 国际许可协议

转载请注明出处并遵循 CC BY 许可协议条款

相关推荐

问题解决|使用Less变量和媒体查询实现深浅色模式适配

使用Less变量简化css写法,并不影响css变量和媒体查询在深浅模式切换时的效果 <!--m...

grtsinry43
6/10/2024
137
0
0
用一个月的时间写一个自己的博客系统——Grtblog的技术介绍

用一个月的时间写一个自己的博客系统——Grtblog的技术介绍

终于,历时一个多月的开发 ~~bug~~ 和测试,这个目前问题很多很不成熟很难用的系统终于上线了.....

grtsinry43
12/14/2024
1022
9
9

学习分享|跨域解决、安卓开发探索、油猴脚本探索

最近学习的一些内容,包括跨域问题及其解决方案,安卓开发的简单探索,OpenAI的api做了个小插...

grtsinry43
6/10/2024
105
2
2

使用 Spring Boot + MyBatisPlus 提高效率,简化开发

最近一段时间,由于一些项目的需求,于是被迫用很快的速度学完了 Spring Framework,...

grtsinry43
8/11/2024
109
0
0

学习分享|原生三件套的网页效果

这是学习前端基础,用原生三件套尤其是js实现效果一些学习过程的记录,首先是静态的小米商城,之后实...

grtsinry43
6/10/2024
85
0
0
COMMENT 7273217684182011904

发表评论

来这里畅所欲言吧!
支持 Markdown 语法 0 / 3000

网站运行时间

0
0
0
0

在风雨飘摇之中

感谢陪伴与支持

愿我们不负热爱,继续前行