如何使用VuePress开发并部署静态博客网站(附进阶的自定义主题教程)

2023-11-15

VuePress使用教程

前言

作为一个程序员,拥有一个自己的博客网站算得上是家常便饭了
每当我们解决一个问题时,及时总结并记录下来是一个对学习很有帮助的习惯,方便以后遇到同类型的问题时,不用再去百度谷歌找半天。而将这些内容发布在自己的博客网站上,同样也可以让其他遇上同样问题的人看到,并帮助到他们。借用在一个个人博客上看到的一句话:

对任何渴望进步的人来说,写博客/文章/回答对自己的成长帮助都是巨大的。频率和数量不必过分强求,有话要说就写写,没事就歇歇,随意点。因为坚持写作的那一刻起,你就已经开始受益。

我想,这就是搭建个人博客网站最大的意义

这里附上我自己开发的 Vuepress 主题来供大家参考:vuepress-theme-vivek
觉得有用的话麻烦动动小手点一下 star,这将会是我继续前进的动力~

1、安装

安装之前,需要确保Node.js的版本要在8或以上

1.1 全局安装

# 安装
npm install -g vuepress # 或者:cnpm install -g vuepress,yarn global add vuepress

# 创建项目目录并进入该目录
mkdir vuepress-starter && cd vuepress-starter

# 新建一个 markdown 文件
echo '# Hello VuePress!' > README.md

# 开始写作
vuepress dev .

# 构建静态文件
vuepress build .

1.2 本地安装

# 将 VuePress 作为一个本地依赖安装
npm install -D vuepress # 或者:cnpm install -D vuepress,yarn add -D vuepress

# 新建一个 docs 文件夹
mkdir docs

# 新建一个 markdown 文件
echo '# Hello VuePress!' > docs/README.md

# 开始写作
npx vuepress dev docs

如果你的现有项目依赖了 webpack 3.x,推荐使用 Yarn 而不是 npm 来安装 VuePress。因为在这种情形下,npm 会生成错误的依赖树。

接着在 package.json 中加入脚本

{
  "scripts": {
    "docs:dev": "vuepress dev docs",
    "docs:build": "vuepress build docs"
  }
}

开始使用:

# 开始写作
npm run docs:dev # 或者:yarn docs:dev

# 生成静态的HTML文件
npm run docs:build # 或者:yarn docs:build

2、目录结构

VuePress遵循约定大于配置的原则,推荐如下目录结构:

image-20200807152422303.png

各目录及文件的作用:

  • docs/.vuepress: 用于存放全局的配置、组件、静态资源等。
  • docs/.vuepress/components: 该目录中的 Vue 组件将会被自动注册为全局组件。
  • docs/.vuepress/theme: 用于存放本地主题。
  • docs/.vuepress/styles: 用于存放样式相关的文件。
  • docs/.vuepress/styles/index.styl: 将会被自动应用的全局样式文件,会生成在最终的 CSS 文件结尾,具有比默认样式更高的优先级。
  • docs/.vuepress/styles/palette.styl: 用于重写默认颜色常量,或者设置新的 stylus 颜色常量。
  • docs/.vuepress/public: 静态资源目录。
  • docs/.vuepress/templates: 存储 HTML 模板文件。
  • docs/.vuepress/templates/dev.html: 用于开发环境的 HTML 模板文件。
  • docs/.vuepress/templates/ssr.html: 构建时基于 Vue SSR 的 HTML 模板文件。
  • docs/.vuepress/config.js: 配置文件的入口文件,也可以是 YMLtoml
  • docs/.vuepress/enhanceApp.js: 客户端应用的增强。

自定义 templates/ssr.htmltemplates/dev.html 时,最好基于默认的模板文件来修改,否则可能会导致构建出错。模板文件内容如下:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title></title>
  </head>
  <body>
    <div id="app"></div>
  </body>
</html>

默认的页面路由

文件的相对路径 页面路由地址
/README.md /
/guide/README.md /guide/
/config.md /config.html

3、基本配置

3.1 配置文件

所有VuePress相关的配置都放在 .vuepress 目录下,一个 VuePress 网站必要的配置文件是 .vuepress/config.js,它应该导出一个 JavaScript 对象:

module.exports = {
  title: 'Hello VuePress',
  description: 'Just playing around'
}

3.2 主题配置

要使用一个主题时,可以在.vuepress/config.js配置文件中添加theme字段:

module.exports = {
    //使用发布到npm上的主题
    theme: 'vuepress-theme-xx',
    //主题名以vuepress-theme开头的可以使用如下缩写
    theme: 'xxx',
    //适用于Scoped Packages
    theme: '@org/vuepress-theme-xxx',// 或者一个官方主题: '@vuepress/theme-xxx'
    //缩写
    theme: '@org/xxx'// 或者一个官方主题: '@vuepress/xxx'
}

