gpt4 book ai didi

javascript - 如何在 Swift 的 JavaScriptCore 中导入模块?

转载 作者:搜寻专家 更新时间:2023-10-30 21:54:29 25 4
gpt4 key购买 nike

我正在尝试使用 Swift 的 JavaScriptCore 框架来利用现有的使用 ES6 模块的 JavaScript 库。具体来说,morse-pro斯蒂芬·C·菲利普斯着。我已将文件添加到 Xcode playground,然后使用此代码加载库并在 JavaScript 上下文中运行它:

import JavaScriptCore
var jsContext = JSContext()
// set up exception handler for javascript errors
jsContext?.exceptionHandler = { context, exception in
if let exc = exception {
print("JS Exception:", exc.toString())
}
}
// read the javascript files in and evaluate
if let jsSourcePath = Bundle.main.path(forResource: "morse-pro-master/src/morse-pro-message", ofType: "js") {
do {
let jsSourceContents = try String(contentsOfFile: jsSourcePath)
jsContext?.evaluateScript(jsSourceContents)
} catch {
print(error.localizedDescription)
}
}

这种方法适用于简单的“Hello world”类测试,但它会因以下 JavaScript 错误而阻塞 morse-pro 库:

SyntaxError: Unexpected token '*'. import call expects exactly one argument.

错误似乎是由 morse-pro-message.js 中的这一行引起的:

import * as Morse from './morse-pro';

我认为这是在尝试将所有 morse-pro 文件作为一个模块导入。

我不熟悉 ES6 模块,但该库似乎可以在正常的 JavaScript 上下文中为其他人工作。我在 Swift 中加载库的方式有问题吗?还是模块是 JavaScriptCore 不支持的功能? (documentation 只是说它支持“JavaScript”,没有更具体的说明。)

如果有任何建议可以指导我在 JavaScriptCore VM 中运行该库,我将不胜感激。

最佳答案

在黑暗中摸索了很多次之后,我找到了一种无需手动更改库即可让 Swift 可用的方法。

首先,正如@estus 所建议的,我使用 NPM 安装了库,它将它转换为 ES5 但不解析依赖项。所以它仍然是一堆独立的文件,它们通过浏览器和 JavaScriptCore 都无法理解的 requireexport 关键字相互调用。

然后我用了Browserify将所有依赖项捆绑到一个文件中,以便 JavaScriptCore 可以理解它。 Browserify 的正常运行隐藏了所有代码,因此我使用“--standalone”标志告诉它使标记的函数可用。如果直接导出 ES5 文件,它会创建一个通用对象并将导出的函数放在 .default 下。我希望它们更容易访问,所以我创建了一个新文件来列出导出,然后在其上运行 Browserify。例如,一个名为“morse-export.js”的文件包含:

module.exports.MorseMessage = require('./lib/morse-pro-message.js').default;

然后我像这样在上面运行 Browserify:

browserify ./morse-export.js --standalone Morse > ./morse-bundle.js

并使用 Bundle.main.path(forResource) 在我的 Swift 代码中包含 morse-bundle.js 文件。现在我可以使用 Morse.MorseMessage 访问 MorseMessage 类,所以回到 Swift 中:

jsContext?.evaluateScript("var morseMessage = new Morse.MorseMessage()")
print(jsContext!.evaluateScript("morseMessage.translate('abc')"))

打印“.- -... -.-”如您所料。

这样做的缺点是您必须手动将要导出的任何类和函数添加到导出文件中。不过,这似乎是最简单的方法。如果有更好的方法,我很想听听!

关于javascript - 如何在 Swift 的 JavaScriptCore 中导入模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48354804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com