Chrome не може завантажити веб-працівника


109

Я працюю над проектом, який використовує веб-працівник.

У головному розділі у мене є такий код:

var worker = new Worker("worker.js");
// More code

Це добре працює в Safari, але Chrome повідомляє про наступну помилку:

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

Чому це ідеально працює в Safari, але не в Chrome? Як це виправити?

Дякую.


1
Ви працюєте з файловим протоколом? Якщо встановлений прапор доступу і подивитися , якщо він працює: stackoverflow.com/questions/18586921 / ...
epascarello

1
Так, шлях для веб - працівника полягає в наступному: file:///E:/programming/web/project/worker.js. Шлях для основного проекту полягає в наступному: file:///E:/programming/web/project/index.html.
Прого

Відповіді:


84

Chrome не дозволяє завантажувати веб-працівників під час запуску скриптів з локального файлу.


6
З цієї відповіді , Loading a local file, even with a relative URL, is the same as loading a file with the file: protocol.- і веб-сторінкам не круто, щоб вони могли просто отримати доступ до вашої файлової системи.
ChaseMoskal

41
-1 firsfox дозволить вам це робити, звичайно, якщо ви також використовуєте файл як джерело (наприклад, ви переглядаєте локальний файл у браузері). Це просто хром, який зламаний.
Томаш Зато - Відновіть Моніку

3
Firefox все ще працює (так, з файлу: //), Chrome у цьому випадку немає.
Зло

55

Я використовую вирішення. Chrome блокує, Workerале ні <script>. Отже, найкращий спосіб прийняти універсальне рішення:

function worker_function() {
    // all code here
}
// This is in case of normal worker start
// "window" is not defined in web worker
// so if you load this file directly using `new Worker`
// the worker code will still execute properly
if(window!=self)
  worker_function();

Потім ви пов'язуєте це як звичайне <script src="...". І як тільки функція визначена, ви використовуєте цю гидоту коду:

new Worker(URL.createObjectURL(new Blob(["("+worker_function.toString()+")()"], {type: 'text/javascript'})));

Це рішення добре. чому в цьому світі нічого ідеального не буває? Кожне програмне забезпечення агітує користувачів з помилками, вадами, дитячою поведінкою тощо. Firefox також нахабний, оскільки відмовляється підтримувати css властивість "clip-path".
Ĭsααc t ի ε βöss

Я не js розробник і не розумію, як тут використовується тег сценарію. А що таке вікно! = Самоперевірка? Може хтось пояснить цю послідовність завантаження? Дякую.
Шарун

Теги скриптів завантажуватимуться в Google Chrome, якщо вони перебувають у тому самому каталозі, що і HTML. window!=seldперевіряє, чи працює код у веб-працівника. Це робить цей код портативним у випадку, якщо ви завантажуєте файл javascript безпосередньо в інших контекстах.
Томаш Зато - Відновити Моніку

1
@ treeseal7 Код, який повинен виконуватися в контексті веб-працівника.
Томаш Зато - Відновити Моніку

2
Слід зазначити, що не можна використовувати importScript від написаного таким чином робітника. Принаймні, не без додаткового рішення. Таким чином, вам потрібно більше підробити для роботи з двома файлами.
SlugFiller

41

Проблема була належним чином пояснена Noble Chicken, але у мене є більш загальне рішення для неї. Замість того, щоб встановлювати wamp або xamp, за допомогою python ви можете перейти до папки, в якій розміщується ваш проект, і введіть:python -m http.server

Тільки це, і у вас буде запущений сервер у цій папці, доступний від localhost.


13
Маки, мабуть, знадобляться, python -m SimpleHTTPServer 8000коли вони завантажуються з <Python 3 (просто для збереження іншого пошуку в Google: D)
siege_Perilous

3
Ви також можете встановити модуль вузла http-сервера, а потім перейти до потрібної папки з терміналу та запустити "http-сервер -p 3000".
Хуан Чжан

варто згадати цей сценарій "python -m http.server" потрібен Python 3.
milesma

Також спробуйтеphp -S localhost:8000
Вільям Ентрікен

29

Ви також можете використовувати --allow-file-access-from-files прапор під час запуску Chrome.

Приклад для MacOsX:

/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-files

Більше інформації: Налаштування веб-працівника для хромування


У вікні команд Windows перейдіть до: "C: \ Users \ NAME \ AppData \ Local \ Google \ Chrome \ SxS \ Application", а потім запустіть chrome.exe --allow-file-access-from-files, а потім скопіюйте локальний шлях до файлу наприклад c: \ temp \ myWeb \ index.html і вставити у URL-адресу відкритого браузера, виконано.
milesma

4
Ви також можете створити ярлик і передати прапор у цільовий шлях.
Стефан

1
О, і з пов’язаного питання не забудьте закрити всі вікна Chrome перед запуском із прапором.
Стефан

Так, іншим варіантом може бути також кодування розширення Chrome з правильним дозволом у його маніфесті: "permissions": ["файл: // * / *"], як у stackoverflow.com/questions/19493020/…
Mickaël

Примітка: "Ви повинні закрити всі вікна Chrome, перш ніж відкривати його із --allow-file-access-from-filesувімкненим прапором." як зазначено на stackoverflow.com/a/21771754/325418
nonopolarity

15

Це через обмеження безпеки. Вам потрібно використовувати http://або https://протокол замість file:///.

Якщо у вас встановлений NodeJS, ви можете просто зробити наступне. - Зауважте, що це один із багатьох доступних варіантів

Встановіть локальний веб-сервер

$ npm install -g local-web-server

Тепер ви можете використовувати його в будь-якій папці, через яку ви хочете отримати доступ до вмісту http.

$ ws

Перейдіть до http://localhost:8000(порт за замовчуванням: 8000)


6

У мене була така ж проблема, як і у вашої посади. Рішення полягає в тому, що вам потрібно запустити його з localhost (wamp або xamp). Це буде зроблено.


Нічого собі, я б ніколи цього не знайшов - дякую! (Сподіваюся, подяки дозволені в коментарях)
dcromley


3

вам потрібен веб-сервер для запиту від протоколу HTTP Замість локального файлу та працюйте правильно :)


