用vuepress搭建一个够自己用的博客

栏目: 编程语言 · 发布时间: 7年前

内容简介:很久以前,自己拥有一个用hexo搭建的静态博客网站:ox:,记得当时为了把它搞出来,废了不少劲:anger:,然后后来又断断续续更改过一些配置和样式,但是因为感觉各种麻烦,所以就放在1、 目前开发用vue框架:fire:2、 就是想用它搞一个:muscle:

很久以前,自己拥有一个用hexo搭建的静态博客网站:ox:,记得当时为了把它搞出来,废了不少劲:anger:,然后后来又断断续续更改过一些配置和样式,但是因为感觉各种麻烦,所以就放在 github 上积累和很多的尘土:cupid:,到现在也懒得在打扫了(其实是好久不用,有点忘了怎么用了:-1::poop:),前段时间在百度统计上看了看那个静态网站的访问人数,发现已经很久很久没人访问过了,:sweat_smile:,然而就在前段时间(没错,就是前面那个时间),我灵光一闪,为啥不重新弄个静态博客呢:heart_eyes:,于是我就决定洗洗睡觉(没错,那是一个夜深人静的晚上),第二天抽空找个简单点的框架,然后搭个静态博客,用来记录自己的所见所闻所想:tada: 第二天一大早吃完中午饭后(睡到中午了:sunglasses:),我就看起了VuePress官网,没错,我选择了VuePress框架,至于为什么呢,有以下几点:

1、 目前开发用vue框架:fire:

2、 就是想用它搞一个:muscle:

3、 反正也简单,实在不行再换呗(搞不起来是不可能的):clap:

4、 没有别的理由了:notes:

它有什么好处、特性、和别的框架对比? 看人家官网就得了,说的挺好的

项目搭建

没啥好说的,按照人家官网搭就完事了,人家写的那么清晰、明了。感觉尤大出品的文档都很友好,阅读起来很方便

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

# 新建一个 docs 文件夹,你也可以打开编辑器来手动创建
mkdir docs

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

# 启动,让你感受下效果-----but:这种启动方式不爽,还是放package.json里省事,所以感受完了就结束进程吧,
npx vuepress dev docs
复制代码

项目安装完成后,我们进入 package.json 里面,添加script启动项

"scripts": {
    "docs:dev": "vuepress dev docs",
    "docs:build": "vuepress build docs"
  }
复制代码

上面一顿操作后我们现在要知道三件事情:

1、我们以后所有的文章都将在 docs 中写

2、开发,也就是写作的时候执行:

yarn docs:dev # 或者:npm run docs:dev // 默认端口http://localhost:8080/
复制代码

3、打包生成静态html文件,执行

yarn docs:build # 或者:npm run docs:build
复制代码

默认情况下,生成的静态文件放在 .vuepress/dist 中,不过可以改的

好了,先来认识下我们以后要大展拳脚的地方 docs 目录:

.
├─ docs //以后要在这里面写文章,直接在此文件夹下新建文件夹,然后再建md文档就行,链接会自动生成
│  ├─ README.md // 这个将会是我们以后的首页
│  └─ .vuepress // 这个里面会存放一些配置和组建
│     └─ public  // 静态文件存放地
│     └─ components  // 组建存放地
│     └─ config.js //配置文件,我们以后的所有配置基本都在这里写
└─ package.json
复制代码

原谅我这部分说的比较糙,其实这部分看官网就好了,人家讲的的确挺详细的,要讲的主要是下面的内容:

首页配置

官网默认主题提供了一个只需要写写配置就能生成的页面,格式是固定的,和VuePress的首页一毛一样,但是这不是我想要的(我也不知道我想要什么样的),所以我在 .vuepress/components 中新建了一个组建叫 home ,同时在首页引入:(md文件里可以写vue代码的哦)

// 记得不要复制注释
---
navbar: false       // 不要导航栏
isNoPage: true       // 自定义的属性
sidebar: false        // 不要侧导航
pageClass: home-list  //自定也页面类
---
<home />
复制代码

.vuepress/components/home.vue 和我们平时写vue没啥区别,引用的时候就用这个文件的文件名就可以了,官网有介绍,因为目前还没想好首页改做成什么样的,所以就先这样放着

