В данной статье будет описано небольшое руководство по тому, как создать сайт на таком фреймворке как Cample.js. На момент написания статьи (версия 3.1.2), фреймворк уже более года находится в разработке. За это время был реализован минимальный функционал для создания современных веб-приложений.

Вся статья основана на информации из документации, а также на примерах функциональных UI компонентов, созданных благодаря фреймворку.

Прежде всего, для того, чтобы создать сайт на фреймворке, необходимо будет его установить. Для установки фреймворка будет необходим Node.js. Благодаря нему, в консоли появится возможность использования npm, через который будет скачиваться фреймворк.

Скачивание фреймворка происходит путём ввода команды в консоль в папке с проектом:

npm i cample

После, в папке node_modules появляется сам модуль. Для использования фреймворка необходима среда, которая будет поддерживать import export модель, благодаря которой будет выстроен код. Такую среду, к примеру, можно настроить благодаря webpack и подходящим модулям, для работы с HTML, стилями, изображениями и т.д. Но, в теории, подходит почти любой сборщик модулей.

Далее, необходим HTML файл, который будет основой для сайта. К нему будет подключаться javascript файл, где будут реализованы скрипты фреймворка.

В HTML файле, стартовой точкой сайта пускай будет тег div с id main. В нём будет находится основной контент сайта.

<div id="main"></div>

В javascript файле для начала нужно импортировать такую функцию как cample. Данная функция создаёт экземпляр класса, который является начальной точкой в js для сайта.

import { cample } from "cample";

Данная функция принимает первым параметром selector блока, куда будет рендериться сайт, а вторым, необязательным параметром, функция принимает объект с опциями. Для дальнейшей работы будет использоваться один параметр.

const mainCample = cample("#main");

Все функции в фреймворке создают экземпляры классов. В данном случае, в переменную с названием main присваивается экземпляр класса. У данной переменной теперь можно вызвать метод render, в который будут переданы все компоненты, которые созданы, а также основной HTML template, который будет обработан.

mainCample.render(
  `
    <div class="wrapper">
      {{content}}
    </div>
  `,
  {
    content,
    tableRows,
  }
);

Используя двойные фигурные скобочки скрипт применяет такой приём как "интерполяция строк", благодаря которому будет создана срока такого типа:

<template data-cample="content-component" ...></template>

Такая строчка потом заменяется на HTML компонента. Для того, чтобы работать с компонентами, в js файл нужно импортировать соответствующие функции. В примере будут использоваться функции each и component, которые предоставляют необходимый функционал.

import { component, each } from "cample";

Сам же компонент, к примеру, будет выглядеть вот так:

const content = component(
  "content-component",
  `
  <div class="content">
    <h1 class="title">{{title}}</h1>
    <table>
      <thead>
        <tr>
          <th>Тестовые данные</th>
        </tr>
      </thead>
      <tbody><template
      data-cample-import="{{{tableData}}}"
      data-cample="rows-component"></template></tbody>
    </table>
  </div>
`,
  {
    data: () => {
      return {
        title: "Основная страница",
        data: ["Тестовая строка"],
      };
    },
    export: {
      tableData: {
        data: {
          data: "data",
        },
      },
    },
    exportId: "mainExport",
    style: ".title{font-size:60px}",
  }
);

В данном примере создаётся div с заголовком h1 и таблицей, данные для которой импортируются из компонента. Подробнее про работу с компонентами можно посмотреть в документации тут. Данные для таблицы хранятся в свойстве data, в которой есть один текст: "Тестовая строка". В зависимости от этого в таблице будет только одна строка.

Для того, чтобы отобразить данные для таблицы, необходим компонент each. Он повторяет HTML код в зависимости от данных.

const tableRows = each(
  "rows-component",
  ({ importedData }) => importedData.data,
  `<tr key={{index}}>
    <td>{{value}}</td>
   </tr>
  `,
  {
    import: {
      value: [],
      exportId: "mainExport",
    },
  }
);

Главным моментом при создании цикла является указание свойства key для повторяющегося HTML. Более подробно о том, чем отличается keyed реализация от non-keyed можно посмотреть тут. При импортировании, в функции данных можно указать то самое импортированное свойство data, тем самым отобразив данные на сайте. В самом свойстве import для значения value можно указать пустой массив, тем самым импортировав всё то, что экспортируется.

Таким образом, весь код выглядит примерно вот так:

import { cample, component, each } from "cample";

const content = component(
  "content-component",
  `
  <div class="content">
    <h1 class="title">{{title}}</h1>
    <table>
    <thead>
      <tr>
        <th>Тестовые данные</th>
      </tr>
    </thead>
    <tbody><template
    data-cample-import="{{{tableData}}}"
    data-cample="rows-component"></template></tbody>
  </table>
  </div>
`,
  {
    data: () => {
      return {
        title: "Основная страница",
        data: ["Тестовая строка"],
      };
    },
    export: {
      tableData: {
        data: {
          data: "data",
        },
      },
    },
    exportId: "mainExport",
    style: ".title{font-size:60px}",
  }
);
const tableRows = each(
  "rows-component",
  ({ importedData }) => importedData.data,
  `<tr key={{index}}>
    <td>{{value}}</td>
   </tr>
  `,
  {
    import: {
      value: [],
      exportId: "mainExport",
    },
  }
);
const mainCample = cample("#example");
mainCample.render(
  `
    <div class="wrapper">
      {{content}}
    </div>
  `,
  {
    content,
    tableRows,
  }
);

Результатом же кода, будет примерно такая страница:

Результат работы скрипта на сайте
Результат работы скрипта на сайте

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

Всем большое спасибо за прочтение статьи!

Комментарии (11)


  1. yarkov
    16.09.2023 14:19
    +6

    Для чего эта очередная пародия на Vue?


    1. antonmak1 Автор
      16.09.2023 14:19
      -1

      Для создания сайтов :)

      P.S. Хоть Cample чем-то похож на синтаксис Vue, это всё таки не пародия. Самые существенные отличия в самой реализации функционала. Cample не использует VDOM для реактивности.


      1. Vadiok
        16.09.2023 14:19
        +1

        И это имеет какие-то преимущества?


  1. zolotyh
    16.09.2023 14:19
    +5

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


    1. ryanl
      16.09.2023 14:19

      Там же написано - он не lean и extremely fast, он moderately fast.)


      1. antonmak1 Автор
        16.09.2023 14:19
        -1

        До extremely fast фреймворку ещё надо дорасти :)


      1. zolotyh
        16.09.2023 14:19
        +2

        Это мало о чем говорит без пояснений.


    1. antonmak1 Автор
      16.09.2023 14:19
      -1

      Да, надо будет написать про это. Спасибо за идею!


  1. Lunti
    16.09.2023 14:19
    +2

    Лучше бы рассказали не как создать, а зачем именно на нем


    1. sasmoney
      16.09.2023 14:19

      Или преимущества которыми он лучше


  1. stvoid
    16.09.2023 14:19

    Задам вопрос лучше, исходя из примера выше.

    А чем это лучше и удобнее ванильного js?

    В примере нет никакой реактивности, специфичный синтаксис есть, но непонятно зачем.