Разработка на javascript или как я до этого докатился.
Внимание! Много буков. А еще MODX будет представлен не в самом лучшем виде, но я обещаю быть объективным. Тем не менее, особо чувствительным не рекомендуется к прочтению.
Данный топик — ответ на этот комментарий.
Два года назад, почти одновременно, я начал три довольно сложных проекта. Конечно же я писал их на MODX. Но в процессе я столкнулся с некоторыми сложностями, которые на мелких и средних проектах не так сильно себя проявляли, но здесь они грели голову весьма и весьма. Что это за проблемы?
1. Работа с моделью данных.
Как много здесь тех, кто умеет программно средствами MODX редактировать таблицы? Создавать новые, редактировать имеющиеся (добавлять/удалять колонки и индексы) и т.п.? Думаю не много. И не воспринимайте это как очередное издевательство с моей стороны. Статистика говорит, что тема не очень популярная modx.pro/search?query=createObjectContainer
А не популярная она, потому что слишком сложная. Вот немного объяснения. Если вы руками подправите свои мап-файлы, вы сможете внести изменения в таблицу. И можно делать это без перегенерации схемы. Вот здесь обсуждали не очень активно добавление колонки. Жаль, что в подобных топиках желающих помочь советом знатоков не так много, как ко мне заглядывает…
Если кто-то все еще не уверен, что это сложная тема, советую к прочтению.
Так к чему я это? Проект развивался, и вместе с этим приходилось вносить изменения в базу данных. Для этого конечно же приходилось править модель. И вот ты правишь модель ручками, прописываешь связи с другими объектами, думаешь как их назвать, чтобы не возникло нигде конфликтов, потом деплоишь схему… И вот тут хорошо, если это просто добавление новых сущностей. А если надо переименовать таблицы/колонки, в которых уже есть данные?
Кстати, про конфликты имен я тоже не просто так упомянул. Что делать, если ты решил создать таблицу, которая уже используется другим компонентом? Помните, как из-за подобных конфликтов Василий поубирал свои исходники? Согласитесь, неприятно.
Есть и у меня своя «история успеха», которая очень запомнилась. Вроде никто и не виноват, но все же. Кто помнит Шона МакКормика? Если кто и не знал про него, то имеет смысл заполнить этот пробел. Когда из MODX LLC неожиданно возникло SiphonLabs, Шон ушел из MODX. Я до сих пор сожалею об этом и считаю, что именно из-за этого мы так долго ждем (или уже не ждем) MODX3. Ведь всем известный Джейсон Ковард — ярковыроженный бэкенд-разработчик. А вот ту часть админки, которую все видят, заходя в manager/ — это творение Шона. И хотя в последние несколько лет ее пытаются как-то переоформить, сделать типа лучше, на самом деле там ничего толком не меняется, потому что сама JS-логика, написанная им, до сих пор юзается как есть, и по большей части не трогается годами

Ну поменяли цвета и иконки, а что толку? се то же самое, только целлофане. Обидно на самом деле. За эти годы он много что мог полезного сделать для развития MODX, но… Замену так и не нашли.
Сорри, это небольшое лирическое отступление было, просто вспомнилось. А суть: оставил он и мне наследие :) Есть у меня один компонент, modRedirect называется. Я его особо не пиарил, так что наверняка многие не слышали, но это совсем не беда. А вот немного беда была, когда на сайте он как-то сильно забарахлил. То есть вроде есть и работает, но как-то совсем уж плохо. Пациент больше мертв, чем жив. И никаких четких признаков. Просто редиректы не срабатывают и все. Стал разбираться, и выяснилось интересное: оказывается, на сайте еще стоял Redirector от Шона. Казалось бы, стоит и стоит, верно? Компоненту несколько лет и вроде как временем проверенный. А оказалось, что хоть компонент и называется Redirector, Шон класс таблицы назвал не Redirector, а modRedirect :) Забавно, да?:) А у меня тоже modRedirect. И что получается. Вроде как везде все хорошо, но только вместо моего класса, срабатывает его. Вот и проблемка. При чем пакость в том, что не было никаких логов, технической ошибки не было, была коварная логическая ошибка.
И когда вот все это пройдешь, когда день убьешь на то, чтобы скорректировать модель, начинается следующий квест: скорректировать программный код. Запросы поменялись, параметры поменялись, короче все поменялось. А главное, смотришь такой на свой же код, который писал день/неделю/месяц назад и думаешь, а что в нем после корректировки модели можно поменять, а что нельзя. Так-то выглядит лишним, а так-то может потом где вылезет скрытой ошибкой, и ищи потом где что не так. И вот программный код растет, все это нагромождается, усложняется, и в какой-то момент начинаешь уже осознавать, что тратишь все время на корректировки имеющегося не очень хорошо работающего, вместо того, чтобы писать уже новый функционал. Просто потому что на это уже не хватает времени. Какую-то мелочь скорректировать — и понимаешь, что зацепит много всего и потом опять бесконечные корректировки…
Что же я имею на сегодня в противовес этому?
Есть вот компонент пользователя и в нем прописана структура модели этого самого пользователя (уверен, понять примерно назначение этой структуры по силу многим). Вот я себе хочу создать базу данных с таблицей на основании этой модели. Я выполняю несколько команд:
И готовая документация есть, какие сущности, какие поля, какие методы доступны.

