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

罗伯特

我正在尝试使用Swift的JavaScriptCore框架来利用现有的使用ES6模块的JavaScript库。特别是Stephen C Phillips撰写的morse-pro我已将文件添加到Xcode游乐场,然后使用此代码加载库并在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库中令人窒息:

语法错误:意外的标记'*'。import调用只需要一个参数。

该错误似乎是由morse-pro-message.js中的以下行引起的:

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

我相信它正在尝试将所有morse-pro文件作为模块导入。

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

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

罗伯特

在黑暗中无所事事后,我找到了一种无需手动更改即可将库提供给Swift的方法。

首先,按照@estus的建议,我使用NPM安装了该库,该库将其转换为ES5,但没有解决依赖关系。因此,仍然是一堆相互独立的文件,它们之间使用requireexport关键字进行调用,浏览器和JavaScriptCore都无法理解它们。

然后,我使用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

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

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章