html 用div代替frameset_HTML的模板引擎:pug模板语法

58ec618aac11c43ffac2ee7f752107c8.png

本文同步发表在我的个人博客中:

沧沧凉凉​www.cclliang.com

之前学习WePY的时候看到官方给出的demo:

a0430b9533b28dc77ae0e7087f2e8786.png

就觉得这个HTML模板引擎有点酷,虽然我不太喜欢这种使用缩进来代替闭合标签或者{}的方式,但还是觉得可以尝试着了解一下pug的语法。

解决的痛点

  1. HTML标签必须进行闭合,如果不闭合的话容易报错。
  2. HTML没有模板机制,如果不使用前端框架维护起来非常困难。

使用

入门指南 - Pug​pugjs.org

在Vue中应用

npm i -D pug pug-plain-loader

入门

<!--pug-->
<template lang="pug">
    div.box
        div.box1
            div.box2
</template>

<!--解析成HTML后-->
<template>
    <div class="box">
        <div class="box1">
            <div class="box2"></div>
        </div>
    </div>
</template>

从上面的例子可以看出,子组件会比父组件多出缩进,而类的声明不光可以直接通过.xxx的选择器方式声明,也可以向下面一样进行声明。

<template lang="pug">
    div(class="box")
        div(class="box1")
            div(class="box2")
</template>

语法

pugHTML最大的不同在于它拥有自己的语法,拥有循环、条件控制、定义变量等功能。可以说如果在没有前端框架的年代,这些功能是多么的有诱惑力,但是,近几年React、Vue的出现,已经解决了这些痛点。

条件判断

<template lang="pug">
    - let friends = 10 //加上-后不会进行输出
    case friends
        when 0
            p 您没有朋友
        when 1
            p 您有一个朋友
        default
            p 您有 #{friends} 个朋友
</template>

<template lang="pug">
    - let user = { description: 'foo bar baz' }
    - let authorised = false
    #user
        if user.description
            h2.green 描述
            p.description= user.description
        else if authorised
            h2.blue 描述
            p.description.
                用户没有添加描述。
                不写点什么吗……
        else
            h2.red 描述
            p.description 用户没有描述
</template>
<!--解析后-->
<div id="user">
  <h2 class="green">描述</h2>
  <p class="description">foo bar baz</p>
</div>

上面的例子跟JavaScriptswitchif判断很相似。

循环

<template lang="pug">
    div
      - for (let x = 0; x < 3; x++)
        li item
</template>
<!--解析后-->
<div>
    <li>item</li>
    <li>item</li>
    <li>item</li>
</div>

<template lang="pug">
    div
        - let list = ["Uno", "Dos", "Tres","Cuatro", "Cinco", "Seis"]
        each item in list
            li= item
</template>
<!--解析后-->
<template>
    <div>
        <li>Uno</li>
        <li>Dos</li>
        <li>Tres</li>
        <li>Cuatro</li>
        <li>Cinco</li>
        <li>Seis</li>
    </div>
</template>

可以看到,在pug里面可以使用for循环进行遍历,同时我还发现webstorm的代码格式化在格式化pug代码的时,不能正确的进行缩进,如果对上面的代码进行格式化,代码将无法正常进行解析。

包含/模块化

可以通过include xxx.pug将外部的文件插入进来,当然由于Vue自身已经包含了模块化功能,所以这项功能在Vue中几乎没有用处。

继承与扩展

这一块内容十分类似于Vue中的插槽。即可以使用Vue中的插槽来进行代替,如果真的有兴趣的话,可以直接观看官方文档。

模板继承 Inheritance​pugjs.org

嵌入

- var title = "On Dogs: Man's Best Friend";
- var author = "enlore";
- var theGreat = "<span>转义!</span>";

h1= title
p #{author} 笔下源于真情的创作。
p 这是安全的:#{theGreat}

<!--解析后-->
<h1>On Dogs: Man's Best Friend</h1>
<p>enlore 笔下源于真情的创作。</p>
<p>这是安全的:&lt;span&gt;转义!&lt;/span&gt;</p>
  • pug中使用了#{}的方式。
  • Vue中使用了{{}}双括号的方式。
  • React中使用了{}单括号的方式。

迭代

ul
  each val in [1, 2, 3, 4, 5]
    li= val
<!--解析后-->
<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
  <li>5</li>
</ul>

混入Mixin

允许您在 Pug 中重复使用一整个代码块的方法,跟JavaScript的函数相类似,并且可以传递一些参数。

mixin pet(name)
  li.pet= name
ul
  +pet('猫')
  +pet('狗')
  +pet('猪')
<!--解析后-->
<ul>
  <li class="pet">猫</li>
  <li class="pet">狗</li>
  <li class="pet">猪</li>
</ul>

结论

d545ee4b01958556a3c355dc51cd8dc0.png
有提示,而在pug中则没有提示

就我个人而言,我是非常不喜欢这种没有闭合标签的语句,可能是因为我学的第一门编程语言是C#的关系,所以我还是比较喜欢拥有{}的编程语言。

在webstorm中,对pug语法的代码提示做的远远不如HTML,并且pug的大部分功能在现在的Vue,React框架中也有对应的实现方法,总之我感觉了解一下pug就可以了,如果遇到真的有工程使用,到时候再进行针对性学习也不迟。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值