Зайдите сами посмотрите test-endpoint.modxclub.ru/user-module/test и пощелкайте.
Да, это админское API, а не ограниченное, так что приведенный выше код можете самостоятельно протестировать, создав для себя свою базу и API. Просто замените test-endpoint.modxclub.ru/user-module/test на какое-нибудь свое, к примеру test-endpoint.modxclub.ru/my-user-module/my-stage
А теперь, если вы у себя все это проделали, выполните вместо endpoint=http://test-endpoint.modxclub.ru/user-module/test yarn deploy вот эту команду:
endpoint=http://test-endpoint.modxclub.ru/user-module/test yarn start
Теперь у вас запустится локально пользовательский API-сервер, по умолчанию адрес localhost:4000
Он будет сильно похож на админский, но все же отличаться. В случае с этим модулем, у вас появится не только голая модель пользователя, но и более пользовательские методы с дополнительной валидацией, такие как регистрация (signup), авторизация (signin) и получение текущего авторизованного пользователя (me).

Уже есть с чего начинать строить свою маленькую социальную сеть :) (а может и не маленькую).
А теперь выполняем все то же самое, но уже с другим модулем: github.com/prisma-cms/upload-module
Возвращаемся в тестовую папку, куда клонировали пользователей и выполняем чуть другие команды.
А так у меня один модуль работает на одном порту, а другой на другом. И таких сервером запустить можно много, на сколько портов хватает.
И вот у нас еще один API-сервис.
Этот, как не сложно догадаться, предназначен для загрузки файлов и доступа к ним. Админское API хранит только базовые методы для работы с базой данных, а вот в клиентском API есть методы для одиночной и мультизагрузки файлов.
Файлы вы из этого интерфейса просто так не загрузите, но ниже я покажу как это работает. Пока же условимся на том, что у нас есть один сервис под пользователей, а другой под файлы. Еще есть модули логов, почты, ресурсов, проектов-задач-таймеров и т.п., но мы не будем их сейчас все устанавливать, нам же двух для примера хватит, верно? :)
И вот сейчас самое интересное: у нас есть два отдельных сервиса. Но нам не надо два, нам надо один, и чтобы там были и пользователи, и файлы, и чтобы загрузка только для авторизованных пользователей была, и чтобы связи Пользователи-Файлы были. Короче, все хотим!
Хорошо. Хотим — значит сделаем. Мы же такие? :)
Мы сейчас находимся в модуле файлов, так давайте его и отредактируем.
1. установим user-module как зависимость yarn add @prisma-cms/user-module
2. Открываем src/modules/index.mjs и в шапке файла дописываем зависимость import UserModule from "@prisma-cms/user-module";
А в constructor в конце дописываем
endpoint=http://test-endpoint.modxclub.ru/upload-module/test2 yarn deploy
Вот теперь у нас есть и пользователи, и файлы

Единственное, нам сейчас не хватает связей Пользователи-Файлы.
Идем в папку src/modules/schema/database. Там уже есть file.graphql с описанием модели файла и мы могли бы дописать в него, но не будем так делать, а просто создадим еще один файл extended.graphql и запишем в него:
endpoint=http://test-endpoint.modxclub.ru/upload-module/test2 yarn deploy
Этот результат выполнения я процитирую здесь:

Теперь и запросы можно строить со связками:

При этом у нас не только модель, но и контроль за целостностью данных. Не даст он мне привязать к пользователю запись файла, которой не существует.

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

Есть в MODX что-то близкое к этому?
Ну да ладно, едем дальше. API-то у нас есть, но что делать дальше?

