bayrell / BayLang

BayLang compiler source code
https://bayrell.org/ru/docs/baylang
Apache License 2.0
4 stars 0 forks source link

Чистый BayLang #153

Open ildar-ceo opened 3 months ago

ildar-ceo commented 3 months ago

Идея в том, чтобы создать чистый BayLang, который может работать нативно в js, php с минимум загружаемых runtime библиотек. Сейчас runtime библиотека много весит. Задача убрать все лишнее и оставить только необходимое.

Скорее всего runtime будет состоять из:

Также нужно убрать зависимость от vuejs и сделать свою рендер функцию, которая будет нативно патчить html элементы в DOM без необходимости создавать VirtualDom

Context, Entity, Provider скорее всего будут перенесены в Runtime.Web

Минимальная версия BayLang необходима для интеграции с другими фреймворками, такими как Laravel, Symfony и т.п. Дело в том, что BayLang 0.12 реализует похожий функционал, который есть в популярных фреймворках. Например роутинг, api, обработка HTML запросов и т.п. Поэтому в минимальной версии дублирование функций нужно убрать.

Пример hello world на BayLang:

namespace App;

class Main
{
    static init main()
    {
        dump("Hello, World!");
        return 0;
    }   
}

entry_point(method Main::main);

Модель:

namespace App;

use Runtime.BasePageModel;
use App.IndexPage;

class IndexPageModel extends BasePageModel
{
    string component = classof IndexPage;
    string message = "Welcome to BayLang";
}

Шаблон:

<class name="App.IndexPage">
<template>
    <div class="app">Hello, World!</div>
    <div class="message">{{ this.model.message }}</div>
</template>
</class>

PHP:

<?php

use Runtime\rs;
use Runtime\BaseLayout;
use Runtime\RenderContainer;

/* Create container and layout */
$container = new RenderContainer();
$container->createLayout("Runtime.BaseLayout");

/* Setup page model */
$container->layout->setPageModel("App.IndexPageModel");

/* Resolve route */
$container->resolveRoute();

/* HTML */
?><html lang='<?= rs::escape_attr($layout->lang) ?>'>
<head>
<title><?= rs::escape_html($layout->title) ?></title>
</head>
<body>
<div class="root_container"><?= \Runtime\rtl::render($layout) ?></div>
<script>
var layout = <?= json_encode($layout->exportData()); ?>;
window.app = Runtime.rtl.mount(var layout, document.querySelector(".root_container"));
</script>
</body>
</html>
ildar-ceo commented 3 months ago

Еще пример:

<?php

use Runtime\rs;
use Runtime\RenderContainer;
use Runtime\Request;

/* Create container and layout */
$container = new RenderContainer();
$container->createLayout("Runtime.BaseLayout");

/* Find route */
$container->setRequest(new Request());
$container->findRoute();

/* Run route */
$container->resolveRoute();

/* HTML */
?><html lang='<?= rs::escape_attr($layout->lang) ?>'>
<head>
<title><?= rs::escape_html($layout->title) ?></title>
</head>
<body>
<div class="root_container"><?= \Runtime\rtl::render($layout) ?></div>
<script>
var layout = <?= json_encode($layout->exportData()); ?>;
window.app = Runtime.rtl.mount(var layout, document.querySelector(".root_container"));
</script>
</body>
</html>
ildar-ceo commented 3 months ago

Скорее всего RenderContainer, Request, findRoute, resolveRoute должны содержать абстракции, а их реализации будут разные и отличаться от языка и фрэймворка, где работает BayLang

ildar-ceo commented 2 months ago

Вместо

$container->resolveRoute();

Должно быть

$container->loadData();

Суть в том, чтобы загрузить данные модели из базы данных. У каждой модели есть метод loadData, который предполагается использовать для вызовы RPC методов бэкенда, которые предоставят данные из базы данных, используя DTO объекты. DTO объект это часть модели. Фактически задача ORM делать запросы в базу и формировать эти DTO объекты, а также сохранять эти объекты обратно в базу. Простейший пример DTO объектов это Vector, Map, а также примитивные типы данных.