# 关于 SharedWorker 踩的坑 (October 16, 2024)

## 开发方面
### `console.log`不方便
必须到 <chrome://inspect/#workers> 去点 inspect 才能看到它的`console.log`所以基本靠不了这个来 debug 了

相比之下 worker 就没问题

### `port`不好拿
1. 在 onconnect 时似乎有一个`event.ports`，但是往往只有一个 port，而且理论上就应该只有一个，搞不懂为什么是 ports 而不是 port
2. 在 message event 中，也有个 ports 的属性，但是永远是空的，得通过`event.currentTarget`来拿，真够奇怪的

## 部署方面
不知道是不是我的情况不太一样，反正我就是没法用非 module 的方式打包，所以`new SharedWorker()`的时候，必须指定 `{ type: "module" }`。另外，在`vite.config.ts`中也得改：

```typescript
export default defineConfig({
  worker: {
    format: "es",
    plugins() {
      return [sveltekit(), dir2json({ include: ["**/*.py", "**/*.j2"] })];
    },
  },
});
```

一是得指定 format 为 "es"，二是得重新指定一遍 plugins，搞得我 debug 了好久



---

这个项目源于我想把 pyodide 运行在 SharedWorker 中，这样一是启动时不会 block UI 了，二是多个标签页中可以共享一个 python 实例：

<img src="https://opengraph.githubassets.com/9d22557e1832bd9cdf60c0d7271a6ee5183729718400532f995149934059221d/promplate/pyth-on-line/pull/101" width="1200" title="null" crop="0,0,1,1" id="PsskL" class="ne-image">

我的想法是，以后允许三种方式启动 pyodide：

| | 主线程 | Worker | SharedWorker |
| --- | --- | --- | --- |
| 加载 | 会阻塞 | 只用等待 | 甚至可能不用等待 |
| 隔离性 | 共享 | 可以隔离 | 可以隔离但更蛮烦 |
| 可以打断 | 不可以 | 可以 | 可以但更麻烦 |
| 生命周期 | 页面 | 页面 | 不好控制 |
| 作用域 | window | DedicatedWorkerGlobalScope | SharedWorkerGlobalScope |


这么看来主要是生命周期不好管理，而且如果要隔离的话就很麻烦。以后再在这个分支上写吧

不过目前看来，除了麻烦，用 Worker 其实没什么优势 哈哈哈