【问题标题】:Use npm package in ExtendScript在 ExtendScript 中使用 npm 包
【发布时间】:2019-02-15 02:33:30
【问题描述】:

更新

我为获得功能齐全的 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 的预发布,我已经让堆栈开始工作了。我可以通过 InDesign 使用内置的 $.write()alert() 登录控制台并显示警报。

我想利用 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. 我应该这样做吗?如果没有,使用带有 ExtendScript 的 npm 模块来自动化 Adob​​e 产品中的内容的最佳方法是什么?

环境

  • Mac OSX El Capitan 10.11.6(也在 High Sierra 上尝试过,结果相同)
  • Visual Studio 代码 1.31.1
  • 用于 VSCode 0.2.4 的扩展脚本调试器插件
  • npm config listuser-agent = "npm/6.5.0 node/v11.9.0 darwin x64"

提前感谢您对这个可怜的灵魂的怜悯。

【问题讨论】:

    标签: node.js macos npm adobe extendscript


    【解决方案1】:

    ExtendScript 是 ES3,所以我不确定这些猴子补丁使用了哪种魔法来让这种古老的格式像 Node.js 一样运行。在我看来,在你的情况下,这方面的一些事情是失败的。 由于节点内容是完全不同类型的 javascript,因此这种方法很可能是不可能的。

    您可能有一个单独的节点应用程序可以与您的 jsx 脚本交互。主要是,它可以通过在其上运行可能携带参数并向其返回结果的 jsx 脚本来操作您的 InDesign。

    这在某种程度上取决于能否复制 AppleScript 的“do javascript”命令,该命令在“告诉 adobe 应用程序”块中可用,并且可以使用参数执行动态制作的 javascript,并同步返回结果。

    我不确定如何确保所有用户都在他们的系统上安装了正确的项目 - 用于运行 Node.js。也许他们都必须制作某种安装程序。例如,当编写一个简单的 jsx 脚本时,您所要做的就是将脚本提供给用户,但是对于这个假设的设置,我目前还不清楚。

    或者,下一步是一个 CEP 扩展,它可以使用 Node 和其中的浏览器,还可以运行 jsx 脚本并获取结果等。这样做的主要障碍是完成整个项目工作,起初它包含大量信息,并且可能比制作使用 jsx 例程的简单自定义节点应用程序带来更多开销。

    如果您找到一种向用户提供易于安装的跨平台 node-jsx 应用程序的方法,那么这可能是向用户提供强大的脚本应用程序的一种快速方法,在这种情况下,在浏览器 UI 中,对于预期用途而言,需要付出太多努力。例如,如果您希望在 Node 中做一些 jsx 无法做到的应用程序控制,并且能够使用 ExtendScript ScriptUI 或其他 UI 方式来解决问题,那么它会很好地工作。

    【讨论】:

    • 感谢您的回复。太棒了,你说这不容易。 :-/ 您是否碰巧拥有指向您用来使这些潜在解决方案发挥作用的工具/存储库的链接?
    • 嗯,Node 是 ES5 或更高版本并且有事件,而 JSX 没有事件,除了不适用于 Node 的类型。但是,您希望在 Node 中完成哪些常规 JSX 无法完成的任务?
    • 我想访问 JSX 中的 npm 模块。我阅读和调查的越多,我应该使用 Node 并与 JSX 交谈。
    猜你喜欢
    • 1970-01-01
    • 2019-06-30
    • 2015-01-22
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    相关资源
    最近更新 更多