3.3 常用配置

3.3.1 导航栏配置

.vuepress/config.js配置文件中添加themeConfig,通过其中的nav来配置导航栏:

themeConfig: {
    nav: require('./nav')//通常会将导航栏的配置放在另一个文件中
}

//nav.js文件内容:
//exports一个数组
module.exports = [
    {
        //可多级嵌套
        //test为标签的文字内容
        text: '测试',
        //items为子标签列表
        items: [
            {
                text: '内部链接',
                items: [
                    //link为导航栏链接,会自动识别内部链接与外部链接
                    { text: '测试1', link: '/test/one' },
                    { text: '测试2', link: '/test/two' }
                ]
            },
            {
                text: '外链',
                items: [
                    { text: '阿里云', link: 'https://www.aliyun.com/' },
                    { text: '腾讯云', link: 'https://cloud.tencent.com/' }
                ]
            }
        ]
    }
]

3.3.2 侧边栏配置

.vuepress/config.js配置文件中添加themeConfig,通过其中的sidebar来配置导航栏:

themeConfig: {
    sidebar: {
		'/frontend/': [
            ['', 'HTML'],
            'Sass',
            'Git'
        ],
        '/album': [
            ['', '写在前面'],
            '手绘',
            '板绘'
        ]
    }
}

4、静态资源

4.1 相对路径

在VuePress中,所有Markdown文件都会被webpack编译成Vue组件,因此在引用静态资源时更倾向于使用相对路径:

![test image](./img/xxx.jpg)

也可以使用 ~ 前缀来明确指出这是一个webpack的模块请求,这样将允许通过webpack别名来引用文件或npm依赖:

![image from alias](~@alias/xxx.jpg)
![image from dependency](~some-dependency/xxx.jpg)

webpack的别名可以通过 .vuepress/config.js 中的 configureWebpack 来配置:

module.export = {
    configureWebpack: {
        resolve: {
            alias: {
                '@alias': 'path/to/some/dir'//某个路径
            }
        }
    }
}

4.2 公共文件

像favicons和PWA的图标等,并不直接被任何一个markdown文件或者主题组件引用的资源,可以放在 .vuepress/public 中,它们最终会被复制到生成的静态文件夹中

4.3 基础路径

当网站被部署到一个非根路径下,例如 https://eddievandeer.github.io/docs/,需要在 .vuepress/config.js 中设置 base 的值为 /docs/ (注意:/开头,/结尾)。 base 一旦被设置,将作为前缀插入到 .vuepress/config.js 中所有的以/开始的路径

VuePress还提供了一个内置的helper $withBase,可以生成正确的路径:

<!-- 在Markdown文件中也是如此 -->
<!-- 因为每一个Markdown文件将首先被编译成HTML,接着作为一个Vue组件传入vue-loader -->
<img :src="$withBase('/xxx.png')" alt="xxx">

5、部署到Github

步骤:

  • 若要将博客发布到 https://<USERNAME>.github.io/<REPO>/仓库,需要在 config.js 中将base设置为 "/<REPO>/"

  • 使用Git新建一个分支gh-pages:

git branch gh-pages
  • 配置 .gitignore 文件,忽略 node_modules 目录和 dist 目录

  • 在项目中创建一个 deploy.sh 文件:

#!/usr/bin/env sh

# 确保脚本抛出遇到的错误
set -e

# 生成静态文件
npm run docs:build

# 进入生成的文件夹
cd docs/.vuepress/dist

# 如果是发布到自定义域名
# echo 'www.example.com' > CNAME

git init
git add -A
git commit -m 'deploy'

# 如果发布到 https://<USERNAME>.github.io
git push -f git@github.com:<USERNAME>/<USERNAME>.github.io.git master:gh-pages

# 如果发布到 https://<USERNAME>.github.io/<REPO>
git push -f git@github.com:<USERNAME>/<REPO>.git master:gh-pages

cd -
  • 使用Git将代码发布到主分支master上,并运行 deploy.sh 文件的脚本,将编译后的文件发布到gh-pages分支:
git add -A
git commit -m "message"
git push
yarn deploy

完成以上步骤即可在 https://<USERNAME>.github.io/https://<USERNAME>.github.io/<REPO> 访问自己的博客网站了

6、自定义主题

6.1 目录结构

.vuepress 文件夹下创建 thmem ,目录结构如下:

theme
├── components 			//组件
├── global-components 	//全局组件
├── layouts				//布局
|   ├── Layout.vue		//主页布局文件
|   ├── AnotherLayout.vue
|   └── 404.vue
├── styles				//样式
|   ├── index.css
|   └── palette.styl	//调色板
├── index.js			//入口文件
└── enhanceApp.js		//客户端增强文件,可导入全局文件

