Chrome无法加载网络工作者

Pro*_*ogo 100 javascript google-chrome web-worker

我正在开发一个使用Web worker的项目.

在我的脑子部分,我有这个代码:

var worker = new Worker("worker.js");
// More code
Run Code Online (Sandbox Code Playgroud)

这在Safari中运行良好,但Chrome报告以下错误:

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

为什么这在Safari中完美运行而不是Chrome?我该如何解决?

谢谢.

Nob*_*ken 73

从本地文件运行脚本时,Chrome不允许您加载Web工作程序.

  • -1 firsfox当然会让你这样做,前提是你**也**使用文件作为原点(例如你在浏览器中查看本地文件).它只是破碎的铬. (37认同)
  • 从[这个答案](http://stackoverflow.com/a/6823683/1033426),`加载本地文件,即使使用相对URL,也与使用以下文件加载文件:protocol. - 和网页能够随心所欲地访问您的文件系统并不酷. (6认同)
  • Firefox仍然可以使用(是的,来自file://),在这种情况下Chrome不会. (3认同)

Tom*_*ica 48

我使用了一种解决方法.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();
Run Code Online (Sandbox Code Playgroud)

然后你正常链接它<script src="...".一旦定义了函数,就可以使用这种代码的憎恶:

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

  • 这个解决方案很好。为什么这个世界上没有什么是完美的?每个软件都以错误、缺陷、幼稚行为等方式激怒用户。Firefox 也很傲慢,因为它拒绝支持“clip-path”css 属性。 (5认同)
  • 我应该注意,您不能使用像这样编写的工作人员的 importScript。至少,并非没有额外的解决方法。因此,您需要对多文件工作者进行更多篡改。 (3认同)
  • 我不是 js 开发人员,也没有理解此处使用脚本标记的要点。什么是窗口!=自我检查?有人可以解释一下这个加载顺序吗?谢谢。 (2认同)
  • @treeseal7 应在 Web Worker 上下文中执行的代码。 (2认同)
  • 我也注意到了,但是 **stringify** 要传递的变量 (json) `var json = JSON.stringify(xJsonArgs);` 而不是像 `new Worker(URL.createObjectURL(new Blob([`(${ xFunction.toString()})(${json})`], { type: 'text/javascript' })));` 对我有用。感谢您的答复。 (2认同)

Rob*_*cus 35

这个问题已由Noble Chicken正确解释,但我有一个更通用的解决方案.使用python而不是安装wamp或xamp,您可以导航到项目所在的文件夹并键入:python -m http.server

就是这样,你将在该文件夹上有一个正在运行的服务器,可以从localhost访问.

  • Mac可能需要使用`python -m SimpleHTTPServer 8000`,因为它们加载了<Python 3(只是为了保存另一个谷歌搜索:D) (12认同)
  • 您还可以安装http-server节点模块,然后从终端导航到所需的文件夹并运行"http-server -p 3000". (3认同)

Mic*_*aël 28

启动Chrome时,您还可以使用--allow-file-access-from-files标志.

MacOsX示例:

/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-files
Run Code Online (Sandbox Code Playgroud)

更多信息:Chrome的Web worker设置

  • 您还可以创建快捷方式并在目标路径中传递标记. (4认同)

Saf*_*ain 10

这是因为安全限制.您需要使用http://https://协议而不是file:///.

如果安装了NodeJS,则只需执行以下操作即可. - 请注意,这是许多可用选项之一

安装local-web-server

$ npm install -g local-web-server
Run Code Online (Sandbox Code Playgroud)

现在,您可以在要访问内容的任何文件夹中使用它http.

$ ws
Run Code Online (Sandbox Code Playgroud)

导航到http://localhost:8000(默认端口:8000)


gou*_*ham 7

这是受到上面托马斯回答的启发。但有一点需要注意的是,我只想分发 HTML,所以我手动将 js 转换为 dataURL。并启用其中的数据 URL 复选框。

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


小智 6

我的帖子也有同样的问题.解决方案是您必须使用localhost(wamp或xamp)运行它.它会完成.


A. *_*nis 6

在 Chrome 中创建本地 http 服务器的简单方法是这个应用程序:

Chrome 网络服务器

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

描述:

Chrome 的 Web 服务器使用 HTTP 从网络上的本地文件夹提供网页。离线运行。Web Server for Chrome 是 Chrome 的开源 (MIT) HTTP 服务器。

它可以在安装了 Chrome 的任何地方运行,因此您可以将其带到任何地方。它甚至可以在 ARM chromebook 上运行。

它现在可以选择侦听本地网络,以便其他计算机可以访问您的文件。此外,它还可以尝试获取互联网地址。

许多人使用它在 chromebook 上进行基本的 Web 开发。它还可以方便地在计算机之间甚至互联网上通过本地网络共享文件。

安装后,导航至http://127.0.0.1:8887

它并不像标志--allow-file-access-from-files那样不安全


小智 5

另一种解决方法是使用 Google 的Web 服务器进行 Chrome扩展。选择您的工作目录并启动服务器,完成!