Ответы пользователя по тегу JavaScript
  • Как правильно разделить assets в сборке?

    @desocrew
    Чтобы избежать копирования контентных изображений и статических файлов в dist, вы можете добавить правила исключения для этих файлов в ваш файл конфигурации Vite. Для этого можно использовать опцию exclude в секции build вашего файла конфигурации.

    Вот пример кода, который позволит вам исключить все контентные изображения и статические файлы из вашей сборки Vite:
    import { defineConfig } from 'vituum';
    import nunjucks from '@vituum/nunjucks';
    
    export default defineConfig({
      integrations: [nunjucks()],
      templates: {
        format: 'njk',
      },
    
      filenamePattern: {
        '+.css': false,
        '+.scss': 'src/styles',
      },
    
      vite: {
        build: {
          rollupOptions: {
            output: {
              assetFileNames: (assetInfo) => {
                let extType = assetInfo.name.split('.').at(1);
                if (/png|jpe?g|svg|gif|tiff|bmp|ico/i.test(extType)) {
                  console.log(assetInfo)
                  extType = 'img';
                }
                return `assets/${extType}/[name][extname]`;
              },
              chunkFileNames: 'assets/js/[name].js',
              entryFileNames: 'assets/js/[name].js',
            },
          },
          // исключение контентных изображений и статических файлов
          exclude: [
            '**/*.{png,jpg,jpeg,gif,svg,bmp,tiff,ico}',
            '**/*.{txt,json,html,css,js,map}',
          ],
        },
      },
    });


    Здесь мы использовали exclude для указания путей к файлам, которые мы хотим исключить из сборки. Вы можете изменять эти пути, чтобы подстроить их под свои нужды.
    Ответ написан
    1 комментарий
  • Как получить буфер линейной памяти wasm модуля из WebWorker без его копирования?

    @desocrew
    Действительно, вы не можете передать ArrayBuffer, который используется внутри WebAssembly, через postMessage() с опцией transfer. Это происходит потому, что в этом случае браузер пытается оторвать буфер от исходного контекста и присоединить его к новому контексту (в данном случае, от worker'а к основному потоку). Однако ArrayBuffer, связанный с памятью, используемой внутри WebAssembly, не может быть оторван и перенесен в другой контекст.

    Есть несколько вариантов, как можно передать данные между основным потоком и worker'ом без копирования.

    1. Использовать SharedArrayBuffer вместо ArrayBuffer. Однако, как вы уже заметили, у SharedArrayBuffer есть ограничения на использование в некоторых браузерах. Кроме того, не все платформы поддерживают SharedArrayBuffer (например, некоторые мобильные устройства iOS). Чтобы использовать SharedArrayBuffer в вашем случае, вы можете создать его в основном потоке и передать его в worker через postMessage(). Затем вы можете использовать этот SharedArrayBuffer внутри вашего WebAssembly модуля.

    2. Вы можете использовать Transferable Objects для передачи данных без копирования. В вашем случае, если память внутри WebAssembly модуля уже инициализирована, вы можете передать указатель на начало памяти через Transferable Objects. Например:

    Основной поток:
    const mem = instance.exports.memory.buffer;
    const ptr = instance.exports.getPixelDataPtr();
    worker.postMessage({mem, ptr}, [mem]);

    Web Worker:
    self.onmessage = (event) => {
      const {mem, ptr} = event.data;
      const pixels = new Uint8Array(mem, ptr, numPixels * 4);
      // делаем что-то с пикселями
    }

    В этом случае, вы передаете указатель на начало памяти вместе с буфером, но не копируете саму память. Вы можете использовать TypedArray для доступа к данным в памяти. Обратите внимание, что в вашем WebAssembly модуле должна быть функция, которая возвращает указатель на начало памяти, который вы можете передать в worker.

    Однако, если вы измените данные в памяти на стороне worker'а, эти изменения не будут отражены в памяти, используемой внутри WebAssembly модуля.
    Ответ написан
    1 комментарий
  • Как исправить Uncaught SyntaxError: Cannot use import statement outside a module?

    @desocrew
    Эта ошибка означает, что вы пытаетесь использовать оператор импорта вне модуля. Чтобы исправить это, вам нужно убедиться, что вы используете оператор импорта в модуле или скрипте. Кроме того, если вы используете оператор импорта в скрипте, убедитесь, что вы используете расширение .mjs для файла вместо .js.
    Ответ написан
  • Как закодировать queryString в .htaccess?

    @desocrew
    Для кодирования специальных символов в JavaScript вы можете использовать функцию encodeURIComponent(). Эта функция принимает строку в качестве аргумента и кодирует все символы со специальным значением в URL-адресах. Затем он возвращает новую закодированную строку. После того, как вы закодировали строку, вы можете передать ее как значение параметра в файле .htaccess.
    Ответ написан
    Комментировать
  • Как правильно изменить fill у svg по клику с помощью JavaScript?

    @desocrew
    function changeSvgFill(Selector, toColor) { 
        Selector.style.fill = toColor; 
    };
    // Тогда:
    // При условии, что fill у swiperBtnPrev серый
    swiperBtnPrev.onclick = function() {
        changeSvgFill(swiperBtnPrev, 'rgb(255, 255, 255)')
        changeSvgFill(swiperBtnNext, 'rgb(228, 228, 228)')
    }
    swiperBtnNext.onclick = function() {
        changeSvgFill(swiperBtnPrev, 'rgb(228, 228, 228)')
        changeSvgFill(swiperBtnNext, 'rgb(255, 255, 255)')
    }
    Ответ написан
    Комментировать
  • Как исправить ошибку Module Error (from ./node_modules/vue-loader/dist/index.js):?

    @desocrew
    Чтобы устранить проблему с ошибкой "Module Error (from ./node_modules/vue-loader/dist/index.js)", лучшим способом является обновление настроек vue-loader. Для этого выполните простые шаги:

    1. Откройте терминал и запустите команду npm install --save-dev vue-loader@latest.
    2. Запустите команду npm update vue-loader.
    3. Попытайтесь заново запустить проект.
    Ответ написан
    Комментировать
  • Как скопировать id при клике на javascript?

    @desocrew
    Чтобы скопировать ID элемента при нажатии на него в JavaScript, можно использовать следующий код:
    // Функция для копирования идентификатора элемента при нажатии 
    function copyId(e) { 
        var elementId = e.target.id;  
        // Создание буфера и копирование данных 
        var tempInput = document.createElement("input");  
        tempInput.value = elementId;  
        document.body.appendChild(tempInput);  
        tempInput.select();  
        document.execCommand("copy");  
        document.body.removeChild(tempInput);  
    }.
    Ответ написан
    Комментировать
  • Как включить javascript в chromium DevelStudio 3.0?

    @desocrew
    Чтобы включить JavaScript в Chromium DevelStudio 3.0, нужно сделать следующее:
    1. Откройте Chromium DevelStudio 3.0.
    2. Зайдите в меню "Параметры" и перейдите на вкладку "Дополнительные настройки".
    3. В разделе "Настройки безопасности" установите флажок "Разрешить JavaScript".
    4. Нажмите кнопку "ОК", чтобы применить изменения.
    Ответ написан
    Комментировать
  • JavaScript. Полное руководство или JavaScript для профессиональных веб-разработчиков?

    @desocrew
    В книге Дэвида Флэнагана предложен мощный материал и опытные пояснения, которые помогут новичку изучить JavaScript с глубоким пониманием.
    Ответ написан
    Комментировать
  • Как сделать, чтобы бот Discord делал профиль игроку?

    @desocrew
    client.on('message', message => {
    if(message.content = `${prefix}userinfo`) {
    const embed = new Discord.MessageEmbed()
    .setTitle(`Информация о ${message.author.username}`)
    .setColor(0xff0000)
    .addField('Fullname | Полное имя', message.author.tag)
    .addField('Тэг | Tag', message.author.discriminator)
    .addField('Создан | Created', message.author.createdAt)
    .addField('Идентификатор | ID', message.author.id)
    message.channel.send(embed)
    }
    })

    discord.js v12
    Ответ написан
    Комментировать