Primordials тормозят развитие Node.js, мешают поддерживать код платформы, быстро онбордить новых контрибьюторов, искать и исправлять баги, влияют на деоптимизацию кода, и в итоге все работает медленнее.Primordials - это сохраненные на старте ссылки на чистые встроенные объекты и методы JS. Они нужны, чтобы userland-патчи Array/Object/Promise не ломали internals. Плюсы: надежность. Но это делается не для безопасности, а чтобы миксины и полифилы не влияли на код внутри Node.js. Минусы: более сложный код, сложнее контрибьютить и искать баги, возможна деоптимизация.Как это выглядит в коде ноды:
const { ArrayFromAsync, PromisePrototypeThen } = primordials;
// ...
PromisePrototypeThen(
ArrayFromAsync(new Glob(pattern, options).glob()),
(res) => callback(null, res),
callback,
);Но есть альтернативные решения, например: разделить контекст выполнения на два изолированных V8-контекста во время старта: один контекст для userland-кода, другой для внутреннего кода Node.js. Userland-код может свободно monkey-патчить
Array, Object, Promise, Error, но эти изменения не будут влиять на внутренние копии, которые использует Node.js core.Плюсы:
* Внутренний код становится ближе к обычному JavaScript
* Ниже порог входа для контрибьюторов
* Меньше runtime-накладных расходов
* Меньше проблем с оптимизациями V8
Минусы:
* Встроенные классы из разных контекстов не идентичны:
Error !== context.Error* Проверки
instanceof могут ломаться на границе контекстов* Обработка ошибок становится сложнее
* Внутренние API, которые передают объекты в userland, требуют специальных решений
* Контексты тоже не являются security-механизмом
Когда внутренние API передают объекты в userland, например:
.on('error', (error) => console.log(error instanceof Error))это вернет false. Но мы можем создавать эту ошибку через:
new userland.Error('message')Тут мое предложение решения: https://github.com/nodejs/TSC/issues/1439#issuecomment-4329370385
Тут критика
primordials от специалиста по оптимизации: https://github.com/nodejs/TSC/issues/1438Поддержите инициативу, добавьте свои варианты решений, если есть идеи, и критику предложенных решений.