面向Web工作人员的Javascript功能检测模块支持

面向Web工作人员的Javascript功能检测模块支持,javascript,web-worker,es6-modules,browser-feature-detection,Javascript,Web Worker,Es6 Modules,Browser Feature Detection,从Chrome 80开始,您可以使用newworker(“Worker.js”,“type:“module”})创建模块类型的Worker,然后在Worker脚本中使用模块功能,如import。然而,其他浏览器仍在努力支持这一点,因此使用它需要功能检测和回退 是否有一种方便、简单的方法来为工人提供功能检测模块支持 注意:在某些平台(如Cordova)上,创建worker实际上是非常重要的,并且涉及到一系列解决方法,因此在纯JS中工作的东西是理想的。由于每个initOptions特性,您可以使用我

从Chrome 80开始,您可以使用
newworker(“Worker.js”,“type:“module”})
创建模块类型的Worker,然后在Worker脚本中使用模块功能,如
import
。然而,其他浏览器仍在努力支持这一点,因此使用它需要功能检测和回退

是否有一种方便、简单的方法来为工人提供功能检测模块支持


注意:在某些平台(如Cordova)上,创建worker实际上是非常重要的,并且涉及到一系列解决方法,因此在纯JS中工作的东西是理想的。

由于每个
initOptions
特性,您可以使用我称之为“字典陷阱”的东西

它是一个对象,您可以在其上设置一个属性getter(您要测试的那个),并让这个getter在您正在测试的构造函数获取它时切换一个布尔值。这适用于许多这样的特性,工人的
类型在这里也不例外

对于Worker,您唯一需要注意的是避免实际启动一个Worker(即使启动一个空的Worker也意味着必须运行一个新的事件循环、一个新的JS上下文,这些都不是小操作),并避免它发出无用的网络请求(即使是404也会占用资源)

下面就是这样一个测试仪,使用字符串“blob://”
可以避免这两种情况

函数支持SWORKERTYPE(){
让支持=错误;
常数测试仪={
get type(){supports=true;}//它已被调用,受支持
};
试一试{
//我们使用“blob://”作为url以避免无用的网络请求。
//这将要么抛出铬
//要么在Firefox中触发错误事件
//这是完美的,因为
//我们不需要工人真正开始工作,
//在尝试加载脚本之前,已完成脚本类型检查。
const worker=新的worker('blob://',tester);
}最后{
返回支架;
}
}

log(supportsWorkerType())由于每个
initOptions
功能,您可以使用我所说的“字典陷阱”

它是一个对象,您可以在其上设置一个属性getter(您要测试的那个),并让这个getter在您正在测试的构造函数获取它时切换一个布尔值。这适用于许多这样的特性,工人的
类型在这里也不例外

对于Worker,您唯一需要注意的是避免实际启动一个Worker(即使启动一个空的Worker也意味着必须运行一个新的事件循环、一个新的JS上下文,这些都不是小操作),并避免它发出无用的网络请求(即使是404也会占用资源)

下面就是这样一个测试仪,使用字符串“blob://”
可以避免这两种情况

函数支持SWORKERTYPE(){
让支持=错误;
常数测试仪={
get type(){supports=true;}//它已被调用,受支持
};
试一试{
//我们使用“blob://”作为url以避免无用的网络请求。
//这将要么抛出铬
//要么在Firefox中触发错误事件
//这是完美的,因为
//我们不需要工人真正开始工作,
//在尝试加载脚本之前,已完成脚本类型检查。
const worker=新的worker('blob://',tester);
}最后{
返回支架;
}
}

log(supportsWorkerType())谢谢,这是一个很好的技巧!一个问题-即使内容安全策略阻止在
blob:
上创建工作人员,这是否仍保证有效?我刚刚试过,它似乎在Chrome中仍然有效,但我想这取决于浏览器在检查URL之前检查选项。@AshleysBrain是的,保证他们在尝试获取URL之前必须检查此属性。我喜欢这种技术,但我看不出它是如何测试“工人模块支持”的?这只测试辅助构造函数是否调用“type”属性getter,而不是辅助实现是否支持“import”(例如vs“importScripts”)。你是说只有支持“type:'module'”的浏览器才会检查类型吗?@user1969177是的,这是假设。只能是“经典”或“模块”之一。如果一个实现检查这个参数,那是因为它们支持这个模块。回答得很好!我将“blob://”更改为“data:,”(不要忘记逗号),这基本上是一个空的工作进程,以避免在运行此测试时https页面上出现安全警告,然后添加了一个terminate来停止空的工作进程:
new worker('data:,',tester.)。terminate()谢谢,这是一个很好的技巧!一个问题-即使内容安全策略阻止在
blob:
上创建工作人员,这是否仍保证有效?我刚刚试过,它似乎在Chrome中仍然有效,但我想这取决于浏览器在检查URL之前检查选项。@AshleysBrain是的,保证他们在尝试获取URL之前必须检查此属性。我喜欢这种技术,但我看不出它是如何测试“工人模块支持”的?这只测试辅助构造函数是否调用“type”属性getter,而不是辅助实现是否支持“import”(例如vs“importScripts”)。你是说只有支持“type:'module'”的浏览器才会检查类型吗?@user1969177是的,这是假设。只能是“经典”或“模块”之一。如果一个实现检查这个参数,那是因为它们支持这个模块。回答得很好!我将“blob://”更改为“data:,”(不要忘记逗号),这基本上是一个空的工作进程,以避免在运行此测试时https页面上出现安全警告,然后添加了一个terminate来停止空的工作进程:
new worker('data:,',tester.)。terminate()