Отдельные заготовки интерфейсов будут чуть позже. Но как это работает, читайте здесь. Если будут более сформулированные просьбы, напишу отдельные топики-ответы.
Но в нашем повествовании это еще не конец. Не зря же я вверху поставил 1. Едем дальше… Хотя вторая часть будет короче.
2. Бэк и фронт живут своей жизнью.
Вот даже не знаю, что меня больше достало, то ли модель постоянно корректировать, то ли фронт потом под изменения догонять… С каждой новой «фишкой» на странице, кошмар рос в геометрической прогрессии. Эта жучка с ее глобальной областью видимости… несвязанные друг с другом отдельные компоненты страницы, когда одно редактируешь, а другое вроде должно обновиться, но не обновляется… лишние повторные запросы на сервер… 100500 JS/CCS файлов (85% из которых уже давно не актуальна, но когда удаляешь, выясняется, что 1% оттуда все-таки использовался и именно из-за этого на всю страницу появилась большая желтая полоса)… Как вспомню… Стар я стал для всего этого дерьма…
3. На каком языке я сейчас пишу?
Заключительная причина, совсем сжатая.
Со временем начинаешь в php писать console.log(), в JS print_r()… Блин, в какой-то момент это уже начинало бесить. При чем самый треш происходит, когда какую-то часть логики с фронта нужно было перенести на бэк, а там php… Приходилось переписывать. А эти языки не только синтаксисом отличаются… Сейчас я хоть с фронта на сервер переношу, хоть наоборот во фронт. А нет, что я такое говорю?! Для меня же сейчас вообще практически нет такой разницы:) Это называется «изоморфные приложения».
На самом деле разница, конечно, бывает, особенно когда дело касается работы с файловой системой, но на практике это сейчас такой ничтожный процент работ, что можно пренебречь.
Вот, собственно, так я и докатился до этого. 8 лет плотно работал с MODX, но столкнулся с задачами, которые мне сказали «Парень, ты не осилишь нас этой мотыгой, пора хотя бы мотоблок в руки взять...». Первый год было очень больно. Не буду перечислять всего, но в ту бытность даже webpack приходилось самому конфигурировать, и graphql-схемы я вручную писал, и много еще всего интересного было. Но где-то с полгода назад я уже почувствовал, что у меня в руках уже весьма хорошие наработки, и с ними я сейчас не редко за один-два дня делаю столько, сколько до этого на MODX делал месяц, а то и не один. И вот как-то привыкаешь к хорошему и назад уже не хочется. Но каждый выбирает для себя свой путь сам, и рабочие инструменты тоже.
UPD: Забыл еще один немаловажный момент отметить: безопасность. А-я-яй! Кому-то больно стало? Да, это лето у нас жарким было. К слову, по статистике запросов вижу, что тема все еще не закрыта, до сих пор ломают MODX-сайты. Запилил свежий топик с процедурой восстановления.
Так к чему я про эту безопасность? А к тому, что в моем случае есть только одна точка активного взаимодействия с сайтом — вот это вот самое API. Другой точки просто нет. Все остальное — это на чтение только. И самая соль в том, что именно схема определяет что и в каком виде можно отправлять в API-запросах. Если сказано, что на обновление пользователя можно отправлять только fullname типа Строка, то отправить можно только строку. В последних версиях graphql вообще, если указан тип Int, а ты пытаешься отправить '10', а не 10, такое не пройдет, будет возвращена ошибка. Хотя явно '10' легко конвертируется в 10 и еще недавно graphql позволял такое пропустить, сейчас уже не позволяет.
Данный топик — ответ на этот комментарий.
Два года назад, почти одновременно, я начал три довольно сложных проекта. Конечно же я писал их на MODX. Но в процессе я столкнулся с некоторыми сложностями, которые на мелких и средних проектах не так сильно себя проявляли, но здесь они грели голову весьма и весьма. Что это за проблемы?
1. Работа с моделью данных.
Как много здесь тех, кто умеет программно средствами MODX редактировать таблицы? Создавать новые, редактировать имеющиеся (добавлять/удалять колонки и индексы) и т.п.? Думаю не много. И не воспринимайте это как очередное издевательство с моей стороны. Статистика говорит, что тема не очень популярная modx.pro/search?query=createObjectContainer
А не популярная она, потому что слишком сложная. Вот немного объяснения. Если вы руками подправите свои мап-файлы, вы сможете внести изменения в таблицу. И можно делать это без перегенерации схемы. Вот здесь обсуждали не очень активно добавление колонки. Жаль, что в подобных топиках желающих помочь советом знатоков не так много, как ко мне заглядывает…
Если кто-то все еще не уверен, что это сложная тема, советую к прочтению.
Так к чему я это? Проект развивался, и вместе с этим приходилось вносить изменения в базу данных. Для этого конечно же приходилось править модель. И вот ты правишь модель ручками, прописываешь связи с другими объектами, думаешь как их назвать, чтобы не возникло нигде конфликтов, потом деплоишь схему… И вот тут хорошо, если это просто добавление новых сущностей. А если надо переименовать таблицы/колонки, в которых уже есть данные?
Кстати, про конфликты имен я тоже не просто так упомянул. Что делать, если ты решил создать таблицу, которая уже используется другим компонентом? Помните, как из-за подобных конфликтов Василий поубирал свои исходники? Согласитесь, неприятно.
Есть и у меня своя «история успеха», которая очень запомнилась. Вроде никто и не виноват, но все же. Кто помнит Шона МакКормика? Если кто и не знал про него, то имеет смысл заполнить этот пробел. Когда из MODX LLC неожиданно возникло SiphonLabs, Шон ушел из MODX. Я до сих пор сожалею об этом и считаю, что именно из-за этого мы так долго ждем (или уже не ждем) MODX3. Ведь всем известный Джейсон Ковард — ярковыроженный бэкенд-разработчик. А вот ту часть админки, которую все видят, заходя в manager/ — это творение Шона. И хотя в последние несколько лет ее пытаются как-то переоформить, сделать типа лучше, на самом деле там ничего толком не меняется, потому что сама JS-логика, написанная им, до сих пор юзается как есть, и по большей части не трогается годами

