Liquid.js tutorial

Liquid.js 教程展示了如何在 JavaScript 应用程序中使用 Liquid 模板引擎。

液体

Liquid 是一个 JavaScript 模板引擎。它是由 Shopify.Liquid 文件创建的,扩展名为.liquid;它们混合了静态数据,例如 HTML 和 Liquid 结构。

Liquid 使用双大括号分隔符{{ }} 用于输出,使用大括号百分比分隔符{% %} 用于逻辑。

{% if user != null %}
  Hello {{ user.name }}
{% endif %}

此代码是示例 Liquid 语法。

模板引擎

模板引擎或模板处理器是一个库,旨在将模板与数据模型结合起来以生成文档。模板引擎通常用于生成大量电子邮件、源代码预处理或生成动态 HTML 页面。

我们创建了一个模板引擎,我们在其中定义了静态部分和动态部分。动态部分稍后将替换为数据。渲染功能随后将模板与数据结合起来。

设置 Liquid.js

首先,我们安装 Liquid.js。

$ npm init -y

我们启动一个新的 Node 应用程序。

$ npm i liquidjs

我们用liquidjs安装nmp i liquidjs模块。

从字符串渲染液体

我们从一个从字符串呈现的非常简单的示例开始。

const Liquid = require('liquidjs');
const engine = new Liquid();

engine
    .parseAndRender('{{name | capitalize}}', {name: 'lucy'})
    .then(console.log);

该示例显示了字符串模板的输出。它还使用过滤器。

const Liquid = require('liquidjs');
const engine = new Liquid();

我们加载Liquid.js模块并启动引擎。

engine
  .parseAndRender('{{name | capitalize}}', {name: 'lucy'})
  .then(console.log);

parseAndRender 函数采用模板字符串和上下文数据。在模板字符串中,我们有一个 name 变量,它被传递给 capitalize 过滤器。过滤器在输出前修改数据。

$ node simple.js
Lucy

液体排序过滤器

sort 是可用的数组过滤器之一。

const Liquid = require('liquidjs');
const engine = new Liquid();

nums = [5, 3, 2, 4, 1]
ctx = { data: nums}

engine
    .parseAndRender('Sorted data: {{ data | sort }}', ctx)
    .then(console.log);

该示例对传递给模板字符串的数据进行排序。

$ node sort_filter.js
Sorted data: [1,2,3,4,5]

文件中的液体渲染

要呈现文件的输出,我们使用renderFile 函数。

$ mkdir views

我们创建了一个存放模板文件的目录。

const Liquid = require('liquidjs');
const path = require('path');

const engine = new Liquid({
    root: path.resolve(__dirname, 'views/'),
    extname: '.liquid'
});

engine
    .renderFile('hello', { name: 'Peter' })
    .then(console.log)

该示例从文本文件生成输出。

const engine = new Liquid({
    root: path.resolve(__dirname, 'views/'),
    extname: '.liquid'
});

Liquid 构造函数中,我们提供了模板目录位置和扩展名称。扩展名通常是.liquid

engine
  .renderFile('hello', { name: 'Peter' })
  .then(console.log)

renderFile 的第一个参数是模板名称。第二个参数是上下文数据。

Hello {{ name }}!

在模板文件中,我们使用{{}}输出上下文变量。

$ node from_file.js
Hello Peter!

标签液体

Liquid for 是一个重复执行代码块的迭代标签。

const Liquid = require('liquidjs');
const path = require('path');

const engine = new Liquid({
    root: path.resolve(__dirname, 'views/'),
    extname: '.liquid'
});

ctx = { users: [{ name: "Peter", age: 24 }, { name: "Lucy", age: 34 }] };

engine
    .renderFile("users", ctx)
    .then(console.log);

在示例中,我们定义了一个用户数组。该数组在模板中使用for 循环。

There are {{ users | size }} users

{% for user in users -%}
{{ user.name }} is {{ user.age }} years old
{% endfor -%}

模板文件输出使用sizefilter 的用户数量和来自上下文变量的所有用户。