1
Ні, ти цього не робиш. Вам потрібно ігнорувати веб-переглядачі, які не відповідають веб-стандартам лише тому, що вони є основними.
Томаш Зато - Відновіть Моніку

3

Chromeзавантажте файл, але не можете його запустити. Використовуйте Firefox. Це працює для мене.


1
Щоб пояснити свою суть: Можливо, краще почати з коментаря, можливо, дізнатись більше про їхні вимоги щодо підтримки браузера, а не подавати як відповідь. Це, мабуть, не відповідь, враховуючи те, що користувач вже сказав про підтримку крос-браузера.
Томас Пул

Якщо ви уважно прочитали питання, я впевнений, що ви не будете проголосувати відповідь як три, перш ніж ви проголосуєте! Користувач каже, що Chrome не може завантажувати працівника. Ні, хром може завантажувати працівника, але не може його запустити. Причини, чому я ставлю це як відповідь - це перше запитання, яке було задано рік тому, а друге багато відповідей говорить про те, що Firefox не працює тим працівником, який я не можу коментувати. Я просто пояснюю, але ви маєте право на відмову від голосу чи проти.
Hocine Ben

3

Простий спосіб зробити локальний http-сервер в хромі це ця програма:

Веб-сервер для Chrome

https://chrome.google.com/webstore/detail/web-server-for-chrome/ofhbbkphhbklhfoeikjpcbhemlocgigb/related

Опис:

Веб-сервер для Chrome обслуговує веб-сторінки з локальної папки через мережу за допомогою HTTP. Працює офлайн. Веб-сервер для Chrome - це HTTP-сервер із відкритим кодом (MIT) для Chrome.

Він працює в будь-якому місці, на якому встановлений Chrome, і ви можете взяти його будь-де. Він навіть працює на хромобусах ARM.

Тепер він має можливість прослуховувати в локальній мережі, щоб інші комп'ютери могли отримати доступ до ваших файлів. Крім того, він може спробувати отримати Інтернет-адресу.

Багато людей використовують це для створення базових веб-розробок на хронічній книзі. Це також зручно для обміну файлами через локальну мережу між комп’ютерами або навіть в Інтернеті.

Після встановлення перейдіть до http://127.0.0.1:8887

І це не небезпечно, як прапор --allow-file-access-from-files


Це дивно! Тепер я можу запустити додаток reactJS з веб-працівниками з локальної файлової системи. Не може бути набагато простіше!
Json

3

На це надихає відповідь Томаса вище. Але з одним застереженням, що я хотів розповсюджувати лише HTML, тож я вручну перетворив js в dataURL . і включити прапорець URL-адреси даних у ньому.

const myWorker = new Worker("data:application/x-javascript;base64,b25tZXNzYW...");


2

З Python 2.x більш широко розгорнутим, ніж Python 3.x, щось подібне python -m SimpleHTTPServer 8000 є більш загальноприйнятним, а не лише для Mac OS X. Я вважав, що це необхідно для використання під Cygwin, наприклад.

Маючи на місці цей приклад, він працював як чемпіон.


2
function worker_fun(num){
    num ++
    // console.log(num)
    postMessage(num);
    setTimeout(worker_fun.bind(null,num), 500)
}

var w

function startWorker(){
    var blob = new Blob([
        "onmessage = function(e){\
            " + worker_fun.toString() + "\
            worker_fun(e.data.num);}"
    ]);
    var blobURL = window.URL.createObjectURL(blob);
    if (typeof(Worker) != 'undefined'){
        if (typeof(w) == 'undefined'){

            w = new Worker(blobURL);
            w.onmessage = function(event){
                document.getElementById('num').innerHTML = event.data;
            } 
            w.postMessage({
               num:parseInt(document.getElementById('num').innerHTML)})
        }
    }
}


function stopWorker() { 
    w.terminate();
    w = undefined;
}

Як вже було сказано, хром це не підтримує. Мені подобається визначати своїх працівників у тому ж файлі. Це робоче вирішення, яке збільшить кількість знайдених у innerHTML елемента елемент з id=numкожні 500 мс.


1

Ймовірно, причина в тому, що хром не дозволяє завантажувати веб-працівників під час запуску скриптів з локального файлу. І я намагаюся запустити код на моєму Firefox, також не можу.


Веб-робітники відмінно працюють file://у Firefox 51.0.1
bryc

-6

Так, це не буде працювати в хорі, якщо ви завантажуєте локальний файл. Але він буде добре працювати в браузері Firefox. І ви повинні додати код нижче в HTML-файл.

<head>
    <meta charset="UTF-8" />
</head>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.