Ну поменяли цвета и иконки, а что толку? се то же самое, только целлофане. Обидно на самом деле. За эти годы он много что мог полезного сделать для развития MODX, но… Замену так и не нашли.
Сорри, это небольшое лирическое отступление было, просто вспомнилось. А суть: оставил он и мне наследие :) Есть у меня один компонент, modRedirect называется. Я его особо не пиарил, так что наверняка многие не слышали, но это совсем не беда. А вот немного беда была, когда на сайте он как-то сильно забарахлил. То есть вроде есть и работает, но как-то совсем уж плохо. Пациент больше мертв, чем жив. И никаких четких признаков. Просто редиректы не срабатывают и все. Стал разбираться, и выяснилось интересное: оказывается, на сайте еще стоял Redirector от Шона. Казалось бы, стоит и стоит, верно? Компоненту несколько лет и вроде как временем проверенный. А оказалось, что хоть компонент и называется Redirector, Шон класс таблицы назвал не Redirector, а modRedirect :) Забавно, да?:) А у меня тоже modRedirect. И что получается. Вроде как везде все хорошо, но только вместо моего класса, срабатывает его. Вот и проблемка. При чем пакость в том, что не было никаких логов, технической ошибки не было, была коварная логическая ошибка.
И когда вот все это пройдешь, когда день убьешь на то, чтобы скорректировать модель, начинается следующий квест: скорректировать программный код. Запросы поменялись, параметры поменялись, короче все поменялось. А главное, смотришь такой на свой же код, который писал день/неделю/месяц назад и думаешь, а что в нем после корректировки модели можно поменять, а что нельзя. Так-то выглядит лишним, а так-то может потом где вылезет скрытой ошибкой, и ищи потом где что не так. И вот программный код растет, все это нагромождается, усложняется, и в какой-то момент начинаешь уже осознавать, что тратишь все время на корректировки имеющегося не очень хорошо работающего, вместо того, чтобы писать уже новый функционал. Просто потому что на это уже не хватает времени. Какую-то мелочь скорректировать — и понимаешь, что зацепит много всего и потом опять бесконечные корректировки…
Что же я имею на сегодня в противовес этому?
Есть вот компонент пользователя и в нем прописана структура модели этого самого пользователя (уверен, понять примерно назначение этой структуры по силу многим). Вот я себе хочу создать базу данных с таблицей на основании этой модели. Я выполняю несколько команд:
mkdir test
cd test
git clone https://github.com/prisma-cms/user-module
cd user-module/
yarn
endpoint=http://test-endpoint.modxclub.ru/user-module/test yarn deployИ все. Вот у меня есть готовая база данных с таблицами и полями, а плюс к этому уже почти на все случаи жизни методы для работы с этими данными. youtu.be/lA0ynX0-ZsYИ готовая документация есть, какие сущности, какие поля, какие методы доступны.

Зайдите сами посмотрите test-endpoint.modxclub.ru/user-module/test и пощелкайте.
Да, это админское API, а не ограниченное, так что приведенный выше код можете самостоятельно протестировать, создав для себя свою базу и API. Просто замените test-endpoint.modxclub.ru/user-module/test на какое-нибудь свое, к примеру test-endpoint.modxclub.ru/my-user-module/my-stage
А теперь, если вы у себя все это проделали, выполните вместо endpoint=http://test-endpoint.modxclub.ru/user-module/test yarn deploy вот эту команду:
endpoint=http://test-endpoint.modxclub.ru/user-module/test yarn start
Теперь у вас запустится локально пользовательский API-сервер, по умолчанию адрес localhost:4000
Он будет сильно похож на админский, но все же отличаться. В случае с этим модулем, у вас появится не только голая модель пользователя, но и более пользовательские методы с дополнительной валидацией, такие как регистрация (signup), авторизация (signin) и получение текущего авторизованного пользователя (me).

Уже есть с чего начинать строить свою маленькую социальную сеть :) (а может и не маленькую).
А теперь выполняем все то же самое, но уже с другим модулем: github.com/prisma-cms/upload-module
Возвращаемся в тестовую папку, куда клонировали пользователей и выполняем чуть другие команды.
git clone https://github.com/prisma-cms/upload-module
cd upload-module/
yarn
endpoint=http://test-endpoint.modxclub.ru/upload-module/test yarn deploy
PORT=4001 endpoint=http://test-endpoint.modxclub.ru/upload-module/test yarn startЯ в конце добавить PORT=4001, чтобы запустить этот модуль локально на другом порту, так как сейчас порт 4000 занят модулем пользователей, и при попытке запуска будет ошибка. Error: listen EADDRINUSE :::4000А так у меня один модуль работает на одном порту, а другой на другом. И таких сервером запустить можно много, на сколько портов хватает.
И вот у нас еще один API-сервис.
Этот, как не сложно догадаться, предназначен для загрузки файлов и доступа к ним. Админское API хранит только базовые методы для работы с базой данных, а вот в клиентском API есть методы для одиночной и мультизагрузки файлов.
Файлы вы из этого интерфейса просто так не загрузите, но ниже я покажу как это работает. Пока же условимся на том, что у нас есть один сервис под пользователей, а другой под файлы. Еще есть модули логов, почты, ресурсов, проектов-задач-таймеров и т.п., но мы не будем их сейчас все устанавливать, нам же двух для примера хватит, верно? :)
И вот сейчас самое интересное: у нас есть два отдельных сервиса. Но нам не надо два, нам надо один, и чтобы там были и пользователи, и файлы, и чтобы загрузка только для авторизованных пользователей была, и чтобы связи Пользователи-Файлы были. Короче, все хотим!
Хорошо. Хотим — значит сделаем. Мы же такие? :)
Мы сейчас находимся в модуле файлов, так давайте его и отредактируем.
1. установим user-module как зависимость yarn add @prisma-cms/user-module
2. Открываем src/modules/index.mjs и в шапке файла дописываем зависимость import UserModule from "@prisma-cms/user-module";
А в constructor в конце дописываем
this.mergeModules([
UserModule,
]);Выполним деплой, только в новую базу (оставим оригинал для сравнения).endpoint=http://test-endpoint.modxclub.ru/upload-module/test2 yarn deploy
Вот теперь у нас есть и пользователи, и файлы

