Изолировать выполнение JavaScript

Одно из ограничений JS, которое больше всего беспокоит меня, — это плохая способность изолировать выполнение кода.

Я хочу иметь возможность контролировать контекст, в котором выполняется код. Что-то, что дает эффект, аналогичный тому, что Script.createContextи Script.runInContextв node.js делает (узел использует привязку к движку V8, поэтому я не могу эмулировать их реализацию).

Вот причина, по которой я хочу изолировать выполнение кода:

  1. Изолировать код от глобального пространства имен (объект window, а также DOM), но Однако мне нужно иметь возможность ссылаться на вызов функции для объектов, представленных в контексте, которые должны выполняться синхронно, что делает практически невозможным использование WebWorkerдля изоляции.
  2. Изолируя выполнение кода, можно также освобождать его определения, когда они больше не нужны (управление памятью).

Я знаю, что можно достичь частично изолированного выполнения, загрузив скрипт в iframe, однако этот подход очень тяжелый и использует много памяти для второго экземпляра DOM, который не нужен для того, что я пытаюсь сделать.

Мне нужно совместно использовать определение конструктора, а также определения объекта, которые являются общими для изолированных контейнеров/контекстов, которые оба должны выполняться в основном потоке пользовательского интерфейса.В основном я хочу использовать эти изолированные контейнеры для размещения плагинов/модулей (мини-приложений), каждое из которых представляет и динамически обновляет область просмотра, вызывая команды рисования для своего собственного объекта Context2D.

Если эти контейнеры не работают в основном потоке пользовательского интерфейса, будет крайне сложно проксировать такие вызовы, как ctx.measureText()и ctx.drawImage(). бесполезен, так как объекты изображения не могут быть созданы в Worker.

Кто-нибудь знает о будущей спецификации, которая сделает это возможным?

Существуют ли текущие (скрытые) API на стороне браузера, которые можно использовать для достижения этой цели?

Не лучше ли использовать виртуальную машину, такую ​​как Dart VM от Goggle, а также повторно внедрить мою текущую кодовую базу? Моя текущая кодовая база составляет чуть больше 20 000 строк кода.

Не лучше ли повторно реализовать структуру в *

13
задан Ry- 29 April 2012 в 23:00
поделиться