isNoPage 是我自己写的,主要是为了标志当前是否是文章页,以后会用来做判断,在 this.$site.frontmatter 中存放

pageClass 是页面自定义类,编译的时候会把这个类加在外层的div中,可以根据这个来写自己想要的样式

/**这段css可以写在.vuepress/style.styl中,这个是我对首页写的样式**/
home-list{
  .page-edit{
    display: none /**隐藏首页的编辑和最后修改时间标签**/
  }
  #gitalk-container{
    display:none  /**隐藏首页的评论**/
  }
}
复制代码

列表页的实现

每一张文章页,我都会在头部添加

---
tags: vuepress, 前端
description: 本文介绍应该VuePress搭建一个博客,据官网说:VuePress 由两部分组成:一部分是支持用 Vue 开发主题的极简静态网站生成器,另一个部分是为书写技术文档而优化的默认主题。它的诞生初衷是为了支持 Vue 及其子项目的文档需求。
---
复制代码
  • tags: 是当前页面的标签,用于在列表页生成标签云
  • description:页面的描述信息,在列表页会显示,官网中有获取 more 之前的方法,但是会有样式,所以会感觉很难看,所以我就添加的这个 description 字段,当然,我也并没有放弃官网的方法,因为有时候可能真的懒得写描述信息了,所以加了个判断
<div v-if="item.frontmatter.description" class="art">
  {{item.frontmatter.description}}……<a :href="item.path" class="look">阅读原文</a>
</div>
<div class="art" v-html="item.excerpt" v-else></div>
复制代码

获取说有文章的列表我是通过一开始设置的 isNoPage 来做的判断

const arts = this.$site.pages.filter(item => {
  return !item.frontmatter || !item.frontmatter.isNoPage
})
复制代码

标签的实现

我的标签是一个vue组建,然后在列表页引入改组件;上面说到,我在每个文章前面都会加 tags ,我会在标签组件中通过遍历 this.$site.pages ,拿到所有的标签,然后去重,即是我所有页面的标签

<template>
  <div class="tags">
    <h6>标签云</h6>
    <span v-for="item in tags" @click="handleChangeTag(item)">{{item}}</span>
    <span @click="handleChangeTag('all')">所有</span>
  </div>
</template>

<script>
export default {
  data() {
    return {
      tags: []
    }
  },
  created() {
    const tags = this.$site.pages.map(item => {
      return item.frontmatter && item.frontmatter.tags || ""
    })
    const tagsArr = tags.join(",").split(",").filter(i => i !== "")
    this.tags = [...new Set(tagsArr)]
  },
  methods: {
    // 点击标签更改列表
    handleChangeTag(tag) {
      this.$emit('change-tag',tag)
    }
  },
}
</script>
复制代码

favorite.icon配置

favorite.icon 也就是网页左上角那个小图标

用vuepress搭建一个够自己用的博客
首先我们需要一个小图标,然后放在 .vuepess/public 下,然后 打开 .vuepress/config.js

,添加

