CoffeeScript 和 Service Workers

问题描述 投票:0回答:1

尝试在 CoffeeScript 中注册服务工作者时,最新的 Chrome 浏览器似乎不支持服务工作者,我知道这不是真的。这是我的 app.coffee,它被转换为 JavaScript 并加载到我的网页上:

registerServiceWorker = () =>
    if 'serviceWorker' in navigator
        await navigator.serviceWorker.register '/service-worker.js'
        console.log "Service Worker Registered"
    else
        console.log "No service worker support"

registerServiceWorker()

这是生成的 JavaScript:

// Generated by CoffeeScript 2.7.0
(function() {
  var registerServiceWorker,
    indexOf = [].indexOf;

  registerServiceWorker = async() => {
    if (indexOf.call(navigator, 'serviceWorker') >= 0) {
      await navigator.serviceWorker.register('/service-worker.js');
      return console.log("Service Worker Registered");
    } else {
      return console.log("No service worker support");
    }
  };

  registerServiceWorker();

}).call(this);

JavaScript 控制台显示“No service worker support”。我的 Chrome 版本是版本 111.0.5563.65(官方构建)(64 位)。它在 Windows 11 上运行。

如我所料,如果我将“if navigator.serviceWorker”中的“if 'serviceWorker'”更改为“if navigator.serviceWorker”,那么一切正常。但是,尽管我有解决方法,但我开始怀疑在 CoffeeScript 中使用“X in Y”是否安全。有人有解释吗?

coffeescript service-worker
1个回答
0
投票

你应该使用

of
而不是
in
.

这可能是遗留问题,因为 coffeescript 使用

in
进行数组迭代,而
of
用于对象。这些存在运算符是为了匹配现有的迭代器语法,这使得它与对象的
in
和数组的
of
的 javascript 相反。

我个人会使用

if navigator?.serviceWorker
,因为 JS
in
不会检查该值是否为空或在原型上定义。 在您的用例中,这些例外不适用,因此如果您愿意,您可以安全地使用
in

来自 coffeescript.org 上的文档

您可以使用 in 来测试数组是否存在,以及 of 来测试 JavaScript 对象键是否存在。

...

a in b
变成
[].indexOf.call(b, a) >= 0

a of b
变成
a in b

© www.soinside.com 2019 - 2024. All rights reserved.