Единственное, нам сейчас не хватает связей Пользователи-Файлы.
Идем в папку src/modules/schema/database. Там уже есть file.graphql с описанием модели файла и мы могли бы дописать в него, но не будем так делать, а просто создадим еще один файл extended.graphql и запишем в него:
type File{
CreatedBy: User
}
type User{
Files: [File!]!
}и выполним опять деплой схемы в ту же базу. endpoint=http://test-endpoint.modxclub.ru/upload-module/test2 yarn deploy
Этот результат выполнения я процитирую здесь:
$ endpoint=http://test-endpoint.modxclub.ru/upload-module/test2 yarn deploy
✔
Changes:
User (Type)
+ Created field `Files` of type `[Relation!]!`
File (Type)
+ Created field `CreatedBy` of type `Relation`
FileToUser (Relation)
+ Created relation between File and User
Your Prisma GraphQL database endpoint is live:
HTTP: http://test-endpoint.modxclub.ru/upload-module/test2
WS: ws://test-endpoint.modxclub.ru/upload-module/test2
⠋ Get schemaHandlerObject.flags { 'env-file': undefined }
Schema file was updated: src/schema/generated/prisma.graphql
⠋ Generating fragments for project app...src/schema/generated/api.graphql
✔ Fragments for project app written to src/schema/generated/api.fragments.js
Done in 4.39s.После этого посмотрите изменения в схеме:
Теперь и запросы можно строить со связками:

При этом у нас не только модель, но и контроль за целостностью данных. Не даст он мне привязать к пользователю запись файла, которой не существует.

Собственно, мы могли бы и не пользователя в модуль файлов добавить, а модуль файлов в пользователя. А могли бы и туда и обратно, при чем несколько раз. И все равно бы получили бы ту же самую модель и тот же функционал.
А вот еще фишка: я сейчас удалю схему пользователя и попробую задеплоить ее.
✖ Exited with code: 1
✔
Warnings:
User
! You already have nodes for this model. This change will result in data loss.
If you want to ignore the warnings, please deploy with the --force flag: $ prisma deploy --force
Read more about deployment warnings here: https://bit.ly/prisma-force-flagОй, у меня оказывается есть данные в базе, которые будут затронуты данным изменением, поэтому прерывается. Но говорит, что если все-таки хотите удалить, выполните эту команду с флагом --force, и будет вам счастье (если бэкапы есть).
Есть в MODX что-то близкое к этому?
Ну да ладно, едем дальше. API-то у нас есть, но что делать дальше?

