• Как оптимизировать сайт под большие экраны?

    Aetae
    @Aetae
    Тлен
    Все ребята с большими экранами давно научились нажимать Ctrl++. Если ты хочешь тупо такое же масштабирование, то не надо*.

    Смысл что-то делать есть только если настоящий дизайнер разумно что-то придумает специально под такой масштаб.

    * Если очень хочется, то немного математики + transform: scale + изменение ширины скроллбаров, но результат будет - херня.:)
    Ответ написан
    Комментировать
  • Как добавить готоую форму amoCrm в Vue3?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Я хз что такое AmoCrm, но если надо тупо добавить не-vue скрипы как vue-компонент, то как-то так:
    import { ref, h } from 'vue';
    
    function loadScript(options, root = document.head) {
      return root.appendChild(Object.assign(document.createElement('script'), options));
    }
    
    const Comp = defineComponent(() => {
      const root = ref(null);
    
      onMounted(() => {
        loadScript(
          {
            innerHTML: `
          !(function (a, m, o, c, r, m) {
        (a[o + c] = a[o + c] || {
            setMeta: function (p) {
                this.params = (this.params || []).concat([p]);
            },
        }),
            (a[o + r] =
                a[o + r] ||
                function (f) {
                    a[o + r].f = (a[o + r].f || []).concat([f]);
                }),
            a[o + r]({
                id: "....",
                hash: "....",
                locale: "ru",
            }),
            (a[o + m] =
                a[o + m] ||
                function (f, k) {
                    a[o + m].f = (a[o + m].f || []).concat([[f, k]]);
                });
    })(window, 0, "amo_forms_", "params", "load", "loaded");
          `
          },
          root.value
        );
        loadScript(
          {
            id: 'amoforms_script_...',
            async: 'async',
            charset: 'utf-8',
            src: 'https://forms.amocrm.ru/forms/assets/js/amoforms.js?...'
          },
          root.value
        );
      });
    
      return () => h('div', { ref: root });
    });
    Ответ написан
  • Как запустить реакт код без локального сервера или как его получить?

    Aetae
    @Aetae
    Тлен
    Забудь о фронте без локального сервера. Это время ушло.
    Сейчас для локальных файлов столько ограничений, что работать с этим даже на чистом html уже толком невозможно.
    Ответ написан
  • Для чего мемоизируют аутентификацию?

    Aetae
    @Aetae
    Тлен
    На самом деле useMemo нужен, чтобы при передаче значения как prop в низлежащий memo компонент не происходила перерисовка оного если не было изменений(+при передаче как зависимость в другой хук, тот не срабатывал заново).
    Стоит упустить хотя-бы одно место требующее useMemo и пойдёт водопадом перерисовка на каждый чих каждого компонента по всему дереву вниз. И именно это является основной причиной тормозов в React, а не какие-то там мифические сложные вычисления.

    Официальная позиция React: "говнокодь сейчас, оптимизируй потом", действительно предполагает использование useMemo "только в узких местах" и нигде больше. Прикол в том, что с таким подходом при разрастании проекта никакого "узкого места" просто нет, тормозить начинает просто потому, что складываются тысячи микротормозов от тысяч перерисовок тысяч компонентов: наступает то самое "потом" и тут придётся переписывать с useMemo чуть ли не весь проект, чтоб снизить эти тормоза.
    Именно по этому в реальной работе useMemo стараются таки использовать заранее в каждом месте, где оно потенциально нужно. Некоторые радикальные философии вообще предполагают использование useMemo просто всегда, без исключений.:)
    Ответ написан
    3 комментария
  • Видит ли работодатель мой трафик?

    Aetae
    @Aetae
    Тлен
    Выше ребята не упомянули ещё один момент: зачастую для работы с внутренней сетью в месте с VPN прилетает и свой DNS. Т.е. если даже весь трафик не идёт через vpn, а только рабочий - работодатель всё равно видит какие DNS запросы ты делал, т.е. имена посещаемых сайтов(без полной ссылки - только домены).
    Соответственно если в рабочее время от тебя запросы только на youtube да 9gag то можно сделать выводы.:)

    Занимается ли этим шпионажем работодатель на самом деле - это уже другой вопрос.
    Ответ написан
    2 комментария
  • Не получается подключить js файл через CDN, в чём может быть проблема?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Как надо: открываешь ссылку с библиотекой(например https://unpkg.com/tictic@0.1.0/) руками и находишь там версию UMD или без специальных пометок - это именно та что тебе нужна.
    ***
    ESM/ES/ES6 версия - это версия на модулях, её можно использовать только внутри script type="module" через import(никаких глобальных вызовов).
    CJS версия - это версия на Common JS, старого стандарта Node js, в браузере ты её использовать не сможешь без специального загрузчика.
    ***
    После этого копируешь себе ссылку убирая из неё /browse.

    В данной конкретной библиотеке НЕТ версии для обычного подключения через скрипт. Тебе остаётся либо использовать модуль, либо использовать систему сборки фронтэнда(vite, webpack, rollup, gulp...), либо отказаться от неё.

    P.S. С модулями оно будет выглядеть примерно так:
    <script type="importmap">
      {
        "imports": {
          "tictic": "https://unpkg.com/tictic@0.1.0/esm/index.js",
          "tslib": "https://unpkg.com/tslib@2.6.2/tslib.es6.js"
        }
      }
    </script>
    
    <script type="module">
      import { getDate } from 'tictic';
    
      console.log(getDate({}));
    </script>

    Как видишь тут пришлось добавить ещё и tslib, т.к. у tictic от неё зависимость, хорошо что только одна. Зачастую зависимостей целая куча и проще таки использовать системы сборки, чем все их прописывать руками.
    Так же стоит помнить что модули - это только для современных браузеров.
    Ответ написан
    Комментировать
  • Как компонент реакта понимает, что к нему привязали хук?

    Aetae
    @Aetae
    Тлен
    Простой ответ: глобальные переменные.:)
    React просто перед самим запуском устанавливает глобальную (условно) переменную указывающую на текущий исполняющийся компонент, на которую и смотрит в сою очередь хук. Именно потому хуки нельзя использовать вне компонента.
    Вот тут я упрощённо изобразил, что дальше происходит внутри useState.

    Конечно всё намного сложнее, но основная суть именно такова. Подробнее - уже в исходники.
    Ответ написан
    2 комментария
  • Почему берет одну запись по селектору?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Для самого свежего хрома можно обойтись css:
    [role="row"]:has(.fraud) {
      background-color: #f1f7bc;
    }

    Для иных браузеров можно использовать такую извращенную классику(с оговорками):
    [role="row"] {
      position: relative;
      background-color: transparent;
    }
    [role="row"] .fraud::before {
      content: "";
      display: block;
      position: absolute;
      z-index: -1;
      top: 0;
      bottom: 0;
      left: 0;
      right: 0;
      background-color: #f1f7bc;
    }


    Ну либо использовать MutationObserver и следить за появлением новых [role="row"].
    Ответ написан
    Комментировать
  • Возможно ли на собрать такой блок на css, но что бы он тянулся в зависимости от содержимого?

    Aetae
    @Aetae
    Тлен
    Просто делаешь примитивную svg-картинку бэкграундом или встроеенно и растягиваешь на весь размер блока.

    Если хочется извращений - можно псевдоэлементом с трансформацией:
    Ответ написан
    3 комментария
  • Как и где можно фиксировать и сохранять данные до изменений в multiselect?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    В entity.selectedAccesses лежит последнее значение =\
    Ответ написан
    9 комментариев
  • Почему TS не компилирует пути для JS?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    paths в tsconfig работают только визуально. Чтобы они работали физически - надо продублирвать их в алиасы того сборщика, который вы используете.
    paths - не первичны, а вторичны: они сделаны как отражение возможностей алиасов в сборщиков, а не как самостоятельная фича.
    Ответ написан
    1 комментарий
  • Как при нажатии кнопки выводить поэтапно строки которые значение увеличивается на 1?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Для начала забудем о react и поговорим о javascript: javascript риусет ui в одном потоке, потому while - это атомарная операция. На экране ничего не отобразится пока while не закончит своё действие. Т.е. выведя 10 строк через while - ты сразу увидишь их на экране, они не будут появляться по одной. Если, конечно, не подключишь асинхронность с async и await внутри цикла.

    Теперь к react: отображение нескольких строк осуществляется с помощью массива:
    const lines = [1, 2, 3];
    
    return lines.map(line => (
      <p> {line} </p>
    ));


    Если ты хочешь, чтоб при клике добавлялась строчка, то состояние этого массива надо отслеживать, т.е. напримр положить его в state:
    function Component() {
      const [lines, setLines] = useState([1, 2, 3]);
      const addLine = useCallback(() => {
        setLines(lines => [...lines, lines.length+1])
      });
    
      return(
        <>
          <button onClick={addLine} className="button">
            addLine
          </button>
          {lines.map(line => (
            <p> {line} </p>
          ))}
        </>
    }


    Если ты хочешь, чтоб при клике постепенно добавлялась 10 строчек с задержкой, то это можно сделать с помощью setTimeout(тут я обернул его в Promise для простоты и наглядности):
    const delay = (ms) => new Promise(r => setTimeout(r, ms))
    
    function Component() {
      const [lines, setLines] = useState([]);
      const addLines = useCallback(async () => {
        let i = 0;
        while(i++ < 10) {
          await delay(1000);  
          setLines(lines => [...lines, i])
        }
      });
      return(
        <>
          <button onClick={addLines} className="button">
            addLine
          </button>
          {lines.map(line => (
            <p> {line} </p>
          ))}
        </>
      );
    }
    Ответ написан
    Комментировать
  • Как добавить аттрибут к тегу без занчения?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Одиночный тег - это active="".
    Ну и да, по возможности выкинь нафиг jq, это очень плохая практика.
    Ответ написан
    Комментировать
  • Проблема с цветом видео в разных браузерах?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Конечно сталкивались, и простого решения конкретной проблемы нет: видео это немного отдельный поток и там всегда могут быть свои настройки отображения.

    Решения есть следующие:
    1. Делать видео сразу с прозрачностью, а не с бэкграундом, современные браузеры это поддерживают:
    2. Рисовать видео на canvas, программно подгоняя фон.
    3. Накладывать SVG фильтр на видео, который погонит фон.
    Ответ написан
    Комментировать
  • Почему не работает addTag в multiselect?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Судя по документации тэг добавляется также и в модель(т.е. в entity.selectedAccesses), а не только в options(что называется у тебя value).

    С учётом слота, можно сделать примерно так:
    Ответ написан
  • Почему возникает ошибка Uncaught (in promise) DOMException: The element has no supported sources?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Мужик, просто попробуй открыть файл руками.
    Если возвращается "текущий HTML код страницы" и ошибка "The element has no supported sources" - вполне очевидно, что такого файла по такому адресу просто нет.
    Ответ написан
  • Почему при сборке библиотеки и подключения ее, выдает ошибку?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Не надо ничего "копировать из dist". В node_modules должен быть модуль, т.е. в первую очередь файлик package.json, во вторую - всё что в нём указано по тем путям которые там указаны.
    Вот когда ты делаешь npm link - открой node_modules и посмотри как должна выглядеть твоя либа(только без исходников).
    Когда ты сделаешь нормальный npm publish - токчно также всё просто скопируется в npm.
    Ответ написан
    Комментировать
  • Smooth scroll to anchor links in Nuxt3 как сделать?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Точно также как и не в nuxt.
    function manualSmoothScroll(event) {
      // находим хэш ссылу по которой мы кликнули
      const id = event.target.closest('a[href^="#"]')?.hash;
      // если клик куда-то ещё - ничего не делаем
      if (!id) return;
      
      
      // находим цель куда будем скроллить по хэшу
      const target = document.querySelector(id);
      // если не нашли - ничего не делаем
      if (!target) return;
      
      // отменяем стандартный переход
      event.preventDefault();
      // едем руками
      target.scrollIntoView({ behavior: "smooth" });
    }
    
    // при загрузке
    addEventListener('click', manualSmoothScroll, true);
    
    
    // при выгрузке
    removeEventListener('click', manualSmoothScroll, true);
    
    // если действовать надо только в рамках элнметата
    // elementRef.value.addEvent... elementRef.value.removeve... 
    // или this.$refs.element... 
    // или this.$el...
    Ответ написан
    1 комментарий
  • Как можно ограничить скорость запроса в js?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Если у тебя по капотом хром, то наверное ты можешь использовать fetch в котором у Request body - это ReadableStream, растянув таким образом запрос настолько - насколько надо. Но это всё же не совсем то же самое что просто медленный запрос.
    Полноценного же низкоуровневого контроля над запросом никто тебе из js не даст.
    Ответ написан
    4 комментария
  • Как поменять данные в JSON не залезая в него через Python?

    Aetae
    @Aetae
    Тлен
    Начнём с того, что именно такая структура - это не валидный json.
    Если тебе приходится работать с индийскими данными - без индийских фокусов не обойтись.

    Если ты ошибся в примере и там на самом деле валидный json, то тебе в любом случае придётся перезаписывать весь файл после изменения, т.к., увы, формат json никаким образом не выровнен по байтам, чтоб можно было менять значения в центре файла и не трогать иные.
    Единственное что, если не хочется грузить весь файл в память сразу - можно воспользоваться библиотеками для потокового чтения-записи json.

    P.S. Конечно, если ты уверен, что новое значение всегда будет в utf8 короче или равно по длине старому, то, в принципе, возможны и точечные изменения, однако это слишком частный случай - сомневаюсь, что где-то есть либа для подобного. Если очень хочется - не сложно будет адаптировать ту же потоковую либу для нахождения позиции в файле и использовать затем стандартные средства работы с файлами для точечной перезаписи, однако выигрыш тут слишком мал, ИМХО, чтоб так заморачиваться.
    Ответ написан
    Комментировать