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”类测试,但是它在morse-pro库中遇到了这个JavaScript错误:
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中运行此库的方向.
解决方法
首先,正如@estus建议的那样,我使用NPM安装了库,它将其转换为ES5但不解析依赖关系.所以它仍然是一堆独立的文件,它们使用require和export关键字相互调用,浏览器和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
并使用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')"))
打印“.- -… -.-.”正如你所料.
这样做的缺点是您必须手动添加要导出到导出文件的任何类和函数.不过,这似乎是最简单的方法.如果有更好的方法,我很乐意听到它!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。