很久之前就想自己搭一个博客了,最开始用hexo+github,但是换电脑后总是有些麻烦。后来使用WordPress,但是用WordPress总觉得没什么技术含量,前后端都是人家写好的,而且买的垃圾虚拟机老是出问题,动不动就要提交工单解决,所以最后干脆就直接在博客园上写了。

最近比较闲,所以正好抽时间简单看了下node.js,然后看了看express,顺便搭了个博客出来练手。当然也不仅是单纯的练手,更多的算是一种探路或者摸索吧,因为公司虽然有大牛,但更多的是忙于应付业务,基本上是没时间去学学新的东西来尝试解决我们在开发中遇到的各种问题,这其中就包括比如重复书写大量相同代码,后期维护困难等。

在此之前,我也没有真正写过后台项目,虽然在学校用PHP+MySQL写过几个简单的页面,但是毕业快一年了,以前的东西都太久没用,基本都快忘记了。所以现在使用node.js+mongoDB也算是从零开始吧,在写的过程中,有简单的去对项目结构等作出一些优化调整,但越往后,理解也就越深,所以更多的干脆就留着下一版来更改吧。

这一个版本算是初级版本吧,基本功能是全的。不过经过这三个多星期的实际操作和阅读一些别人的博客,从代码结构和工程结构方面,都有更深的理解,所以还有很多能够优化的地方。不过并不打算等到都做好了再写,而是先把这段时间遇到的坑记录下来,要不时间越久,忘的也就越多,早点记录,多少还能留下点什么,也能帮助其他新手朋友更容易入门。

这一个版本所用到的库,包括node框架express4.4X、数据库mongoDB、模板引擎pug(原jade)。

废话不多说,进入正题。

我在项目中使用的pug.js是最新2.0版本的。

1.基础文档

在pug中没有结束标签,需要严格使用缩进来表示父子元素之间的关系。

编译前:

doctype html
html
head
title pug基础 body
p.text 必须严格使用缩进,来表明父子和兄弟元素间的关系

编译后:

<!DOCTYPE html>
<html>
<head>
<title>pug基础 </title>
</head> <body>
<p class="text">必须严格使用缩进,来表明父子和兄弟元素间的关系</p>
</body>
</html>

2.内容渲染(插值)

各个模板引擎渲染方法都差不多,这里主要是给大家展示在pug模板里插值的写法。

方法一:

插入固定字符串,直接在标签后面敲空格输入字符串就行

插入变量时,输出字符使用#{};输出html代码使用!{}

在使用大括号插值时,还支持JavaScript表达式

编译前:

- var string = "string";
- var html = "<span>htmlString</span>"; p 直接写插入字符串,只需在标签后面敲一个空格
p 需要渲染为字符串的变量#{string}
p 大括号插值也支持JavaScript表达式#{string.toUpperCase()}
p 需要渲染为html代码的变量!{html}

编译后:

<p>直接写插入字符串,只需在标签后面敲一个空格</p>
<p>需要渲染为字符串的变量string</p>
<p>需要渲染为字符串的变量STRING</p>
<p>需要渲染为html代码的变量<span>htmlString</span></p>

方法二:

1.使用=插入text

2.使用!=插入html

3.同样也支持JavaScript表达式

编译前:

- var string = "string";
- var html = "<span>htmlString</span>"
p 直接写插入字符串,只需在标签后面敲一个空格
p= '需要渲染为字符串的变量'+string.toUpperCase()
p!= '需要渲染为html代码的变量'+html

编译后:

<p>直接写插入字符串,只需在标签后面敲一个空格</p>
<p>需要渲染为字符串的变量STRING</p>
<p>需要渲染为html代码的变量<span>htmlString</span></p>

3.属性

pug模板中给元素添加属性

简单添加

编译前:

a(class='link' href='www.baidu.com') 百度

编译后:

<a class="link" href="www.baidu.com">百度</a>

三元表达式

编译前:

- var active= true
a(class=active? 'link-active' : '' href="www.baidu.com") 百度

编译后:

<a class="link-active" href="www.baidu.com">百度</a>

class条件

编译前:

- var currentUrl = '/about'
a(class={active: currentUrl === '/'} href='/') Home
a(class={active: currentUrl === '/about'} href='/about') About

编译后:

<a href="/">Home</a>
<a class="active" href="/about">About</a>

属性插值

编译前:

- var btnType = 'info'
- var btnSize = 'lg'
button(type='button' class='btn btn-' + btnType + ' btn-' + btnSize) //- 支持ES6的环境中
button(type='button' class=`btn btn-${btnType} btn-${btnSize}`)

编译后:

<button class="btn btn-info btn-lg" type="button"></button>
<button class="btn btn-info btn-lg" type="button"></button>

4.语句

语句包括编程语言中的for、if、switch这些,只是在pug中,稍微有些不同。

case

case语句和JavaScript中的switch语句类似。

编译前:

