JS Web worker 在多个 worker 中共享相同的脚本
JS Web worker share the same scripts in multiple workers
我有多个内联工作器需要 运行。我的问题是每个实例都需要共享导入的相同脚本。但是在我创建的每个实例上,它都会重新下载脚本。
function workerFn(){
importScripts('https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js');
// Each time this function will do something else
postMessage(_.head([1,2,3]));
}
var code = workerFn.toString();
code = code.substring(code.indexOf("{") + 1, code.lastIndexOf("}"));
var blob = new Blob([code], {type: "application/javascript"});
var worker = new Worker(URL.createObjectURL(blob));
var worker2 = new Worker(URL.createObjectURL(blob));
worker.onmessage = function (m) {};
worker2.onmessage = function (m) {};
因此,在上面的示例中,lodash
将下载两次。我怎样才能防止这种情况发生?
简答:
不幸的是,你不能。是否下载脚本取决于浏览器。我认为这甚至不会发生在每个浏览器中。
另一个简短的回答:
避免浏览器重新下载脚本的唯一方法是 a) 在您的代码中编译它(例如 web pack)或 b) 通过 AJAX 下载它,假设 CDN 允许请求来自其他域。
这些都不是我推荐的生产代码。
我有多个内联工作器需要 运行。我的问题是每个实例都需要共享导入的相同脚本。但是在我创建的每个实例上,它都会重新下载脚本。
function workerFn(){
importScripts('https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js');
// Each time this function will do something else
postMessage(_.head([1,2,3]));
}
var code = workerFn.toString();
code = code.substring(code.indexOf("{") + 1, code.lastIndexOf("}"));
var blob = new Blob([code], {type: "application/javascript"});
var worker = new Worker(URL.createObjectURL(blob));
var worker2 = new Worker(URL.createObjectURL(blob));
worker.onmessage = function (m) {};
worker2.onmessage = function (m) {};
因此,在上面的示例中,lodash
将下载两次。我怎样才能防止这种情况发生?
简答:
不幸的是,你不能。是否下载脚本取决于浏览器。我认为这甚至不会发生在每个浏览器中。
另一个简短的回答:
避免浏览器重新下载脚本的唯一方法是 a) 在您的代码中编译它(例如 web pack)或 b) 通过 AJAX 下载它,假设 CDN 允许请求来自其他域。
这些都不是我推荐的生产代码。