• Что лучше для серьезной CRM: Vue или React?

    Антон Спирин,
    Глянь на css-modules и на scoped. Ну ведь удобнее и более читаемо, чем то, что вы привели в пример. В модулях, конечно, остаются селекторы, но они несут роль идентификации данного набора стилей. Ну и плюс как вы в вашем подходе сможете препроцессоры воткнуть без потери изящности?

    Ну и теги - это просто способ разделения того, что очень сложно было бы объединить в одном файле как-то по-другому сохранив при этом читаемость. Плюс эти теги дают возможность добавить доп. информацию сборщику и IDE, чтобы они корректно обработали то, что внутри (lang="stylus", src="external-file"). Повторюсь, никто не заставляет использовать такие компоненты, можно всё хоть точь-в-точь как в вашем примере сделать. Просто зачем, если так удобнее?
    И никто не заставляет делать отступы - нет ничего криминального в том, чтобы делать в каждой части компонента (script, template, style) нулевой отступ у корневых элементов.

    Лично у меня, после того как я впервые увидел стектрейс темплейтов в vue, чуть глаза не закровоточили

    Допускаю, что когда-то такое было, не помню/не знаю. Сейчас в devtools браузера мне за редким исключением вполне понятно, в каком месте ошибка. Это при том, что я ещё и pug использую, который может свои ошибки выдавать.
    Кстати, о devtools: у vue плагин для браузера просто прекрасен, рекомендую. Реактовский тоже неплохой, но у vue он и выглядит поприятнее, и пофичастее будет.

    Если вы закрываете глаза на подобные недостатки, то вынужден вас огорчить вы 100% евангелист

    Да, я 100% евангелист vue и это моё осознанное состояние, которое совсем меня не огорчает :)
    Только я упустил этот момент - а на какие недостатки я глаза закрываю?

    Ага, например Fiber.

    А что Fiber? Что он даёт с практической точки зрения?
    Если говорить о некой абстракции над DOM, то у vue она тоже есть. Если говорить об абстракции стэка вызовов и асинхронный рендеринг, то тут не очень понятно, зачем мне это нужно (хотя я и не отрицаю, что это крутая штука).

    Ни один фреймворк не идеален. У каждого из них есть ряд недостатков. Лучшего нет. Это всего лишь инструменты

    Согласен. Я вот, например, angular не стал сравнивать с ними - он просто другой, у него другая сфера применения, это, в конце концов, другой инструмент. А вот vue и react сравнивать вполне корректно, потому что они во многом похожи. Но только vue умеет больше, при этом не принося в жертву ничего, а только привносит какие-то дополнительные возможности и улучшения.

    Хотя бы использовать такие фразы как: "на мой взгяд", "я считаю", "имхо", "я бы лучше потратил время на X, потому что я считаю, что..." и прочее

    Всё, что я говорю - это моё личное мнение, это и так очевидно.

    На самом деле я не хотел бы холиварить и прошу прощения, если задел за живое. Просто у меня сложилось именно такое мнение, и оно базируются на моём же личном опыте.
  • Что лучше для серьезной CRM: Vue или React?

    Слава КПСС, пока вакансий больше. А зарплаты примерно одинаковые.
    Вы просто не забывайте, что и спецов на реакте больше, поэтому соотношение количества вакансий и количества специалистов (читай: конкуренция) должно быть примерно одинаковым. Но рынок на месте не стоит и... в общем, помяните моё слово :)

    Антон Спирин,
    Список объективных аргументов, пожалуйста.

    1) Однофайловые компоненты. Но постой, не кидай в меня помидорами, разделять код там тоже можно, однофайловые компоненты только называются так, никто не навязывает всё писать в одном файле:
    <!-- разделяем всё что угодно внутри vue-компонента -->
    <script src="external-file.js"></script>
    <style lang="stylus" src="external-file.styl"></style>
    <template lang="pug" src="external-file.pug"></template>

    1.5) vue-loader. Просто почитай, что он умеет. Это в продолжение предыдущего пункта, можно сказать.
    2) Многойфайловые компоненты. Да, можно писать компоненты и как простой js. Можно даже прикрутить jsx и будет почти как реакт. Можно даже прикрутить компоненты-классы на ts и будет почти как ангуляр. А можно просто писать однофайловые компоненты и понять, что это очень удобно. И да, там тоже можно ts прикрутить, что для многих очень важный пункт.
    3) Functional компоненты. Реакт оказывается уже есть внутри vue, оухеть :)

    На самом деле много чего ещё сказать можно, но список большой получится. С удовольствием его написал бы, но вряд ли это кому-то нужно, да и простым "react vs vue" в гугле можно многое разъяснить.
    Просто в целом у vue как минимум есть всё то же самое, что и у реакта, НО не наоборот. Где-то получше, где-то поудобнее, где-то так же, но нигде - хуже. Я просто сделал логичный вывод, что не хочу использовать пусть даже хорошую технологию, когда есть другая, которая лучше первой. И, повторюсь, я не засираю реакт. Попробуйте правильно понять мою мысль. Я всего лишь делаю логичные выводы из того, что вижу.
  • Как сделать авторизацию у SSR приложения?

    изначально я пробовал ваш вариант на firebase


    Не было у меня такого варианта, вы с кем-то меня путаете)

    В это время пользователь видит "войти" и всё остальное меню для разлогиненого пользователя.


    Так отдавайте прелоадер, в чём проблема-то, очевидное же решение)
    У меня, например, очень просто сделано - во vuex store лежит поле user и action fetchUser, который вызывается в mounted корневого компонента (то есть только на клиенте). Поле user может иметь одно из 3-х вариантов значений: null (при инициализации стора), false или объект юзера. fetchUser устанавливает либо false (если нет токена, токен протух, юзер удалён - короче, все случаи, когда юзер не залогинен), либо объект юзера (соответственно, если юзер залогинен). Дальше очень просто:
    <div v-if="user === null">Обожди, думаю я...</div>
    <div v-else-if="user === false">Сюда можно только авторизованным пользователям</div>
    <div v-else>Привет, {{ user.name }}!</div>


    На приватной странице поставил проверку на авторизированного пользователя, и в случае его отсутствия редирект на логин. Естественно при перезагрузки приватной страницы всегда идёт редирект, даже если ты залогинен, т.к. пользователь не успевает инициализироваться на клиенте (1,5-2 сек.)


    Ну, во-первых, нахер вообще юзера куда-то отправлять на другу страницу? Ему же можно прямо на той же странице показать форму, не надо редиректить никуда. Как это сделать - в моём предыдущем комменте написано. Ну и даже если вдруг ну никак без редиректа не обойтись - пожалуйста вам вариант с fetchUser:
    {
        mounted() {
            fetchUser().then(user => {
                if (user === false) this.$router.replace('/login');
            });
        }
    }


    В итоге самым правильным способом я посчитал тот, который вы описали последним


    Ну и очень зря, потом сами же с ним намучаетесь.
  • Как сделать авторизацию у SSR приложения?

    Никита Котенко, а почему нельзя редиректить на клиенте, что в этом плохого?)
    Ну и на самом деле редиректить вообще, возможно, не надо. Можно просто сделать страницу с вложенным роутером, на которой показывается форма для входа, если нет юзера. Если юзер есть - просто выводить router-view, который покажет вложенные страницы.

    Ну и если нужно ни жить ни быть рендерить закрытые страницы, то просто пихаете токен в сессию, а потом в точке входа для сервера из сессии пробрасываете нужные заголовки из кук в axios.
  • Как сделать авторизацию у SSR приложения?

    Никита Котенко, просто фетчите данные юзера после загрузки страницы только на клиенте, с сервера можно (например) отдавать прелоадер какой-то
  • Как правильно сохранить модель в Laravel?

    Только здесь как бы лишний запрос выполняется на вытягивание поста, так что это не самый оптимальный вариант.
    Можно первый параметр заменить на int $postId, а при сохранении коммента тогда есть 2 аналогичных способа привязать этот id к нему:
    $comment = new Comment($req->all()); // если что, у коммента можно определить $fillable, чтобы не париться с определением списка полей в контроллере
    $comment->post_id = $postId;
    // или
    $comment->post()->associate($postId);
    $comment->saveOrFail();


    Если в миграциях нормально настроены внешние ключи, то при несуществующем $postId saveOrFail будет ругаться.
  • Как правильно реализовать работу с пользователем в изоморфном js приложении?

    Роман, я не знаю, как это сделать лучше в реакт, но на vue у каждого компонента vue есть т.н. lifecycle hooks. Как минимум 2 из них вызываются только на клиенте - beforeMount и mounted. То есть ничего проверять не надо, просто пишем код в тех местах, которые в принципе выполняются только в браузере.

    С состоянием понимаю проблему. На примере загрузки данных пользователя я решал это примерно так: у поля user в хранилище может быть 3 значения - null, false или, собственно, объект юзера. По умолчанию значение null, то есть как бы неопределённое. Если анонимус, то user = false.

    Ну и на сервере, получается, мы просто рисуем всякие спиннеры или вообще ничего не рисуем. На клиенте уже ждём подгрузки данных и реагируем на это.
  • Как быть с long-polling в SPA?

    Не то что бы это решает данную проблему, но лучше для таких вещей или реальный long polling сделать (потому что в коде просто отправка запроса по таймауту, это не long polling), или ещё круче через websocket. И открывать одно соединение, а не на каждый объект отдельный запрос отправлять.
  • Зачем нужен express.js?

    Ну просто надстройка над http с роутингом удобным. Сравни доки экспресса и модуля http. Букав и там, и там немного, так что в комментариях это расписывать смысла нет :)
  • Как написать такой запрос средствами laravel eloquent?

    Да, можно. Или через метод leftJoin сделать такой же запрос, или методом withCount('relationName') (не уверен, что метод именно так называется, но что-то в этом роде), которая добавит к модели атрибут с количеством, но запустит отдельный запрос для подсчёта.
  • Как получить несколько моделей в Laravel 5?

    $pagination = new LengthAwarePaginator(
        $collection->slice(0, 10), // кусок коллекции для текущей страницы, 10 элементов для примера
        $collection->count(), // общее количество элементов
        10, // максимальное количество элементов на одной странице
        1 // номер текущей страницы
    );


    Не очень понимаю, правда, в чём проблема просто посмотреть документацию к классу по ссылке выше или вообще исходники. Там всё максимально очевидно.
  • Как получить несколько моделей в Laravel 5?

    А, ну ясен хрен, paginate из коллекции и не должен работать. Это метод запроса. Я же написал, что нужно пользоваться классом LengthAwarePaginator напрямую, то есть вручную создавать экземпляр и в конструктор среди прочего передавать кусок коллекции для текущей страницы.
  • Как получить несколько моделей в Laravel 5?

    Вряд ли я смогу помочь, если не узнаю, какую ошибку :)
    Ну а так он любую коллекцию или массив хавает.
  • Test laravel framework?

    Тогда как объяснить, что hasMany строит связь только на основе 3-х параметров - связанная модель, внешний ключ и исходный ключ? Для связи многие-ко-многим здесь не хватает промежуточной таблицы.
    belongsToMany - это не инверсная связь. Она одинакова для обеих связанных моделей, и так и должно быть. Инверсные по отношению друг к другу - hasMany/hasOne и belongsTo.
  • Test laravel framework?

    Не совсем. У модели категорий нужно использовать `hasMany` вместо `belongsToMany`

    hasMany - это если связь один-ко-многим, а тут многие-ко-многим, так что всё правильно.
  • Как переписать аутентификацию в Laravel?

    pemi: в ядре ни в коем случае нельзя ничего трогать. Любой класс ядра можно унаследовать и переписать под себя как угодно. Как это сделать - можно почитать в документации. Там не совсем полная информация, правда, но общее представление можно получить, а дальше гугл в помощь - на все вопросы уже давно есть ответы.
  • Как реализовать частичный рендер на Vue.js?

    Ещё и в консоли браузера предупреждение пишется, если vue подключен как модуль и если не включен NODE_ENV=production.
  • Как расширить BladeCompiler в Laravel?

    terehinis: Вообще, если используете Laravel 5.4, то там есть т.н. компоненты. Возможно, они спасут ситуацию - в них можно будет инкапсулировать всю логику, о которой вы говорите, и выводить разный контент в зависимости от внешних условий.

    Но я вам точно говорю: директивы - это не путь. Остановитесь, пока не поздно, иначе потом намучаетесь с этим. Как я и сказал, директивы в Blade призваны решать абсолютно другой ряд задач, не нужно пытаться забить гвоздь отвёрткой. Вы, конечно, его забьёте, но сколько усилий для этого понадобится :)

    Касаемо замены стандартных классов, в частности BladeCompiler:
    • пишите свой класс, опционально наследующий нужный вам системный (скажем CustomBladeCompiler, наследующий BladeCompiler);
    • в AppServiceProvider (ну или в любом другом провайдере, можно отдельный под это создать) заменяете через $this->app->singleton/bind/... старую зависимость на новую (вот как это сделано в Illuminate\View\ViewServiceProvider: joxi.ru/L21d0N1CXGexmX ).


    Но я снова призываю так не делать в вашем случае :)
  • Как расширить BladeCompiler в Laravel?

    terehinis: я почти уверен, что что-то вы делаете не так. Директивы в принципе не задуманы, как средство для вставки кусков кода в шаблон, только разве что для каких-то совсем общих случаев типа вставки атрибута времени в тег time. То есть как бы вы теперь ни поступили - вы будете делать адский костыль. Если, конечно, не измените подход.
    "Модулем", я так понимаю, вы обозвали blade-файл?