Estoy tratando de crear un trabajador de JavaScript, donde necesito la biblioteca JSONfn . No estoy completamente seguro de cómo importarlo.
<html> <script type="text/javascript" src="jsonfn.js"></script> <script id="worker" type="javascript/worker"> self.onmessage = function f(message){ console.log(JSONfn.parse(message...) } ... </script> <html>Obtuve el siguiente error:
Uncaught ReferenceError: JSONfn is not definedPara importar scripts externos en su Web Worker, puede usar el método importScripts() disponible en contextos de Worker que no son módulos.
Sin embargo, esta biblioteca en particular no parece estar diseñada para usarse en un Worker (llama al captador de window , que no está disponible en contextos de Worker). Parece que simplemente redirigir la window a self funciona, pero es muy posible que falle en otros lugares.
Además, para analizar desde el hilo principal, obviamente tendrá que cargar la biblioteca nuevamente en ese contexto (a través de un <script> ).
const worker_url = URL.createObjectURL(new Blob([document.querySelector("[type=worker]").textContent], {type: "text/javascript"})); const worker = new Worker(worker_url); worker.onmessage = (evt) => { console.log("received", evt.data); const parsed = JSONfn.parse(evt.data); console.log(parsed) console.log(parsed.baz()); }; <script type="worker"> window = self; // jsonfn uses "window" importScripts("https://cdn.jsdelivr.net/gh/vkiryukhin/jsonfn/jsonfn.js"); const obj = {foo: "bar", baz: function() { return "blah"; }} const json = JSONfn.stringify(obj); postMessage(json); </script> <!-- to parse from the main thread we need to load the library here too --> <script src="https://cdn.jsdelivr.net/gh/vkiryukhin/jsonfn/jsonfn.js"></script> También tenga en cuenta que esta biblioteca requiere que declare su función con la palabra clave function (las funciones de flecha o la sintaxis de métodos no son compatibles), y que no podrá recuperar nada fuera del alcance de la función, realmente solo copia el código fuente, nada sobre el contexto.