Использовать пакет npm в ExtendScript

Обновить

Вся моя работа по созданию полностью функционирующей панели InDesign CC 2018/2019 CEP находится на https://github.com/theasci/cep-boostrap. Мне удалось успешно заставить пакеты npm работать как в клиентской, так и в хостовой части панели CEP, а также в панели сценариев. Однако версии node и ExtendScript ужасно устарели. См. репозиторий README. Больше подробностей


Исходный вопрос

У меня есть большая коллекция сценариев в AppleScript, в основном для InDesign CC 2018, которые я пытаюсь переделать в ExtendScript (для переносимости). Благодаря недавнему предварительному выпуску отладчика ExtendScript для кода Visual Studio я заставил стек работать. Я могу войти в консоль и отображать оповещения, используя встроенные функции $.write() и alert() через InDesign.

Я хотел бы использовать пакет npm для тяжелой работы, но мне не удается заставить их загружаться должным образом. Например, я хочу загрузить довольно простой узел-логгер (по сравнению с winston), но загрузка всех прокладок, которые я могу найти, не работает.

Вот пример моего файла index.jsx

// Any attempt to write to a read-only property causes a runtime error.
$.strict = true

// Run this script within the InDesign application
#target indesign

var rootDir = File($.fileName).path;

// Load ExtendScript monkey patches to allow for Node.js related functionality
$.evalFile(rootDir + '/vendor/node_modules/extendscript-es6-shim/index.js'); //loads fine
$.evalFile(rootDir + '/vendor/node_modules/extendscript.prototypes/lib/extendscript.prototypes.js'); //loads fine
$.evalFile(rootDir + '/vendor/es-require/lib/require.js'); //loads fine
$.evalFile(rootDir + '/vendor/node_modules/node-logger/logger.js'); //Error: require is not a function

alert("If you're here, it's working!");

Мой .vscode/launch.json выглядит так

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "extendscript-debug",
            "request": "launch",
            "name": "Project name",
            "program": "${workspaceFolder}/source/index.jsx",
            "targetSpecifier": "indesign-13.064", 
            "engineName": "main",
        }
    ]
}

Как видите, я немного запутался, так как node и npm для меня новые. Похоже, что у ExtendScript нет требуемой функциональности, необходимой для извлечения узловых модулей. Также кажется, что люди идут в другом направлении: начинают в узле, а затем выполняют ExtendScript.

Вопросы

  1. Загружают ли люди последние версии пакетов npm в ExtendScript? Если да, то как?
  2. Должен ли я это сделать? Если нет, то как лучше всего использовать модули npm с ExtendScript для автоматизации вещей в продуктах Adobe?

Окружающая среда

  • Mac OSX El Capitan 10.11.6 (также пробовал на High Sierra, с тем же результатом)
  • Код Visual Studio 1.31.1
  • Плагин отладчика ExtendScript для VSCode 0.2.4
  • npm config list говорит user-agent = "npm/6.5.0 node/v11.9.0 darwin x64"

Заранее спасибо за то, что пожалели эту бедную душу.


person spyle    schedule 15.02.2019    source источник


Ответы (1)


ExtendScript — это ES3, поэтому я не уверен, какую магию используют эти обезьяньи патчи, чтобы заставить этот архаичный формат работать как Node. Хотя мне кажется, что что-то в этом не так в вашем случае. Поскольку материал node находится в совершенно другом виде javascript, вполне вероятно, что этот подход невозможен.

Вероятно, у вас может быть отдельное приложение узла, которое может взаимодействовать с вашими jsx-скриптами. В основном, он может манипулировать вашим InDesign, запуская на нем сценарии jsx, которые, возможно, содержат аргументы и возвращают ему результаты.

Это как бы зависит от возможности копировать команду AppleScript «do javascript», которая запускается, доступна в блоке «рассказать приложение Adobe» и может выполнять динамически созданные javascripts с аргументами, а также возвращать результаты синхронно.

Я не уверен, как убедиться, что у всех пользователей в их системах установлены нужные элементы — для запуска Node. Может им всем надо сделать какой-то установщик. Например, при написании простого сценария jsx все, что вам нужно сделать, это предоставить сценарий пользователям, но с этой гипотетической настройкой мне это пока непонятно.

В качестве альтернативы, следующим шагом является расширение CEP, которое может использовать Node и браузер в нем, а также может запускать сценарии jsx и получать результаты и т. д. Основным препятствием для этого является объем работы, необходимый для того, чтобы весь проект работал, поначалу это огромный объем информации, и, возможно, это требует гораздо больше накладных расходов, чем создание простого пользовательского приложения node, использующего подпрограммы jsx.

Если вы найдете способ предоставить пользователям простое в установке кросс-платформенное приложение node-jsx, это может стать быстрым способом предоставления пользователям мощных скриптовых приложений в тех случаях, когда вся яркость встроенного пользовательского интерфейса браузера слишком много усилий для предполагаемого использования. Например, если вы хотите сделать какой-то элемент управления приложением в Node, который не может сделать jsx, и можете обойтись с помощью ExtendScript ScriptUI или других средств для пользовательского интерфейса, тогда это сработает хорошо.

person Vasily Hall    schedule 15.02.2019
comment
Спасибо за ответ. Оооо, вы говорите, что это не легко. :-/ У вас случайно нет ссылок на инструменты/репозитории, которые вы использовали, чтобы заставить эти потенциальные решения работать? - person spyle; 15.02.2019
comment
Что ж, Node — это ES5 или выше, и в нем есть события, тогда как в JSX нет событий, кроме тех, которые не предназначены для Node. Но что вы хотите сделать в Node, чего не можете сделать с помощью обычного JSX? - person Vasily Hall; 15.02.2019
comment
Я хотел бы иметь доступ к модулям npm в JSX. Чем больше я читаю и исследую, тем больше я должен использовать Node и говорить с JSX. - person spyle; 16.02.2019