Укажите кодировку для импорта сценариев у веб-работников - PullRequest
0 голосов
/ 09 апреля 2020

Я использую веб-работников для выполнения сценария отдельно от моего основного потока js. При импорте сценария внутри веб-работника, как указать кодировку?

1 Ответ

1 голос
/ 10 апреля 2020

Нет определенного способа сделать это.

Согласно спецификации, получить класс c рабочий импортированный скрипт должен прочитать выбранные данные как UTF-8:

Пусть источник текст будет результатом декодирования UTF-8 тело ответа .

(То же относится и к для выбор классного c рабочего сценария btw)

Это не оставляет места для сомнений. Даже установка charset в заголовке Content-Type здесь не поможет (хотя она должна для выборка classi c сценариев ).

Теперь, кажется, Chrome не соблюдает это правило (по крайней мере, не для data: // URL, я не пробовал с реальным обслуживаемым файлом, и для blob: // URL, которые они не ' даже смотреть на определенный набор символов ...), но Firefox делает.

// we store the text encoded as base64 to preserve the encoding
// original text is `postMessage("é and ü")`
const script_url = "data:text/javascript;charset=windows-1252;base64,cG9zdE1lc3NhZ2UoIukgYW5kIPwiKQ==";

// importScript() test
{
  const worker_script = `importScripts( "${ script_url }" );`;
  const import_worker = new Worker( URL.createObjectURL( new Blob( [ worker_script ], { type: "text/javascript" } ) ) );
  import_worker.onmessage = (evt) => {
    console.log( 'importScripts:', evt.data );
  };
}

// Worker script test
{
  const direct_worker = new Worker( script_url );
  direct_worker.onmessage = (evt) => {
    console.log( 'worker script:', evt.data );
  };
}

// inline script test
{
  const script = document.createElement( 'script' );
  script.src = script_url;
  document.head.append( script );
  onmessage = (evt) => {
    console.log( 'inline-script:', evt.data );
  };
}

Конечно, есть способы обойти это:

  • Определенно лучшее решение - перекодировать ваши сценарии как UTF-8.
  • Еще одно совершенно хакерское решение - извлечь ваш сценарий как BLOB-объект, прочитать его как DOMString, используя правильную кодировку, а затем сгенерировать новый UTF-8 BLOB-объект, который вы бы хотели служить importScripts. выполнимо , но действительно ужасно.
...