{% for user in users -%}
{{ user.name }} is {{ user.age }} years old
{% endfor -%}

我们遍历用户数组并打印属性。空格输出可以用破折号控制。

$ node users.js
There are 2 users

Peter is 24 years old
Lucy is 34 years old

液体部分

部分是包含在其他模板中的可重用模板。部分用于重复的内容,例如页脚或页眉。

使用include 指令插入部分。

const Liquid = require('liquidjs');
const path = require('path');

const engine = new Liquid({
    root: path.resolve(__dirname, 'views/'),
    extname: '.liquid'
});

ctx = { name: 'Peter' };

engine
    .renderFile("home", ctx)
    .then(console.log);

此示例显示了home.liquid 模板的输出,其中包括一个 Liquid 部分。

{{ "now" | date: "%Y-%m-%d %H:%M" }}, ZetCode 2007 - 2022

这是页脚的一部分。在 date 过滤器的帮助下,它显示当前日期和时间。

Hello {{ name }}!

{% include 'footer' %}

footer 部分包含在include 指令中。

$ node partials.js
Hello Peter!

2019-02-13 22:52, ZetCode 2007 - 2022

流动性继承

Liquid 支持模板继承。模板继承是一项强大的功能,可减少代码重复并改进代码组织。我们定义了一个基本模板,我们在其他模板文件中继承了它。这些模板文件覆盖基本模板文件的特定块。

const Liquid = require('liquidjs');
const path = require('path');

const engine = new Liquid({
    root: path.resolve(__dirname, 'views/'),
    extname: '.liquid'
});

engine
    .renderFile("derived", { content: 'Some content' })
    .then(console.log)

该示例使用继承技术从 derived.liquid 模板生成输出。

Header
{% block content %}My default content{% endblock %}
Footer

这是其他模板继承的base.liquid 文件。block/endblock 指令用于声明在子模板中替换的内容块。

{% layout "base" %}
{% block content %} {{ content }} {% endblock %}

这是子模板。使用layout 指令,我们继承自base.liquid 模板。我们使用block/endblock 指令定义内容。

$ node inheritance.js
Header
 Some content
Footer

液体快递示例

在下面的示例中,我们在 Express 应用程序中使用 Liquid。

$ npm i express

我们安装了 Express 网络框架。

const express = require("express");
const path = require("path");
const Liquid = require('liquidjs');
const engine = new Liquid();

const app = express();

app.engine('liquid', engine.express());
app.set('views', path.resolve(__dirname, "views"));
app.set('view engine', 'liquid');

app.get("/today", (req, res) => {

    let today = new Date();
    res.render("show_date", {now: today});
});

app.use((req, res) => {
    res.statusCode = 404;
    res.end("404 - page not found");
});

app.listen(3000, () => {

    console.log("Application started on port 3000");
})

该示例是一个使用 Express 创建的简单 Web 应用程序。它显示当前日期。

app.engine('liquid', engine.express());
app.set('views', path.resolve(__dirname, "views"));
app.set('view engine', 'liquid');

我们将 Liquid 集成到 Express 应用程序中。

app.get("/today", (req, res) => {

    let today = new Date();
    res.render("show_date", {now: today});
});

对于/today 路径,我们显示当前日期。 show_date.liquid 生成输出。我们将 nowcontext 变量传递给模板。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Show date</title>
</head>
<body>

    <p>
        Today is {{ now }}
    </p>

</body>
</html>

show_date.liquid 生成 HTML 输出。它使用 {{}} 将当前日期添加到内容中。

$ node express-demo.js
Application started on port 3000

我们启动应用程序。

$ curl localhost:3000/today
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Show date</title>
</head>
<body>

    <p>
        Today is Wed Feb 13 2019 23:19:07 GMT+0100 (Central European Standard Time)
    </p>

</body>
</html>

我们使用 curl 工具创建对应用程序的请求。

在本文中,我们使用 Liquid.js 从 Liquid 模板和数据生成文档。我们介绍了 Liquid 标签、过滤器、部分和继承。

列出所有 JavaScript 教程。

赞(0) 打赏

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