
Простой способ запускать доверенный пользовательский JavaScript в Node.js
alexander_kubarski 3 минуты назад Простой способ запускать доверенный пользовательский JavaScript в Node.js Простой 12 мин 22 JavaScript * Недавно я опубликовал большую обзорную статью о том, как несколько лет развиваю...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Значимый прорыв формирует отрасль ИИ: alexander_kubarski 3 минуты назад Простой способ запускать доверенный пользовательский JavaScript в Node. js Простой 12 мин 22 JavaScript * Недавно я опубликовал большую обзорную статью о том, как несколько лет развиваю свой пет-проект, который постепенно превратился в собственную Function-as-a-Service платформу. Она позволяет принимать пользовательский JavaScript, Python или Go, запускать его в изолированном окружении и управлять такими функциями почти как в небольшом облаке.
Подробнее об истории проекта и его архитектуре можно прочитать в предыдущей статье тут. В этот раз я хочу разобрать более узкую тему и рассказать, с чего вообще начинались мои эксперименты с выполнением пользовательского JavaScript в Node. Мы посмотрим на самые простые встроенные инструменты, а также проверим, способен ли V8 оптимизировать код, созданный динамически во время работы приложения.
Технические детали
Сразу обозначу важное ограничение. Все примеры ниже предназначены исключительно для запуска доверенного кода. То есть мы заранее контролируем источник программы и можем гарантировать, что она не будет пытаться читать файлы, обращаться к переменным окружения, подключаться к базе данных, завершать процесс, бесконечно занимать процессор или каким-либо другим способом атаковать приложение и инфраструктуру.
Покажу способы, как частино(! Зачем вообще выполнять JavaScript из строкиНеобходимость динамически выполнять JavaScript возникает в самых разных системах. Это могут быть: пользовательские обработчики; правила маршрутизации; формулы и преобразования данных; плагины; сценарии автоматизации; фоновые задачи; функции в serverless-платформе.
В самом простом случае приложение получает строку:const source = ` return input. value * 2; `;и должно превратить её в вызываемую функцию. В JavaScript для этого есть два очевидных инструмента:eval(source);и:new Function(source);Оба выполняют код, созданный во время работы программы, но ведут себя по-разному.
Отраслевые последствия
Почему прямой eval обычно является плохим выборомДумаю сюда можно сразу вставить кусочек из MDN. Предупреждение - никогда не используйте eval()Прямой вызов eval выполняет код в текущем лексическом окружении:function executeUserCode(source) { const secret = "internal-token"; return eval(source); } console. log(executeUserCode("secret ; // internal-tokenДинамический код видит локальные переменные вызывающей функции.
Он также может изменять их:function example() { let value = 10; eval("value = 100 return value; } console. log(example()); // 100Это создаёт сразу несколько проблем. Во-первых, становится сложнее понимать зависимости кода.
Обычная функция явно получает аргументы, а код внутри eval может обращаться практически к любому имени из окружающей области. Во-вторых, это усложняет работу движка. V8 должен учитывать, что строка внутри eval может обратиться к локальным переменным или изменить их значения.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