- var friends = 10
case friends
when 0
p you have no friends
when 1
p you have a friend
default
p you have #{friends} friends

编译后:

<p>you have 10 friends</p>

if

编译前:

- var user = { name: 'tom' }
- var age = false
#user
if user.description
h2.green 如果user.name为true
p.description= user.name
else if age
h2.blue 如果age为true
p.description= age else
h2.red Description
p.description User has no description

编译后:

 <h2 class="green">如果user.name为true</h2>
<p class="description">foo bar baz</p>

each

编译前:

- var arr = ['zero', 'one', 'two'];
- var obj = {name:'tom',age:21,country:'china'}; ul.array
each val, index in arr
li= index + ': ' + val ul.object
each val, key in obj
li= key + ': ' + val

编译后:

<ul class="array">
<li>0: zero</li>
<li>1: one</li>
<li>2: two</li>
</ul> <ul class="object">
<li>name: tom</li>
<li>age: 21</li>
<li>country: china</li>
</ul>

5.include

通过include,你可以在一个pug模板里,引入另外一个pug组件。

编译前:

//- index.pug
doctype html
html
title include用法 body
include components/head.pug p 在index.pug文件中引入了head.pug和footer.pug两个组件 include components/footer.pug
//- components/head.pug
h1 这是head.pug组件
//- components/footer.pug
footer 这是footer.pug组件

编译后:

<!DOCTYPE html>
<html> <head>
<title>include用法</title>
</head> <body>
<h1>这是head.pug组件</h1> <p>在index.pug文件中引入了head.pug和footer.pug两个组件</p> <footer>这是footer.pug组件</footer>
</body>
</html>

6.模板继承

include可以帮我们少写很多重复代码,同时更容易去维护每个组件。而继承则能够使模板更加灵活,进一步减少我们的工作量。

在pug里,我们可以使用extends来继承模板,使用block来定义可能会变化或者可扩展的内容。

编译前:

//- layout.pug
doctype html
html
head
title Template Inheritance用法
  
//- 这里是可以扩展的link区域
block links
link(rel="stylesheet" href='/main.css') script(src="/jquery.js") body
head 所有页面的公共头部   //- 这里是可以扩展的内容区域
block content

//- 这里是可以扩展的script区域
block scripts
script(src="/bootstrap.js")
//- index.pug
extends layout.pug block links
link(rel="stylesheet" href='/bootstrap.css')
link(rel="stylesheet" href="/index.css") block content
h1 模板继承的用法
p 使用extends来继承模板
p 使用block来自定义模板里的内容 block append scripts
script(src="index.js")

编译后:

<doctype html>
<html>
<head>
<title>Template Inheritance用法</title>
<link rel="stylesheet" href="bootstrap.css">
<link rel="stylesheet" href="index.css">
</head> <body>
<header> 所有页面的公共头部</header> <h1>模板继承的用法</h1>
<p>使用extends来继承模板</p>
<p>使用block来自定义模板里的内容</p> <script src="/index.js"></script>
<script src="/bootstrap.js"></script>
</body>
</html>

7.内联script

我们有时也会在html页面内嵌一些JavaScript代码,在pug中也很简单

编译前:

doctype html
html
head
title 内联script
body
h1 需要在此页面中内联一些脚本 script.
console.log('只需要在script后面加上一个.符号')

编译后:

<doctype html>
<html>
<head>
<title>内联script</title>
</head> <body>
<h1>需要在此页面中内联一些脚本</h1> <script>
console.log('只需要在script后面加上一个.符号')
</script>
</body>
</html>

结语:

以上基本涵盖了pug的95%内容,还剩下一点少用的没有一一赘述,比如过滤器(filters)和注释(comments)等,markdown过滤器是个好东西,不过我觉得一般就个人项目,比如博客这样的会用上。

这些东西也足够你在项目中使用了,对于剩下的那5%,大家可以自己去看看官网,了解一下,都挺简单pug.js

另外在我使用的时候,发现pug的写法除了缩进以外,也可以按照标准的html书写格式来创建模板,插值什么的,通过#{}方式同样好使。

不过在官网上没看见可以使用这种方式创建模板的说明,这是第一次使用pug(jade),所以不知道会不会是兼容以前的版本,有知道的朋友麻烦告诉我一声,谢谢哈!

