Swift   发布时间:2022-03-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在Swift的JavaScriptCore中导入模块?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我正在尝试使用 Swift的 JavaScriptCore框架来利用使用ES6模块的现有JavaScript库.具体来说, morse-pro由Stephen C Phillips完成.我已将文件添加到Xcode游乐场,然后使用此代码加载库并在JavaScript上下文中运行它: import JavaScriptCore var jsContext = JSContext() // set up
我正在尝试使用 SwiftJavaScriptCore框架来利用使用ES6模块的现有JavaScript库.具体来说,morse-pro由Stephen C Phillips完成.我已将文件添加到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”类测试,但是它在morse-pro库中遇到了这个JavaScript错误

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

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

我相信它试图将所有morse-pro文件作为模块导入.

我不熟悉ES6模块,但该库似乎适用于普通JavaScript环境中的其他人.我在Swift中加载库的方式有问题吗?或者模块是JavaScriptCore不支持功能吗? (documentation只是说它支持“JavaScript”,并没有更具体.)

我很感激任何建议,指出我在JavaScriptCore VM中运行此库的方向.

解决方法

在黑暗中笨手笨脚之后,我发现了一种方法可以让Swift可以使用它,而无需手动更改它.

首先,正如@estus建议的那样,我使用NPM安装了库,它将其转换为ES5但不解析依赖关系.所以它仍然是一堆独立的文件,它们使用require和export关键字相互调用,浏览器和JavaScriptCore都不了解.

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

@H_793_21@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')"))

打印“.- -… -.-.”正如你所料.

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

大佬总结

以上是大佬教程为你收集整理的如何在Swift的JavaScriptCore中导入模块?全部内容,希望文章能够帮你解决如何在Swift的JavaScriptCore中导入模块?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。