За последние несколько месяцев доступность простого в использовании встроенного JSX без процесса сборки уменьшилась. Сначала React удалил прямую поддержку, а затем Babel удалил поддержку из своей клиентской библиотеки. Есть множество причин для запуска процесса сборки основных веб- и мобильных приложений; однако бывают случаи, когда это неудобно или неудобно.

Благодаря использованию TLX, литералы шаблонов могут использоваться в качестве замены JSX с помощью React, Preact и других библиотек. В этой статье показано, как это сделать.

Начнем с простого "Hello World". Ниже приведен HTML-код с закомментированным JSX и эквивалентный TLX.

<html>
<head>
<script src="../browser/tlx-core.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/preact.min.js">
</script>
</head>
<body>
<div id="helloworld"></div>
<script>
const el = document.getElementById("helloworld"),
  message = "Hello World";
//preact.render((<div>{message}</div>),el);
preact.render(tlx`<div>${message}</div>`,el);</script>
</body>
</html>

Красиво, просто, просто замените круглые скобки JSX обратными галочками, поставьте $ перед фигурными скобками и вставьте вызов tlx!

«Да», - скажете вы, - «Но пример прост. Что, если мне нужно добавить логику в TLX? » См. Классический пример Todo ниже.

<html>
<head>
<script src="../browser/tlx-core.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/preact.min.js"></script>
</head>
<body>
<div id="todos"></div>
<script>
const todos = ["task one","task two"],
  addItem = (event) => {
    todos.push(event.target.value);
    runTodo();
  },
  removeItem = (event) => {
    const i = todos.indexOf(event.target.innerText);
    todos.splice(i,1);
    runTodo();
    return false;
  },
  runTodo = () => {
    const el = document.getElementById("todos");
    while(el.lastChild) el.removeChild(el.lastChild);
 /* preact.render(
       (<div>
         <p>My Tasks</p>
         <form>
         <input type="text" onChange="{addItem}">
         <ul>{todos.map(item =>
           (<li>
            <a href="javascript:" onClick="{removeItem}">
            {item}
            </a>
            </li>))}
         </ul>
         </form>
       </div>),
     el); */
    preact.render(tlx`<div>
         <p>My Tasks</p>
         <form>
         <input type="text" onChange="${addItem}">
         <ul>${todos.map(item =>
           tlx`<li>
            <a href="javascript:" onClick="${removeItem}">
            ${item}
            </a>
            </li>`)}
         </ul>
         </form>
       </div>`,
   el);
 };
runTodo();
</script>
</body>
</html>

Как видите, правила замены остаются прежними, и вы можете ссылаться на функции или вставлять сложную логику, как если бы вы делали это с JSX!

Вот небольшая история и дополнительная информация. Три года назад разработчики React опубликовали свои мысли о шаблонных литералах http://facebook.github.io/jsx/#why-not-template-literals. Два года назад на GitHub @choojs ответил гиперксом, https://github.com/choojs/hyperx, библиотекой, которой уделялось слишком мало внимания. Если все, что вам нужно, это замена JSX, вам не нужно идти дальше. Однако, если вы хотите большего, изучите TLX. Это форк hyperx с существенными улучшениями, которые могут дополнительно поддерживать:

  1. собственная функция рендеринга,
  2. интерполяция шаблонных литералов прямо в HTML (отлично подходит для SEO),
  3. Директивы атрибутов HTML, такие как Vue (включая пользовательские),
  4. компоненты первого класса, такие как React или Vue.

Следите за последующими статьями, посвященными каждой из вышеперечисленных функций.

См. TLX на Github, https://github.com/anywhichway/tlx, для получения дополнительной информации.