Они определяют IS_PAPA_WORKER
до
var IS_WORKER = !global.document && !!global.postMessage,
IS_PAPA_WORKER = IS_WORKER && /blob:/i.test((global.location || {}).protocol);
Это означает, что они проверяют, нет ли свойства document
, postMessage
и, если текущая область был загружен из blob:
URI.
Лучшее решение в вашем случае, вероятно, состоит в том, чтобы не загружать ваш скрипт из blob:
URI, а вместо этого использовать выделенный файл скрипта.
const worker = new Worker( '/a_real_file.js' );
Вот демонстрация с использованием data:
URI, поскольку StackSnippets не разрешают хранение файлов, но сами не используют data:
URI, просто для демонстрации важен протокол:
const worker_script = document.querySelector( '[type="worker-script"]' ).textContent;
const worker_url = 'data:text/javascript,' + encodeURIComponent( worker_script );
const worker = new Worker( worker_url );
worker.onmessage = ({data}) => console.log( data );
worker.onerror = console.error;
<script type="worker-script">
importScripts( 'https://cdnjs.cloudflare.com/ajax/libs/PapaParse/5.1.0/papaparse.min.js' );
const csv = `col1,col2,col3
a,1,z
b,2,y
c,3,x`;
Papa.parse( csv, { header: true } );
postMessage( 'worker done' );
</script>
Теперь, если вам абсолютно необходимо использовать URI blob:
, самое простое решение - определить document
как истинное глобальное свойство перед импортом библиотеки. :
const worker_script = document.querySelector('[type="worker-script"]').textContent;
const worker_url = URL.createObjectURL( new Blob( [ worker_script ], { type: 'text/javascript' } ) );
const worker = new Worker( worker_url );
worker.onmessage = ({data}) => console.log( data );
<script type="worker-script">
self.document = {};
importScripts( 'https://cdnjs.cloudflare.com/ajax/libs/PapaParse/5.1.0/papaparse.min.js' );
const csv = `col1,col2,col3
a,1,z
b,2,y
c,3,x`;
Papa.parse( csv, { header: true } );
postMessage( 'worker done' );
</script>