基于express+mongodb+pug的博客系统——pug篇的更多相关文章

  1. NodeJS+Express+MongoDB 简单个人博客系统【Study笔记】

    Blog 个人博客系统 iBlog是在学习NodeJs时候一个练手项目Demo 系统支持用户注册/登录,内容文章查看,评论,后台管理(定制显示的分类版块,进行文章内容添加)超级管理员还可进行用户管理等 ...

  2. 基于express+mongodb+pug的博客系统——后台篇

    上一篇介绍了模板引擎pug.js的用法,这一篇就主要写后台逻辑了. 后台的大部分的功能都有了,只是在已经登录的状态下,前台和后台的逻辑处理还不是很完善. 先上几张图吧,仿旧版的简书,改了下UI,因为没 ...

  3. 基于React服务器端渲染的博客系统

    系统目录及源码由此进入 目录 1. 开发前准备 1.1 技术选型1.2 整体设计1.3 构建开发 2. 技术点 2.1 react2.2 redux, react-router2.3 server-r ...

  4. 分享个基于 Node.js + React 的博客系统

    是使用 ES2015+ 特性写的,使用了 ThinkJS 框架,后台使用了 React. 完全使用 Markdown 来写文章,还可以把文章推送到团队博客系统中(团队博客也需要使用该系统). 项目地址 ...

  5. 基于Koa2+mongoDB的后端博客框架

    主要框架:koa2全家桶+mongoose+pm2. 在阅读前建议将项目克隆到本地配合食用,否则将看得云里雾里. 项目地址:https://github.com/YogurtQ/koa-server. ...

  6. 基于开源博客系统(jpress)搭建网站

    基于开源博客系统(jpress)搭建网站 JPress 使用 Java8 开发,基于流行的JFinal和Jboot框架. 目前JPress已经内置的文章和页面其实是两个模块,可以移除和新增其他模块,因 ...

  7. Asp.net博客系统收集和简单介绍

    国内Asp.net博客系统收集和简单介绍       [转载文章,仅供个人参考,引自http://www.soyaoo.com/Blog/post/92.html] 1.ZJ-Blog程序简介:基于A ...

  8. 基于react全家桶+antd-design+webpack2+node+express+mongodb开发的前后台博客系统

    很久没更新博客,最近也有点忙,然后业余时间搞了一个比较完整基于react全家桶+antd-design+webpack2+node+express+mongodb开发的前后台博客系统的流程系统,希望对 ...

  9. 项目实战(连载):基于Angular2+Mongodb+Node技术实现的多用户博客系统教程(2)

    本章主要讲什么(一句话)?   <项目实战:基于Angular2+Mongodb+Node技术实现的多用户博客系统教程(2)> -- 基于MongoDB的MyBlog数据库知识技术储备(上 ...

随机推荐

  1. Windows上安装Kafka需要注意的几点

    1.不能安装在有空格的路径上 比如:D:\Program Files 2.设置日志路径时,要用"/",不能用Windows上的"\",比如: # A comma ...

  2. Android解析xml文件-采用DOM,PULL,SAX三种方法解析

    解析如下xml文件 <?xml version="1.0" encoding="UTF-8"?> <persons> <perso ...

  3. Oracle ASM数据库故障数据恢复过程

    一.故障描述 ASM磁盘组掉线 ,ASM实例不能mount.ASM磁盘组有4个500G的磁盘组成,数据库和ASM软件为10.2.0.1,急需恢复oracle数据库.二.故障分析   分析组成ASM磁盘 ...

  4. android开发之-软件设置保存-快速学会使用SharedPreferences篇-实测

    我们在设计软件的时候,需要记录软件设置的基本信息,那么怎么来保存他们呢?我们可以使用SharedPreferences.   SharedPreferences是一个xml文件,用来存储软件的常规设置 ...

  5. Myeclipse8.5开发-插件安装二:安装findbugs方法

    环境:Myeclipse8.5 step 1:首先从官网下载findbugs插件:http://downloads.sourceforge.net/project/findbugs/findbugs% ...

  6. java基础之类与对象1

    从学习java到现在估计都有一年了,然而在这一年里基本处于三天打鱼五天晒网,感觉自己再不做点改变就是个废人了..T - T. 趁着重新复习java的时间,也顺便用博客来记录学习的过程.好了,废话不说了 ...

  7. Cesium之球心坐标与本地坐标

    1球心坐标(ECEF)与本地坐标(NEU) 假如你来到一个陌生城市,你很可能需要问路.通常会告诉你向北走100米,右转,向东走100米,理解起来很直观.你给儿子买了一个地球仪,你从北京(39,115) ...

  8. 如何使用第三方webservice

    webservice地址后加wdls 生成后把文件名改为wdsl 调用方式: 1.添加webservice引用: 2.生成代理类的方法(本人比较喜欢用这种方式): 使用cmd命令行: a.通过webs ...

  9. 使用 ItextSharp HTML生成Pdf(C#)

    以前生成pdf的时候.因为生成的pdf数据是固定的,所以先做好pdf模板,动态的数据可以先用占位符 生成的时候.找到占位符坐标.把数据填充进去 优点:先做好模板.生成的pdf 表格.文.内容会好看一些 ...

  10. sphinx全文检索引擎

    今天刚刚学习了一下,就直接分享上去,有些还没有接触,如果有问题请指正,谢谢 sphinx是什么? Sphinx是一个全文检索引擎.主要为其他应用提供高速.低空间占用.高结果 相关度的全文搜索功能. S ...