Как всегда, когда я пишу о подобных вещах в блоге, я хочу напомнить людям, что я новичок в бессерверных технологиях и новичок в OpenWhisk, поэтому, хотя то, что следует ниже, работает, я не обязательно говорю, что это лучший способ сделать что-то или даже хорошая идея. Но давайте будем честными, это никогда не останавливало меня раньше, верно?

Итак, сегодня утром у меня возник вопрос: учитывая действие OpenWhisk, созданное для поддержки веб-действий, как бы вы использовали механизм шаблонов, чтобы вернуть ответ на основе HTML?

Я предпочитаю шаблонизаторы Handlebars (хотя вы можете прочитать о других вариантах в моей книге), поэтому я сначала рассмотрел его. Вот пример действия, которое я придумал.

const Handlebars = require('handlebars');
const fs = require('fs');

let template = '';

function main(args) {

    if(template === '') {
        template = Handlebars.compile(fs.readFileSync(__dirname+'/templates/cats.html', 'utf-8'));
        console.log('loaded template from fs');
    }

    let data = {
        title:"A list of cats",
        cats:[
            "Lilith",
            "Sinatra",
            "Luna",
            "Pig",
            "Cracker"
        ]
    }

    let html = template(data);

    return { body:html };
}

exports.main = main; 

Итак, основная идея такова:

  • Посмотрите, есть ли у нас настройка переменной шаблона, и если нет, выполните чтение файла нашего шаблона и создайте для него функцию Handlebars. Вам может быть интересно, как это работает, учитывая, что действие выполняется атомарным образом без реального сохранения. Хотя это правда, разогретое действие будет сохранено. Это делает простое кэширование, подобное этому, приемлемым. (Подробнее об этом я говорил здесь: Бессерверность и постоянство).
  • Затем я получаю свои данные, которые в данном случае жестко закодированы. Очевидно, я мог бы использовать аргументы, передаваемые действию, создавать данные на лету и т. д., но простого жестко закодированного объекта было достаточно.
  • Затем я генерирую HTML, используя скомпилированную функцию обработчика, template. (Не очень описательное имя. Прошу прощения.)
  • Наконец, я возвращаю сгенерированный HTML.

Шаблон довольно прост:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>{{title}}</title>
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width">
    </head>
    <body>

        <h2>{{title}}</h2>
        
        <p>
            I'd like to thank the following cats for making everything possible:
        </p>

        <ul>
            {{#each cats}}
            <li>{{.}}</li>
            {{/each}}
        </ul>
    </body>
</html>

Последний бит — просто создать действие. Я использую пользовательский модуль npm, поэтому мне пришлось заархивировать его, но я просто снова использовал сценарий оболочки:

#!/bin/bash
zip -rq temp.zip test1.js package.json node_modules templates
wsk action update templatetest/test --kind nodejs:6 temp.zip --web true
rm temp.zip

Обратите внимание на --web true при вызове wsk. Это позволяет OpenWhisk узнать, что это веб-действие. Наконец, вы можете увидеть результат здесь:

https://openwhisk.ng.bluemix.net/api/v1/web/[email protected]_My%20Space/templatetest/test.http

Некоторые мысли:

  • Если бы я действительно собирался использовать один шаблон, я бы, вероятно, подумал об использовании строки шаблона в коде действия. Я чувствую, что это было бы немного грязно, и я не получил бы мою красивую окраску синтаксиса HTML/автозаполнение в моем редакторе. Но я бы рассмотрел это точно.
  • И, конечно же, не забывайте, что строки шаблона поддерживают подстановку переменных, как облегченная версия механизма шаблонов, такого как Handlebars. Но вы не получаете таких вещей, как условные операторы и циклы.
  • Handlebars поддерживает компиляцию строк шаблона в функции и их сохранение. Поэтому лучшим подходом было бы сделать это, потребовать от них участия в действии и развернуть это. Вы можете использовать свой сценарий оболочки / летучей мыши, чтобы сделать все это сразу.

Любые комментарии или опасения по поводу этого подхода?

Первоначально опубликовано на www.raymondcamden.com 21 апреля 2017 г.