原文博客css
好久之前,本身拥有一个用hexo搭建的静态博客网站:ox:,记得当时为了把它搞出来,废了很多劲:anger:,而后后来又断断续续更改过一些配置和样式,可是由于感受各类麻烦,因此就放在github
上积累和不少的尘土:cupid:,到如今也懒得在打扫了(实际上是很久不用,有点忘了怎么用了:-1::poop:),前段时间在百度统计上看了看那个静态网站的访问人数,发现已经好久好久没人访问过了,:sweat_smile:,然而就在前段时间(没错,就是前面那个时间),我灵光一闪,为啥不从新弄个静态博客呢:heart_eyes:,因而我就决定洗洗睡觉(没错,那是一个夜深人静的晚上),次日抽空找个简单点的框架,而后搭个静态博客,用来记录本身的所见所闻所想:tada: 次日一大早吃完中午餐后(睡到中午了:sunglasses:),我就看起了VuePress官网,没错,我选择了VuePress框架,至于为何呢,有如下几点:html
一、 目前开发用vue框架:fire:
二、 就是想用它搞一个:muscle:
三、 反正也简单,实在不行再换呗(搞不起来是不可能的):clap:
四、 没有别的理由了:notes:前端
它有什么好处、特性、和别的框架对比?看人家官网就得了,说的挺好的vue
没啥好说的,按照人家官网搭就完事了,人家写的那么清晰、明了。感受尤大出品的文档都很友好,阅读起来很方便react
# 将 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启动项git
"scripts": {
"docs:dev": "vuepress dev docs",
"docs:build": "vuepress build docs"
}
复制代码
上面一顿操做后咱们如今要知道三件事情:github
一、咱们之后全部的文章都将在docs
中写npm
二、开发,也就是写做的时候执行:element-ui
yarn docs:dev # 或者:npm run docs:dev // 默认端口http://localhost:8080/
复制代码
三、打包生成静态html文件,执行json
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 及其子项目的文档需求。 ---
复制代码
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
也就是网页左上角那个小图标
.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
}
复制代码
咱们对掘金进行大段文字复制的时候会显示版权信息:
用vuepress搭建一个够本身用的博客
做者:给我讲个笑话
连接:juejin.im/post/5ce945…
来源:掘金
著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。
那么咱们如何在博客中实现这个功能呢 ,其实很简单, 首先修改咱们的.vuepress/enhanceApp.js
文件(enhanceApp.js介绍)
import copy from './common/copy'
export default ({
Vue, // VuePress 正在使用的 Vue 构造函数
options, // 附加到根实例的一些选项
router, // 当前应用的路由实例
siteData // 站点元数据
}) => {
setTimeout(() => {
try {
document && (() => { //对document的判断是防止编译的时候报错
copy()
})()
} catch (e) {
console.error(e.message)
}
},500)
}
复制代码
而后新建一个copy.js
的文件
export default () => {
function addCopy(e) {
let copyTxt = ""
e.preventDefault(); // 取消默认的复制事件
copyTxt = window.getSelection(0).toString()
copyTxt = `${copyTxt}\n做者:静水深流\n原文:${window.location.href}\n著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。`
const clipboardData = e.clipboardData || window.clipboardData
clipboardData.setData('text', copyTxt);
}
document.addEventListener("cut", e => {
addCopy(e)
});
document.addEventListener("copy", e => {
addCopy(e)
});
}
复制代码
这样就能够实现了,有兴趣能够去博客体验一下
做为一个有灵魂的博客,怎么能够不能评论呢,我能忍,博客也不能忍:star2:,个人评论系统用的是GITALK,官网说是这是一个基于 Github Issue 和 Preact 开发的评论插件,如今用的多的貌似还有valine、gitment,这个貌似能够统计阅读量;但愿gitalk也能出个阅读量统计功能,官网提供的方式有两种,一种是在html中引入js文件,另外一种是用npm包的形式,我选择的是经过js将评论须要的js和css用js动态插入到页面中,首先修改.vuepress/enhanceApp.js
中的代码:
import getGitalk from "./common/getGitalk"
import copy from './common/copy'
export default ({
Vue, // VuePress 正在使用的 Vue 构造函数
options, // 附加到根实例的一些选项
router, // 当前应用的路由实例
siteData // 站点元数据
}) => {
setTimeout(() => {
try {
document && (() => {
getGitalk.call(this, siteData)
copy()
})()
} catch (e) {
console.error(e.message)
}
},500)
}
复制代码
getGitalk.js
的实现以下
export default ({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')
}
}
}
复制代码
对于gitalk
的用法请看官网,可是要讲两个元素clientSecret
和clientSecret
,这两个怎么来的呢,是在这申请的,建立完成后能够看到生成的这两个字段
部署就简单了,我目前是两个仓库,一个私有的,用来存放源代码,一个就是用来存放生成的静态文件的仓库 更改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: ,一片文采华丽的文章就这么诞生了,从没发现本身还有写文章的天赋。 转载原文