Why does not Chrome allow Web Workers to be run in JavaScript?

18,027

Solution 1

This question was already asked. The workers should work in HTML files opened from disk as long as you use relative path. However, if chrome implements this correctly has been disputed.

I advise that you try to use relative path in your scripts:

new Worker("./scripts/worker.js");

If that doesn't work, see this workaround: https://stackoverflow.com/a/33432215/607407

Specifically, load worker as a function, then convert the function to string:

function worker_function() {
    // all worker code here
}
var worker = new Worker(URL.createObjectURL(new Blob(["("+worker_function.toString()+")()"], {type: 'text/javascript'})));

Solution 2

var cblock=`

function workerFunc(e){

    console.info('Hello World!',e.data.msg)
    postMessage({msg:'Complete!'})
}

addEventListener('message',workerFunc)
`    
var a=new Worker(URL.createObjectURL(new Blob( [cblock], {type:'text/javascript'} )))    
a.onmessage=function(e){ console.info('My worker called!',e.data.msg) }    
a.onerror=function(e){ console.info( JSON.stringify(e,' ',2) ) }    
a.postMessage({ msg:'Chrome WebWorkers work!' }) 

// Hello World! Chrome WebWorkers work!
// My worker called! Complete! 
Share:
18,027
Inderpartap Cheema
Author by

Inderpartap Cheema

Updated on July 09, 2022

Comments

  • Inderpartap Cheema
    Inderpartap Cheema almost 2 years

    If I try to use web workers through a JavaScript file, Chrome throws an error -

    Uncaught SecurityError: Failed to create a worker: script at '(path)/worker.js' cannot be accessed from origin 'null'.

    But it allows them if we use directly through the HTML.

    The answer on Chrome can't load web worker says Chrome doesn't let you load web workers when running scripts from a local file.

    Why doesn't chrome allow web workers to run locally?

    Web Workers work completely fine in Firefox, Safari and in Edge

    • Jim
      Jim almost 8 years
      web workers have been supported by chrome since version 4.00, perhaps share your code? I suspect it's access to worker.js that's the problem.
    • Morten Olsen
      Morten Olsen almost 8 years
      Are your application running http (http://, https://) or streight from the file system (file://)?
  • Inderpartap Cheema
    Inderpartap Cheema almost 8 years
    The answer you mentioned says "Chrome doesn't let you load web workers when running scripts from a local file." This was my actual question. Why can't we use workers locally in Chrome?
  • utdev
    utdev over 6 years
    if the worker js file is in the same dir I just need to call it like this correct? new Worker("worker.js");
  • Tomáš Zato
    Tomáš Zato over 6 years
    @InderpartapCheema If you're asking Why, then it's off topic, see help center.
  • Vasily Hall
    Vasily Hall over 5 years
    It's on topic and I also am curious about this + the more questions the merrier- I for one am googling this in 2018 and am frustrated by the sheer absence of identical such questions as by now I expect there to be dozens of answers for this kind of thing , each shining their own hint of wisdom on the subject.
  • Tomáš Zato
    Tomáš Zato over 5 years
    @VasilyHall I understand your curiosity and frustration. But asking "why" did Google Chrome team make decision about a feature is not on topic on stackoverflow: It would be pure speculation - unless one of the decision makers actually weighs in.
  • Vasily Hall
    Vasily Hall over 5 years
    Fair enough, maybe in years ahead some engineers would pop on this thread and anonymously spill the secret.
  • Vasily Hall
    Vasily Hall over 5 years
    On another note, I'm excited to try your solution from another post - about doing a quick internally-external script via Blob object!
  • agiopnl
    agiopnl over 2 years
    The relative URL didn't work in any of my browsers, but the Blob-way worked.