创建完 thmem 目录后,即可在此目录中以平常开发vue项目的方式开发博客网站

6.2 组件

theme/components 目录下的.vue文件将会作为一般组件来使用,而 global-components 目录下的.vue文件将会被自动注册为全局组件,可以直接使用

6.3 布局

theme/layout 目录下创建一个 Layout.vue 文件,Vuepress将会以此为首页布局来渲染 docs 根目录下的 README.md 文件

其他目录下的 README.md 文件需要添加Front Matter:

---
layout: ArticleDetail
---
此处意为当前目录下的文件将会使用 ArticleDetail.vue 作为页面布局

以此来指定该页面要渲染在哪一个布局文件里

404.vue 文件将会在匹配不到相应路由时渲染,提示用户错误访问

6.4 配置

theme 根目录下的 index.js 文件中可以配置要使用的插件,使用方式:

module.exports = {
    //配置网页图标
    head: [
        ['link', {
            rel: 'icon',
            href: '/assets/icon/favicon.ico'
        }]
    ],
    //配置插件
    plugins: [
        'vuepress-plugin-container',
        ['@vuepress/search', {
            searchMaxSuggestions: 10
        }],
        '@vuepress/back-to-top',
        '@vuepress/nprogress'
    ]
}

同样在 theme 根目录下的 enhanceApp.js 文件可以进行应用级别的优化,使用方式:

//导入全局使用的文件
import '@theme/styles/main.scss'
import 'font-awesome/css/font-awesome.min.css'
import 'prismjs/themes/prism-tomorrow.css'

export default ({
      Vue, // VuePress 正在使用的 Vue 构造函数
      options, // 附加到根实例的一些选项
      router, // 当前应用的路由实例
      siteData, // 站点元数据
      isServer // 当前应用配置是处于 服务端渲染 或 客户端
}) => {
      // ...做一些其他的应用级别的优化
}

7、使用Github Actions持续集成服务

创建仓库后,仓库顶部的菜单会出现 Actions 一项,如下图所示:

image-20210209220630248.png

使用该服务需要 GitHub 密钥,参照官方文档来生成一个密钥

生成完密钥后,进入到Settings下的Secrets,点击右上角的按钮将密钥储存到当前仓库的 Settings/Secrets 里面image-20210209222552103.png
这个环境变量的名字可以随便起,这里我用的是 ACCESS_TOKEN ,如果命名和我不一样,则在后续的脚本编写中,变量的名字也要换成自己的变量名。在Value中填入刚刚生成的密钥内容,然后点击 Add secret 添加环境变量
image-20210209222937086.png
打开项目根目录下的 package.json 文件,添加一个 homepage 字段,以此来指定项目发布后的根目录

"homepage": "https://[username].github.io/[repository]"

在项目根目录下创建 .github/workflows 目录,在目录下创建一个 .yml 文件,该文件的命名没有要求,文件内容可参考如下我使用的Action:

name: Build and Deploy
on: [push]
jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout 									
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用VuePress开发并部署静态博客网站(附进阶的自定义主题教程) 的相关文章

