• Реально ли заменить gulp на vite?

    bingo347
    @bingo347
    Crazy on performance...
    Есть сборщик gulp
    То что под gulp есть сборщики не делает сам gulp сборщиком. Gulp - task runner, запускалка задач. То есть сборщик под капотом может быть любой, хоть тот же vite.
    Теперь про vite, основная его фишка - это ускорение dev сборок и за счет этого ускорение самого процесса разработки. Достигает он это за счет того, что по сути не собирает Ваши исходники, а только применяет к ним трансформации, хотя зависимости все же собирает с помощью esbuild. При этом для прода вся сборка переадресуется на rollup. И то что в dev и в prod у Вас будут по сути разные сборщики изредка приводит к багам, которые воспроизводятся только в prod сборках. Rollup надо сказать тоже не идеален и на больших проектах порой ломает код, хоть и редко.
    Тут мое ИМХО и не более
    Rollup для сборки библиотек.
    Webpack для сборки конечных приложений.
    Vite интересен скорее интегрированным в него vitest, который позволяет писать unit тесты ближе к логике (привык я к хорошему в Rust).

    А по факту, смена сборщика чревата ошибками, сильными изменениями в структуре проекта и прочими подводными камнями.
    Если вопрос "стоит ли переезжать" появился только из hype-driven-development (погоней за модой по-простому), то ответ однозначный - нет, не стоит.
    Если же текущая сборка накладывает на Вас сильные ограничения и борьба с этими ограничениями занимает очень много времени, настолько, что потенциальные проблемы от смены сборки скорее всего займут времени меньше, то да, стоит переезжать.
    Ответ написан
    1 комментарий
  • Как прижать footer к низу страницы, перебробовал все способы?

    @karminski
    Senior React.JS Developer
    Это элементарно гуглится
    Ответ написан
    Комментировать
  • Как запретить тексту увеличивать размер flex-элемента?

    Get-Web
    @Get-Web Куратор тега CSS
    Front-End Developer
    min-width: 0; добавить к item2
    Ответ написан
    Комментировать
  • Почему forEach выдает разные результаты?

    Stalker_RED
    @Stalker_RED
    a.a+=1 сработает.
    Вы в первом случае меняете значение a.a (больше однобуквенных названий, давайте добавим в мире путаницы!)
    во втором просто складываете его значение с единицой и никуда это значение не применяете.
    let x = 3 // x=3
    x++ // x=4 инкремент
    let y = x + 1 // y=5, x=4 все еще 
    x += 2 // x=6
    Ответ написан
    Комментировать
  • Почему forEach выдает разные результаты?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    если коротко и не совсем корректно, то
    a++ это a = a + 1
    a+1 это ничего. Потому что нет присваивания.

    P.s. не совсем корректно потому что
    a++ не то же самое что a = a+1, потому что a++ вернёт текущее значение а потом его инкрементирует:
    var a = 1;
    console.log(a++) // 1
    // тут же ещё раз выводим а без инкремента\сложения
    console.log(a) // 2
    a = a +1
    console.log(a) // 3
    Ответ написан
    2 комментария
  • Как правильно подходить к возвращаемым типам функциях php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Хорошие вопросы.
    Разумеется, увеличивать количество запросов к БД ради красивой типизации - это абсолютно не вариант.

    Как можно увидеть, в приведенной цитате написано не однозначно, а "скорее всего".
    И поэтому надо конечно стараться, чтобы функция возвращала какое-то одно значение, но не делать этого любой ценой. Поэтому getUserDataFromDatabase вполне может возвращать array|false, а getUserIdFromDatabase - int|false, хотя я бы с ней не заморочивался, первой вполне достаточно. А userIsPresentInDb вообще не нужна, вместо неё можно использовать одну их предыдущих.

    Другое дело, что нужного результата можно добиться и другим способом.
    Ведь вполне можно вернуть пустой массив. И таким образом формально соблюсти типизацию.

    return $result ?: []; // дёшево и сердито

    Но это будет всё равно не очень красиво. В одной стороны - да, для проверки, вернула ли функция непустое значение, такой вариант вполне сгодится. Но с другой стороны все равно как-то неаккуратненько. Ведь мы на самом деле ждём не абы какой массив, а вполне определённый, с конкретным набором полей. То есть, если эта функция вернет массив вида [0, 42, 100500], то это будет явно не то, что нам нужно, но при этом типизация и слова поперёк не скажет.

    Если думать от типизации, то функция getUserDataFromDatabase, возвращающая какой-то абстрактный массив - это нонсенс, бессмыслица. Эта функция должна возвращать юзера. Поэтому в идеале надо придумать способ указать, что функция возвращает не абстрактный, а конкретный массив определенного формата. Тем более, что такой способ как раз есть, ведь типизованный массив - это же объект! И для данного случая даже специальный паттерн есть - ValueObject (хотя в случае с пользователем лучше будет все-таки делать полноценный класс, содержащий не только данные, но и методы, например auth(), который сравнивает хэш пароля с введенным).

    Соответственно, в идеале функция должна возвращать объект, представляющий пользователя.

    И уже в этом объекте поле id может либо либо быть нулём, либо иметь какое-то положительное значение. Или даже объект может содержать отдельное свойство, заполнен/не заполнен.

    И вот в этом случае типизация заиграет совсем новыми красками, и будет использоваться на 100%
    function getUserFromDb( int $userId ) : UserObject {
            return $result ? UserObject::fillFromArray($result) : new UserObject();
    };
    $user = getUserFromDb();
    if (!$user->id) {
        // нинашли :'(
    }


    Но опять же, как пишет ниже Сергей delphinpro, зависит от задачи.
    И решив проблему правильной типизации значения, которое функция вернет, если нашла пользователя, можно вернуться к вопросу о том, что возвращать, если функция ничего не нашла. И в этом случае вполне подходящим вариантом будет вернуть null
    function getUserFromDb( int $userId ) : ?UserObject {
        return $result ? UserObject::fillFromArray($result) : null;
    };
    
    if ($user = getUserFromDb()) {
        // нашли :)
    }
    Ответ написан
    6 комментариев
  • Как сделать сделать поиск по строке php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    stripos и strpos работают правильно

    А если вам вдруг кажется, что они работают неправильно, то надо привести пример.
    И тогда вам сразу объяснят, что вы делаете неправильно
    Ответ написан
    4 комментария
  • Почему не срабатывают свойства background?

    Lynn
    @Lynn
    nginx, js, css
    https://developer.mozilla.org/ru/docs/Web/CSS/back...

    Сокращённое CSS свойство background устанавливает сразу все свойства стиля фона


    Используйте в атрибуте style свойство background-image.
    Ответ написан
    Комментировать
  • В IE не работает mask-image, что делать?

    Делай на IE что-то по проще, без mask-image.
    Ничего плохого не случится, если пользователи IE получат не тот сайт, который задумал дизайнер.
    Ответ написан
    Комментировать
  • Как написать цикличный таймер?

    Stalker_RED
    @Stalker_RED
    Напишите список ваших задач, или периодов, или как их там. В них храните либо длительность, либо время начала и окончания, как вам удобнее.

    Напишите ОДИН setInterval, который сравнивает текущее время со временем старта или конца ваших периодов.

    Конструкции типа time-- идут лесом.
    Потому что и setInterval и setTimeout не гарантируют время срабатывания. Они работают "не раньше чем", а позже - запросто. Только хардкор: const now = new Date() на каждом тике таймера.

    Всякие циферки для отображения вычисляются из разницы между now и start или end, математика простейшая.
    Ответ написан
    Комментировать
  • Как написать условие - диапазон вне диапазона?

    Stalker_RED
    @Stalker_RED
    (x<a && y<a) || (x>b && y>b)
    То есть обе границы первого диапазона меньше, или больше, чем границы второго.
    Если известно, что x всегда меньше, чем y, то можно короче
    y<a||x>b
    Ответ написан
    3 комментария
  • Где JWT хранит свой токен на сервере?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Серверу не надо хранить рабочий JWT. Он просто берёт две первые части токена, вычисляет подпись, сравнивает с расшифрованной подписью токена и убеждается, что токен настоящий.
    Ответ написан
    Комментировать
  • Как результат foreach поместить в переменную?

    kawabanga
    @kawabanga
    $itemstest[] = [
                    'item_sku' => $product->get_sku(),
                    'item_title' => $product->get_name(),
                    'item_quantity' =>  $item_data['quantity'],
                    'item_price' => $product->get_price()
                ];
    Ответ написан
    2 комментария
  • Как стилизовать только пустой SELECT в CSS?

    MrDecoy
    @MrDecoy Куратор тега CSS
    Верставший фронтендер
    Через css, пожалуй только с помощью :not(:has) - браузерная поддержка не полная. Проверяйте перед использованием.
    Либо поправить шаблон чтобы не было переноса строки внутри пустого селекта, тогда будет работать :empty.



    Иначе только на js обходить селекты, возможно через mutation observer и накидывать нужный класс для стилизации
    Ответ написан
  • Как восстановить файлы после reset --hard?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Восстановить очень легко, так как гит ничего не удаляет из репозитория, по крайней мере сразу.
    Команда reset лишь переместила указатель ветки. Полностью удалить что-то крайне сложно.
    Вы можете посмотреть через git reflog где был указатель до этого и вернуть его туда обратно.
    git reset --hard HEAD@{1}
    Данная команда вернёт ветку на состояние, помеченное на вашем скрине как HEAD@{1}
    Либо можно скопировать непосредственно sha-хэш места, куда хотите вернуться.

    Затем повторить отмену последнего коммита, но уже правильно:
    git reset HEAD~1
    Такая команда не будет изменять рабочий каталог, а значит ничего из него не удалит.
    Ответ написан
    1 комментарий
  • Как не дать права на SELECT?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это называется "доступ по API".
    Вместо прямого соединения с БД, "скрипт" отправляет запросы на удаленный веб-сервер, причем не SQL запрос, а какой-нибудь JSON. А уже приложение на веб-сервере соединяется с БД и отправляет запрошенные данные назад.
    Это приложение будет и ключ проверять, и права доступа - какому пользователю какие данные можно отдавать.
    Именно по такой схеме например работают мобильные приложения в вашем телефоне.
    Ответ написан
    Комментировать
  • Как скрыть строку *?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    mb_substr($string, 0, 2) . str_repeat('*', mb_strlen($string) - 3) . mb_substr($string, -1)
    Ответ написан
    3 комментария
  • Почему ПК фризит на логотипе материнской платы, если вставлен USB модем?

    @Loggus66
    Идёт опрос загрузочных устройств, в т. ч. флэшек, и модем тормозит с отдачей содержимого своего диска. Я б предложил по возрастанию сложности идей: вытащить оттуда SD-карточку/перешить AT-командами в "только модем", или как-нибудь из интерфейса драйвера это сделать/купить USB-хаб с выключателем порта и отключать уже его.
    Ответ написан
    Комментировать