Vue.js + Node.js打造个人博客(新手向)

原文地址:lewis1990@amoy

前言

做为一名立志全栈的页面仔,一直想着要独立开发一个项目,从前台到后台到数据库,从设计到开发到上线。一般说到这样的练手项目,通常得到的意见都是写个博客系统呗!刚好对之前用hexo部署在GitHub Page上的博客的傻瓜式及龟速实在忍无可忍,于是乎,就写个博客系统呗!先放上链接。

方案

  • UI风格:主要参考Randy's Blog的风格,并加入自己的一点想法(主要是为了偷懒)。
  • 前端页面:基于Vue2.0的响应式SPA,啊?你问我为什么?就如《关于》中的自我介绍:我自认为擅长Vue的SPA开发。
  • 后台:前端工程师通向全栈的捷径:Node.js。负责写接口及渲染静态页面。
  • 数据库:原计划是用MongoDB,但为了赶进度,索性数据库都不用了,第一版就先这样吧。
  • 文章:参考hexo用markdown语法写好文章再转成html的做法。也是在本地编辑好md格式的文章,上传到服务器,Node.js直接读取md文件并转化为html,返回给前台,这也是为什么暂时不需要数据库的原因。
  • 部署:AWS,一年时间免费使用哦!你问我一年后怎么办?God knows!也许一年时间已经让我经历了从入门到放弃。

扬帆!起航!

  1. 页面布局:自己看Cloud's Blog,简单介绍下。第一屏为一张壁纸宽高均为100%铺满整个可视区域,内容有博客名称、小标题及三个关于博主的链接;点击向下箭头滚动进入第二屏正题,分为四个Tab模块:【首页】、【文章】、【作品】、【关于】。默认为【首页】,即最新一篇文章详情,【文章】为文章列表,点击可阅读文章内容,【作品】为作品列表,这部分还没完成,【关于】为关于博主的一些介绍。PS:首屏的壁纸在Google图片里找了一上午才找到这张还算满意的,考虑到手机端壁纸是居中铺满整个可视区域,要找到一张PC端手机端效果都还行且逼格不能太低的图片真的不容易,BTW,博主还是选择困难症患者。

  2. 前端开发:从Vue脚手架开始

# 全局安装 vue-cli
$ npm install --global vue-cli
# 创建一个基于 webpack 模板的新项目
$ vue init webpack blog
# 安装依赖,走你
$ cd blog
$ npm install
$ npm run dev

然后安装Vue-router用于SPA路由及vue-resource或axios用于Ajax。

$ npm install --save vue-router
$ npm install --save axios
# vue官方推荐的ajax库不再是vue-resource,而是axios

然后就可以开始码静态页面了,根据第一步页面布局的思路写出静态页面应该不是什么难事,其中需要调用第三步中node.js提供的接口,这里就不再多说了。完成静态页面后编译

$ npm run build
  1. 后端开发:创建服务端目录结构并安装express框架及marked用于将md文件转为html
$ mkdir blog-server && cd blog-server
$ mkdir public
$ npm install --save express
$ npm install --save marked

写接口,目前主要有三个接口。

  1. 获取文章列表接口。fs.readdir方法读取md文件所在文件夹,返回所有md文件的文件名即文章标题、创建时间、文章路径,并按创建时间排序渲染在【文章】页。
  2. 文章内容接口。根据第一个接口返回的文件名及路径,用fs.readFile方法读取md文件的内容并用marked转为html并返回给客户端,渲染在文章内容页。
  3. 首页内容接口。类似接口2,读取最新一篇文章并返回。记得处理跨域问题。
app.all('*', function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "X-Requested-With");
    res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
    res.header("X-Powered-By",' 3.2.1')
    res.header("Content-Type", "application/json;charset=utf-8");
    next();
});

渲染静态页面,将第二部编译出来的静态文件及md格式的文章文件拷入public文件夹,并用express内置的中间件指定public文件夹为静态资源文件的根目录并缓存。因为是单页应用,所以记得要处理好404错误。

# server.js
var express = require('express');
var app = express();
app.use(express.static('public',{maxAge:60*60*24*30}));
app.get('/',function(req,res){
  res.sendFile('/index.html',{root: __dirname + '/public/'});
});
app.listen(80);
  1. 部署
  • 申请AWS(亚马逊云主机),一年免费试用,需填信用卡信息。实例一台EC2,win或Linux系统,推荐Linux。开放相应端口并安装node.js。
  • 安装PM2,并运行第三步的server.js服务,并让PM2随系统启动。
$ npm install -g PM2
$ pm2 start server.js
$ pm2 startup

此时我们的博客系统已经运行在EC2上了。

  • 购买域名。我是在腾讯云上购买的xyz域名,第一年8块钱。解析到该EC2的公网IP上,即可通过域名访问。比如通过 http://www.lee-cloud.xyz 可访问我的博客。

未来计划

  1. 完成【作品】Tab页,现在虽然勉强上线了,但缺了这一块逼死强迫症啊。
  2. 后台管理,功能模块暂定为
  • 文章上传
  • 作品上传
  • 【关于我】内容编辑
  • 首页定制
  1. 启用MongoDB数据库
  2. 界面美化、性能优化
  3. 评论功能
  4. seo

写在最后

仅此记录Cloud's Blog初版上线过程


2017.08.29
好久没更新,这个博客是去年年底刚接触vue.js时拿来练手的,很粗糙,最近心血来潮准备更新2.0,有同学在问的源码在这里github地址,有兴趣的话帮忙点个star,谢谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,886评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,132评论 25 708
  • 「温暖」 小视频·我不愿让你一个人 「逗趣」 小视频·滑板是我的 「杂烩」 小视频·化妆·盖章画眉毛 「FR Ap...
    予缃阅读 144评论 0 0
  • 我困的眼睛都要睁不开了,我姐妹还在跟我说怎么填词造句,怎么看书怎么写文。我真觉得我命好,天天有人买好书给我看,还把...
    天然之乐阅读 301评论 0 1
  • OC中对象的本质: 执行OC代码Person *p = [[Person alloc] init];内部过程:Pe...
    Steven_Wu阅读 317评论 0 0