Отдельные заготовки интерфейсов будут чуть позже. Но как это работает, читайте здесь. Если будут более сформулированные просьбы, напишу отдельные топики-ответы.
Но в нашем повествовании это еще не конец. Не зря же я вверху поставил 1. Едем дальше… Хотя вторая часть будет короче.
2. Бэк и фронт живут своей жизнью.
Вот даже не знаю, что меня больше достало, то ли модель постоянно корректировать, то ли фронт потом под изменения догонять… С каждой новой «фишкой» на странице, кошмар рос в геометрической прогрессии. Эта жучка с ее глобальной областью видимости… несвязанные друг с другом отдельные компоненты страницы, когда одно редактируешь, а другое вроде должно обновиться, но не обновляется… лишние повторные запросы на сервер… 100500 JS/CCS файлов (85% из которых уже давно не актуальна, но когда удаляешь, выясняется, что 1% оттуда все-таки использовался и именно из-за этого на всю страницу появилась большая желтая полоса)… Как вспомню… Стар я стал для всего этого дерьма…
3. На каком языке я сейчас пишу?
Заключительная причина, совсем сжатая.
Со временем начинаешь в php писать console.log(), в JS print_r()… Блин, в какой-то момент это уже начинало бесить. При чем самый треш происходит, когда какую-то часть логики с фронта нужно было перенести на бэк, а там php… Приходилось переписывать. А эти языки не только синтаксисом отличаются… Сейчас я хоть с фронта на сервер переношу, хоть наоборот во фронт. А нет, что я такое говорю?! Для меня же сейчас вообще практически нет такой разницы:) Это называется «изоморфные приложения».
На самом деле разница, конечно, бывает, особенно когда дело касается работы с файловой системой, но на практике это сейчас такой ничтожный процент работ, что можно пренебречь.
Вот, собственно, так я и докатился до этого. 8 лет плотно работал с MODX, но столкнулся с задачами, которые мне сказали «Парень, ты не осилишь нас этой мотыгой, пора хотя бы мотоблок в руки взять...». Первый год было очень больно. Не буду перечислять всего, но в ту бытность даже webpack приходилось самому конфигурировать, и graphql-схемы я вручную писал, и много еще всего интересного было. Но где-то с полгода назад я уже почувствовал, что у меня в руках уже весьма хорошие наработки, и с ними я сейчас не редко за один-два дня делаю столько, сколько до этого на MODX делал месяц, а то и не один. И вот как-то привыкаешь к хорошему и назад уже не хочется. Но каждый выбирает для себя свой путь сам, и рабочие инструменты тоже.
UPD: Забыл еще один немаловажный момент отметить: безопасность. А-я-яй! Кому-то больно стало? Да, это лето у нас жарким было. К слову, по статистике запросов вижу, что тема все еще не закрыта, до сих пор ломают MODX-сайты. Запилил свежий топик с процедурой восстановления.
Так к чему я про эту безопасность? А к тому, что в моем случае есть только одна точка активного взаимодействия с сайтом — вот это вот самое API. Другой точки просто нет. Все остальное — это на чтение только. И самая соль в том, что именно схема определяет что и в каком виде можно отправлять в API-запросах. Если сказано, что на обновление пользователя можно отправлять только fullname типа Строка, то отправить можно только строку. В последних версиях graphql вообще, если указан тип Int, а ты пытаешься отправить '10', а не 10, такое не пройдет, будет возвращена ошибка. Хотя явно '10' легко конвертируется в 10 и еще недавно graphql позволял такое пропустить, сейчас уже не позволяет.
Комментарии: 52
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
ps просто шутка, без обид.
Fi1osofСтатья классная, я заинтересован! Благодарю!
Fi1osofFi1osofFi1osofFi1osofК слову, php мне теперь тоже ппц не нравится :) Но это уже совсем другая история.
Fi1osofто, что-то я не услышал в чём выгода вашей prisma-cms перед тем же Laravel, или OctoberCMS, написанной на нём. Иначе холивар какой-то слабый получится)) Мне правда пока сложно оценить внутреннюю кухню, нужно будет погрузиться в то и другое. Но может есть какие-то основные моменты по пунктам.
Fi1osofFi1osofFi1osofА недавно зашел на какой-то ресурс, типа медиума, то есть оформлено так хорошо, читаю вроде как статью с полезной информацией, но не терзает меня ощущение, что я это уже читал. Вспомнил! Я это читал на гитхабе в одном тикете.
И вот эти сайты частенько лезут в ТОП, хотя контент у них не уникальный.
А сейчас вот мне для одного проекта понадобится много справочной информации, в основном просто как структура каталогов. Где мне ее искать? Да википедия вся бесплатно распространяется. И программы есть специальные для ее парсинга и чтения. Пойду-ка скачаю свежую версию википедии себе.
Короче, пока большинство думают как себе создать свои медийные ресурсы с «ценнейшей и уникальной информацией», идет такая волна, что всех накроет и смоет, они и не поймут ничего. И вот же незадача, поисковики совсем с этим не борятся! Какие плохие. Но вы тут держитесь.
А вообще эпопея с уникальным контентом длится со времен появления яндекса. У любого сеошника спросить, и я думаю они подтвердят, что уник по любому нужен и лучше неуника. Сколько фильтров всяких уже было, когда тысячи сайтов яндекс выкашивал за копипаст и бесполезность для юзеров. Обычно жалобные истории начинаются со слов, дескать, у меня был хороший сайт с полностью уникальными статьями, и… его забанили. Я не спорю, что копипасты полно в интернете, но если сайт успел завоевать популярность, его не забанят. В остальных случаях «молодняк» проходит кучу проверок, в том числе и на уникальность. Если робот сайта при обходе выясняет, что сайт на 100% состоит из копипасты, то зачем он вообще?
Fi1osofНу так они уже бренд) Мой копипаст не подвинет их первоисточник в поиске. И к тому же зарабатывают они не на информации, а на сервисе. Я то пытаюсь доказать, что мелким «лавочникам» в массе своей это невыгодно. Тем более, чтобы кто-то копировал их статьи по-тихому, без обратных ссылок. Если со ссылками, то совсем другой расклад. Наоборот писательство может стать возможностью прославиться.
Вы наверное не в курсе, что есть такие дорвейщики с которыми яндекс со времён своего существования борется) Это такие люди, которые ничего нового не несут в интернет, а тупо генерируют террабайты инфо-мусора, в том числе копипаста. За счёт которого нагоняют трафик, а потом монетизируют его разными способами. Если бы яндекс с ними не боролся, то количество информации в сети было бы существенно больше чем сейчас. Один дорвейщик это как вирус, который может производить сотни сайтов если это выгодно. А яндекс сделал так что это не выгодно, сделав кучу фильтров, в том числе и на копипаст.
Fi1osofFi1osofFi1osofFi1osofПожалуйста, копируйте.
Это вряд ли. Рамблер тоже о таком местал, но у него не получилось. Хотя мордокнига тоже пытается к этому прийти.
Именно так. Я современный тренд вижу в том, чтобы брать информацию там, где она есть, но представлена не в лучшем виде, и выводить так, чтобы пользователю было эффективней с ней работать.
Fi1osofНиколай пилите лучше дальше статьи по фронту и бэку. Я читал их у вас. А сейчас не понятно, что у вас на ресурсе. Получается типа доска объявлений.
И касательно фронта.
Имея продолжительный опыт с реактом, думали уйти от этого кривого конструктора в сторону angular или vue?
Fi1osofЕсли вы реакт называете кривым конструктором, то вы, видимо, его практически не знаете, хотя бы потому что это не конструктор. И у меня сейчас под рукой проект на ларке с вуи, мне есть на что ориентироваться. Нет, не хочу :)
Для расширения кругозора советую к прочтению.
И не пытайтесь здесь доказать сейчас обратное. Лучше запилите отдельную статью подробную с примерами.
Да кому мне что доказывать? Я не использую graphql, но я понимаю для чего он. Видимо мне просто хватает rest и тихонечко себе пилю на angular)
Но я больше интересовался статьями от вас. Типа с житейскими трудностями и реализацией их решения.
Fi1osofГоворю же, вы меряете классическими рамками. Сейчас, еще раз, грани размываются.
Что значит размываются грани? Т.е. мальчик\девочка, имеющий опыт только на клиенте, спокойно может лесть и в серверную часть? Ведь везде js.
Fi1osofЯ же говорил про статьи, ну реально мало статей в интернетах с бытовыми проблемами, а не статей с поверхностным описанием стэка) И потом вы сказали что мол все едино.
Позвольте с вами не согласиться. Если человек не знает что использовать — реляционную или нереляционную бд, то на выходе будет боль. И тем более как можно использовать туже postgresql не зная ее?
Я читал про graphql когда он появился. И если мне не изменяет память, он нужен для взаимодействия со всеми rest сервисами (причем на разных языках сделанные), которые используются, из одного места. Разве не так? А это по умолчанию много чего нужно уже знать, что бы все работало.
И кроме того знание js не означает что человек знает все области, если там есть js. Нынешний JavaScript — это в первую очередь инструмент. Который позволяет взаимодействовать с кучей чего — зная лишь один язык программирования.
Fi1osofНа уже на сегодня призма позволяет использовать MySQL, PostgreSQL, Amazon RDS и MongoDB, а так же скоро будет Эластик, кассандра и другие (частично уже они поддерживаются). Если бы я поменял настройку и использовал, к примеру, эластик, мои примеры выше бы не поменялись ни на байт. Все было бы то же самое. И не пугайте людей словами типа «реляционная»…
Чуть-чуть не так. Он позволяет взаимодействовать с чем угодно, и не только с REST-сервисами, но и отдавать данные из памяти, из файлов, из других graphql-сервисов и т.п. Можно создать очень широкую сеть из таких микросервисов, на конце которых будет куча различных непонятных технологий, которые совсем никак не беспокоят конечных клиентов. Те взаимодействуют с единым интерфейсом на единой технологии. Своего рода API-ORM.
Это по большому счету верно. Но в последнее время все менее и менее напрягает, как раз за счет унификации и развития микросервисов. К примеру, основная часть призмы (именно отдельного модуля, используемого в моей @prisma-cms), написана вообще на скала, и спрятана глубоко в докер-контейнере. Я там ни строчки не знаю. Я не знаю как она работает с БД (к слову, которая спрятана в другом докере, но не обязана быть именно там). А призма в целом использует кучу сторонних компонентов, включая graphql и apollo, и там намешано столько всего, что всех концов и не найдешь. Но их и не надо искать. Есть конечный продукт, написано как им пользоваться. Use as is и не лезь глубоко. Что-то работает не так — пиши багрепорт. К слову, призма очень оперативно работают с багрепортами.
Я бы сказал, что в чем-то, используя их, надо знать меньше, чем в MODX. Вот вам инструкция выше, в несколько строк, и у вас свое API готово. А теперь сравните с быстрым стартом в MODX.
Я лишь поинтересовался статьями, мнением по фронту. А потом вы такой — все едино!
А то получается, что так же и не плохо бы про масштабирование, кластеризацию знать, виртуализации там всякие, тестирование, оптимизация, unix системы, а пусть еще haproxy, nginx, балансировка трафика, vlan, сетевое оборудование — кстати уже и сис админ выходит. А всем известно что сис админы ничего не делают, посему и завхоз позицию может совмещать. Еще полы мыть и после выходить в ночную смену сторожем.
Кстати, только сейчас понял, prisma-cms это ваш продукт?
Ну а что касается очередной ORM. Ну я хз, призму не использую. Все как то sequalize да sequalize.
Fi1osofЯ понял ваш намек:) Давайте так, чтобы было более конструктивно, я на днях напишу статью с примером изоморфного приложения, и там мы уже разберемся предметно, где грани стираются, а где непреодолимые стены.
Fi1osofЯ knex юзаю, но это не совсем относится к делу.
Fi1osof1. Быстрый и классный магазин дополнений, куда каждый может загрузить свой компонент modstore.pro.
2. Мега удобный и быстрый хостинг modhost.pro
3. Свободная и обновляемая документация docs.modx.pro
4. Кладезь полезной инфы (при условии навыка использования поиска) modx.pro
На всей этой экосистеме выросло немало компонентов, как платных, так и бесплатных. Построено много сайтов, в том числе и крупных интернет-магазинов. Компонент pdoTools, который можно сказать, заставил сердце MODX биться снова.
Все это в той или иной степени работает на MODX или для MODX. Я не спорю, что в том или ином месте он не удобен, устарел и т.д. Есть тот же октобер, если хочется гнаться за новинками. Василий и КО — все это построили и держат на плаву без длинных статей о том, что где-то, что-то устарело. И это яркий пример того, что люди не просто пишут длинные посты о том, какие они крутые разработчики, а работают и дают людям ресурсы, которыми люди пользуются.
А вот что есть у вас, пока мало понятно, но интересно. Я думаю, раз уж вы решили строить свою империю, то для начала, нужно построить хотя бы её столицу. И когда вы сделаете годный инструмент, которым захочется пользоваться, можно будет считать подобные статьи с куда бОльшим интересом.
Ну а пока что, повторюсь, экосистема modx.pro живее всех живых.
P.S.
Скорость модкс-клаба действительно впечатляет!
Fi1osofВозникла одна задачка, которую я никак не могу преодолеть. При обращении по УРЛ в массив notes заносятся данные, скажем ИД и время +30 мин после обращения (скажем сейчас 12:00, тогда в массив пишем 12:30). Далее я запускаю setInterval и каждую секунду перебираю массив notes. Примерно так:
Если время сейчас и время в массиве совпадает, то выполняем действие. И вот тут как раз проблема — если действие нужно выполнить через 1-5 мин после обращения, то действие выполняется, а если через 30 или 60 мин, то нет. Хотя очень редко бывает, что и выполняется, но 1 из 20 раз, примерно. Уже перегуглил все что можно. Не подскажете куда копать по данному вопросу?
Нигде не могу найти ответа по поводу данного поведения — хочет срабатывает, хочет не срабатывает.
Fi1osofJS — это совсем не быстро. Даже я, когда уже плотно занялся им, только через год минимум почувствовал себя боле менее уверенным в нем. Но и до сих пор очень много белых пятен. JS слишком объемный и не однозначный, это вам не php.
И особенно тем, кто привык в php, с ним очень сложно по началу. Дело в том, что в php у нас все последовательно выполняется, а в JS по умолчанию многие вещи параллельно выполняются. Даже попытка понять что из этого sync, а что async (то есть параллельное или последовательное) — это причина появления множества разъясняющих и спорных статей.
В вашем случае, я бы советовал, во-первых, заюзать momentjs и вот почему:
Давайте выполним вот такой код:
Что мы здесь получим? 01? Неправильно. Получим 1. А вы случаем, не ожидаете «12:01:11»? Я вот не вижу у вас каких-либо попыток преобразовать данные.
В случае с момент вы получите console.log(new moment(«2018-09-12 12:01:11»).format(«HH:mm:ss»)) === «12:01:11».
Во-вторых, я бы не интервал ставил бы на перебор массива, а перебрал бы сразу массив и задал нужные тайминги.
Время для выполнения действия я получаю вот так:
Конечно если сейчас 12:01, мы добавляем минуту, то выходит вот так 12:2. Но действие все равно выполняется, если интервал небольшой (что странно). Я грешил на этот момент, но как выяснилось приведя время в формат 12:02, то есть с 0, все равно таймер не отрабатывает. Даже если попадаем через 30 мин на 12:45 все равно не работает. Кстати, дело не в формате времени, так как при использовании функции setTimeout() все равно не работает если поставить интервал в 30-60 мин.
Может у меня просто «жизненный цикл» ноды умирает? Сколько вообще живет нода после обращения к ней? Вот описания «поведения» node.js я пока не нашел. То есть в пыхе все понятно, сделал запрос, код отработал и умер, а в ноде как? Сколько живет «процесс» или он вообще не умирает, а в каких случаях умирает, а как сделать чтобы работал постоянно и тд, а что влияет на жизненный цикл процесса. Это все для меня пока загадка.
Fi1osofНе занимайтесь магией и лишней арифметикой. Абсолютно точно, что строковое «01:1» не равно «01:01». Если у вас срабатывает, значит у вас с той стороны прилетает «01:1», а не «01:01». Это еще один аргумент в пользу того, чтобы использовать moment, потому что даже в случае таких расхождений в форматах, он приведет вам к единому формату.
И попробуйте у себя в цикле, где сравнение происходит, вывести
И попутный совет: старайтесь избегать неточных сравнений ==, используйте === и следите за форматами данных, это очень важно в JS. Прям через силу себя заставляйте. Иначе намучаетесь.
Про жизненный цикл: если node-процесс умер, то он умер. И такого не должно быть, если процесс изначально планировался, что будет работать постоянно. К примеру, если говорим про работу сервера express или типа того, то процесс должен работать. Вот как раз в прошлом топике был пример, что сайт разваливался. С тех пор он не разваливался, uptime 2 дня.
App name │ id │ version │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
├───────────────┼────┼─────────┼──────┼───────┼─────────┼─────────┼────────┼─────┼───────────┼─────────┼──────────┤
│ front │ 0 │ N/A │ fork │ 14248 │ online │ 0 │ 2D │ 0% │ 25.1 MB │ fi1osof │ disabled │
│ server │ 7 │ N/A │ fork │ 17570 │ online │ 42 │ 2D │ 0% │ 25.3 MB │ fi1osof │ disabled
На городских банях у меня процесс месяцами висел.
Вот эти таблицы — это используется pm2
В целом у него все просто с запуском, например pm2 --name myProcessName start js-script
С запуском npm с параметрами чуть сложнее, но ненамного, к примеру, был npm run myScript, pm2 это
pm2 start npm — run myScript
Спасибо вам за советы.
Fi1osofНе за что.