随机推荐

  • ThinkPHP5.0完全开发手册——调试模式

    调试模式 ThinkPHP有专门为开发过程而设置的调试模式 开启调试模式后 会牺牲一定的执行效率 但带来的方便和除错功能非常值得 我们强烈建议ThinkPHP开发人员在开发阶段始终开启调试模式 直到正式部署后关闭调试模式 方便及时发现隐患问
  • react框架学习总结(纯干货)

    首先 我先给出我学习react框架的参考教程 以下内容都是我依据此教程的个人总结 react教程 React与JSX function Square props return
  • C语言实现简单加密算法 凯撒密码 RSA算法 简介及实现

    凯撒密码的原理以及实现过程 1 算法介绍 凯撒密码的核心思想就是移位 将明文的每一个字符 在 密码系统所支持字符序列中向右平移N 映射得到新的字符从而实现加密 而解密则相反向左平移N 加密的Key即为N 2 实验测试 加密 解密 3 源代码
  • php代码审计【11】动态函数执行和匿名函数执行

    1 动态函数执行 函数与函数之间的调用 可能会造成的漏洞 缺陷代码 2 匿名函数 Anonymous functions 也叫闭包函数 closures 允许临时创建一个没有指定名称的函数 最经常用作回调函数 ca
  • libtool的作用及应用

    gcc library makefile archive command object 注意 本文为转载 原文也是转载 但是为了尊重他人得劳动成果 我将将转载网址贴出来 libtool常见于autoconf automake 单独用的例子很
  • xss绕过,payload全集

    XSS总结 xss分为三种 反射型xss DOM型XSS及存储型XSS 不同类型的XSS的危害不同 有兴趣的可以观看一下csdn上明智讲的关于XSS攻击及原理 https edu csdn net course detail 8585里面的
  • OMG,学它!java培训讲师面试技巧

    基础 JAVA基础 JAVA集合 JAVA多线程并发 网络 数据结构与算法 框架 Spring SpringMVC MyBatis 设计模式 分布式 负载均衡 Zookeeper Redis MQ kafka 微服务 Netty与RPC S
  • Linux常用的四种压缩命令

    文章目录 一 tar命令 二 gzip命令 三 rar命令 四 zip命令 总结 一 tar命令 语法 tar option file 常用参数 c或 create 建立新的备份文件 f lt 备份文件 gt 或 file lt 备份文件
  • Substance与PBR工作流总结

    关于PBR PBR即基于物理的渲染 是一套尝试基于真实世界光照物理模型的渲染技术合集 使用了一种更符合物理学规律的方式来模拟光线 达到更真实的渲染效果 而且可以直接通过物理参数来直观地达到想要的结果 不用通过拙劣的各种参数调整 物理参数一般
  • uni-app crypto-js DES 加解密 ,支持app , h5,小程序

    crypto js DES 加解密 支持app h5 小程序 第一步 npm install crypto js 可以直接下载示例运行 看控制台打印 下载地址 https ext dcloud net cn plugin id 13351
  • Git GitHub入门2:新建Git repository并提交修改

    选择一个文件夹 执行 git init 命令 we initialize an empty git repository in the current directory 要想使用ls 查看列表 需要换成Windows powershell
  • 利用WMI打造完美三无后门(scrcons.exe)

    Welcome 各位ScriptKid 欢迎来到脚本世界 今天忙了一天 比较累 不废话那么多了 切入正题 这个 三无 后门的核心就是WMI中的永久事件消费者ActiveScriptEventConsumer 以下简称ASEC WMI中有许多
  • 微电网日前优化调度 。算例有代码(3)

    个人电气博文传送门 学好电气全靠它 个人电气博文目录 持续更新中 在前文我对问题1 2进行了解答 本文对问题3 进行解答 由于本人非研究调度的 问题3求解阐述自己对比赛论文问题3的见解 问题3 最优日前调度方案二 若考虑蓄电池作用 且微网与
  • camera HSYNC:VSYNC

    HSYNC 行锁存 换行信号VSYNC 祯锁存 换页信号 320 240的屏 每一行需要输入320个脉冲来依次移位 锁存进一行的数据 然后来个HSYNC 脉冲换一行 这样依次输入240行之后换行同时来个VSYNC脉冲把行计数器清零 又重新从
  • MySql基础汇总-DDL DML DQL DCL,存储过程,事务,触发器,函数等

    use testdb 一 数据库操作语言 DDL 数据库定义语言 create drop alter DML 数据库管理语言 insert update delete DQL 数据库查询t usert student 语言 select D
  • upload-labs靶场全通关

    upload labs靶场全通关 pass 1 pass 2 pass 3 pass 4 pass 5 pass 6 pass 7 pass 8 pass 9 pass 10 pass 11 pass 12 pass 13 pass 14
  • linux如何入门

    微信设置水滴昵称 个性中带点萌 1 学习Linux之前先认识Unix l Unix是一个强大的多用户 多任务操作系统 l 于1969年在AT T的贝尔实验室开发 l UNIX的商标权由国际开放标准组织 The Open Group 所拥有
  • js逆向-常见DES加密

    声明 本文仅供参考学习 切勿用于他途 违者后果自负 前言 目标网站 aHR0cHM6Ly9wYXNzcG9ydC5jaGFuZ2hvbmcuY29tL2xvZ2luLmRvP3ZpZXc9dmlwJnNlcnZpY2U9aHR0cDovL2
  • 向上转型和向下转型

    一 概念 向上转型是指将子类的实例赋值给父类类型的变量 向下转型是指将父类的实例赋值给子类类型的变量 二 向上转型 1 向上转型后父类的引用所指向的属性是父类的属性 2 如果子类重写了父类的方法 那么父类引用指向的或者调用的方法是子类的方法
  • 如何使用VuePress开发并部署静态博客网站(附进阶的自定义主题教程)

    VuePress使用教程 前言 作为一个程序员 拥有一个自己的博客网站算得上是家常便饭了 每当我们解决一个问题时 及时总结并记录下来是一个对学习很有帮助的习惯 方便以后遇到同类型的问题时 不用再去百度谷歌找半天 而将这些内容发布在自己的博客
Powered by Hwhale