head:[
	['link', { rel: 'shortcut icon', href: '/favorite.icon type: 'image/jpg' }]
]
复制代码

注意href写的是 /favorite.icon ,而不是 /public/favorite.icon

样式更改

.vuepress 下新建两个 styl 文件用来写样式

override.styl :用来覆盖默认主体样式,比如我想让我的内容占据屏幕的90%,可以:

$contentWidth = 90%
复制代码

style.styl :写自己一些自定义的样式,可以在这个文件夹里写,比如单独修改导航的颜色

.navbar{
  background:red
}
复制代码

官网对此的介绍

添加评论

作为一个有灵魂的博客,怎么可以不能评论呢,我能忍,博客也不能忍:star2:,我的评论系统用的是GITALK,官网说是这是一个基于 Github Issue 和 Preact 开发的评论插件,现在用的多的貌似还有valine、 gitment ,这个貌似可以统计阅读量;希望gitalk也能出个阅读量统计功能,官网提供的方式有两种,一种是在html中引入js文件,另一种是用npm包的形式,我选择的是通过js将评论需要的js和css用js动态插入到页面中,在 .vuepress/enhanceApp.js 中写如下代码:(enhanceApp.js介绍)

const getGitalk = ({pages})=> {
  const path = window.location.pathname
  // 获取当前页面信息
  const dist = pages.filter(item => {
    return item.path === path
  })[0]

  //只有在isNoPage是false的时候才会显示评论
  if (!dist.frontmatter || !dist.frontmatter.isNoPage) {
    const page =document.querySelector('.page')

    const linkGitalk = document.createElement('link');
    linkGitalk.href = 'https://cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.css';
    linkGitalk.rel = 'stylesheet';
    document.body.appendChild(linkGitalk);

    const scriptGitalk = document.createElement('script');
    scriptGitalk.src = 'https://cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.min.js';
    document.body.appendChild(scriptGitalk);

    scriptGitalk.onload= () => {
      let gitalk = document.createElement('div')
      gitalk.id = 'gitalk-container'
      page.appendChild(gitalk)
      var _gitalk = new Gitalk({
        clientID: '11111111111111',
        clientSecret: '2222222222222222',
        repo: 'slbyml.github.io', // 存储评论的仓库名字
        owner: 'slbyml',
        admin: ['slbyml'],  //仓库的管理员,可以有多个
        id: decodeURI(path),      // 每个页面根据url生成对应的issue,保证页面之间的评论都是独立的
      })
      _gitalk.render('gitalk-container')
    }
  }
}
export default ({
  Vue, // VuePress 正在使用的 Vue 构造函数
  options, // 附加到根实例的一些选项
  router, // 当前应用的路由实例
  siteData // 站点元数据
}) => {
  setTimeout(() => {
      // 打包的时候因为没有document,所以要加个try
    try {
      document && getGitalk.call(this, siteData)
    } catch (e) {
      console.error(e.message)
    }
  },500)
}

复制代码

对于 gitalk 的用法请看官网,但是要讲两个元素 clientSecretclientSecret ,这两个怎么来的呢,是 在这申请的 ,创建完成后可以看到生成的这两个字段

用vuepress搭建一个够自己用的博客

::: tip 注意: 如果想在框架中引入第三方框架,比如element-ui,也可以在这个js中引入注册 :::

部署

部署就简单了,我目前是两个仓库,一个私有的,用来存放源代码,一个就是用来存放生成的静态文件的 仓库 更改 package.json->script :

"scripts": {
    "docs:dev": "vuepress dev docs",
    "docs:build": "vuepress build docs",
    "deploy": "bash deploy.sh"  // 新加的,用来生成静态文件及上传到github
  }
复制代码

然后根目录下新建 deploy.sh 文件:

#!/usr/bin/env sh

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

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

# 进入生成的文件夹
cd dist

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

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

cd -
复制代码

我的默认生成的静态文件在根目录下的 dist ,因为我更改了 config.js 里的配置,保证docs里面的文件是干净的

dest: 'dist'
复制代码

这样在我执行 npm run deploy 的时候就会自动生成静态文件,并上传的github上,是不是很方便 最后,这些都是我自己做的事情,可能会有更好的实现,所以欢迎讨论!!:clap: 以后想添加的东西:

  • 添加下拉加在更多功能
  • 添加文章阅读量和文章字数
  • 丰富列表页
  • 丰富首页

最后的最后这篇文字也是突发奇想写的,刚开始不知道写啥,所以就边写变想该写啥( 负面教学,别学我 ),没想到写着写着,文思泉涌:clap: ,一片文采华丽的文章就这么诞生了,从没发现自己还有写文章的天赋。转载原文


以上所述就是小编给大家介绍的《用vuepress搭建一个够自己用的博客》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Host Your Web Site In The Cloud

Host Your Web Site In The Cloud

Jeff Barr / SitePoint / 2010-9-28 / USD 39.95

Host Your Web Site On The Cloud is the OFFICIAL step-by-step guide to this revolutionary approach to hosting and managing your websites and applications, authored by Amazon's very own Jeffrey Barr. "H......一起来看看 《Host Your Web Site In The Cloud》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换