4.2Kпросмотров
27 октября 2025 г.
Score: 4.6K
Top-level await оказывается фатально сломан в Сафари https://x.com/jaffathecake/status/1982542211712712878
https://bugs.webkit.org/show_bug.cgi?id=242740 Сафари взрывает импорт с ReferenceError, если модуль с top-level await внутри импортируется одновременно больше чем одним модулем Чтобы руками получить такой баг, нужно написать чуток странный код типа // utils.js
await new Promise((resolve) => setTimeout(resolve, 100));
export const utils = "utils"; // common.js
const { utils } = await import("./utils.js");
export const common = utils;
console.log("common", { utils }); // entry.js
const [{ utils }, { common }] = await Promise.all([import("./utils.js"), import("./common.js")]);
console.log("a", { common, utils }); Но проблема в том, что ровно такой код может оказаться в бандле, если сборщик опирается на нативную поддержку ESM => неожиданным образом отстреливает Bun, причем даже в своем рантайме, т.к. JS-движок там тоже из под Сафари
https://github.com/oven-sh/bun/issues/2927 Теоретически может отстрелить и Vite, но ишью на эту тему я у них не нашел + кажется, они top-level await всё таки как-то транспилируют в продакшен-сборке