在ExtendScript中使用npm包

3

更新

我完成了所有工作,使得InDesign CC 2018/2019 CEP面板完全运行。具体详情请参见https://github.com/theasci/cep-boostrap。我已成功将npm包应用于CEP面板的客户端和主机部分以及脚本面板中。然而,node和ExtendScript版本都非常老旧。有关更多详细信息,请参阅repo READMEs


原始问题

我有一大堆的AppleScript脚本,主要是针对InDesign CC 2018的,现在我想重写成ExtendScript(以便于移植)。最近预发布了 ExtendScript Debugger for Visual Studio Code,我已经让它工作了。我能够通过内置的$.write()alert()在InDesign中记录到控制台并显示警报。
我想使用npm包来完成繁重的工作,但我无法正确加载它们。例如,我想加载相当简单的node-logger(与winston相比),但是即使加载了所有我能找到的shims,似乎也不起作用。
这是我的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没有需要拉入node模块的require功能。同时,人们似乎朝另一个方向发展:从node开始,然后执行ExtendScript。
问题:
  1. 人们是否将最新版本的npm包加载到ExtendScript中?如果是,怎么做?
  2. 我应该这样做吗?如果不是,使用npm模块以自动化Adobe产品中的操作的最佳方法是什么?
环境:
  • Mac OSX El Capitan 10.11.6(也在High Sierra上尝试过,结果相同)
  • Visual Studio Code 1.31.1
  • ExtendScript Debugger Plugin for VSCode 0.2.4
  • npm config list显示user-agent = "npm/6.5.0 node/v11.9.0 darwin x64"
提前感谢您对这个可怜人的同情。
1个回答

1
ExtendScript 是 ES3,所以我不确定这些猴子补丁是用什么魔法使得这种古老的格式能够像 Node 一样运行。然而,在你的情况下似乎有些问题。 由于 node 的东西属于完全不同的 JavaScript,所以这种方法可能行不通。
你可能需要一个单独的 node 应用程序来与 jsx 脚本交互。主要是通过在 InDesign 上运行 jsx 脚本来操纵它,这些脚本可能会带有参数并将结果返回给它。
这在某种程度上依赖于能够复制 AppleScript 的“do javascript”命令,该命令可在“tell an adobe application”块内使用,并可以执行动态生成的带有参数的 JavaScript 并同步返回结果。
我不确定如何确保所有用户在其系统上安装了正确的项-用于运行 Node。也许他们都必须制作某种安装程序。例如,当编写简单的 jsx 脚本时,您只需向用户提供脚本即可,但是对于这种假设设置,我目前还不清楚。

或者,更高级的选择是使用CEP扩展。它可以在其中使用Node和浏览器,并且还可以运行jsx脚本并获取结果等。这样做的主要障碍是需要大量工作才能使整个项目正常工作。一开始会有非常庞大的信息量,并且可能比制作简单的自定义节点应用程序使用jsx例程需要更多的工作量。

如果您找到了一种为用户提供易于安装跨平台node-jsx应用程序的方法,则可以快速提供强大的脚本应用程序以满足那些内置浏览器UI的所有功能都过于复杂的用途的用户需求。例如,如果您希望在Node中进行一些应用程序控制,而jsx无法完成,并且能够通过ExtendScript ScriptUI或其他UI方式来实现,则可以很好地解决问题。


谢谢您的回复。那么,您的意思是这不容易。:-/ 您是否有用于使这些潜在解决方案工作的工具/存储库链接? - spyle
好的,Node 是 ES5 或更高版本,并具有事件功能,而 JSX 除了不适用于 Node 的类型之外,没有其他事件。但是,在 Node 中你想要实现什么,使用常规的 JSX 又无法实现呢? - Vasily Hall
我想在JSX中访问npm模块。经过我的阅读和调查,我应该使用Node并与JSX交互。 - spyle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接