能否在iOS的JSContext或WKWebView中运行TypeScript代码?
在iOS的JSContext/WKWebView里跑TypeScript代码的解决办法
为啥直接用TS文件会返回undefined?
JSContext(JavaScriptCore框架)和WKWebView里的JS引擎只认原生JavaScript,TypeScript是JS的超集,带了类型注解、接口这些引擎看不懂的语法,直接加载TS文件会解析出错,最后就返回undefined了。
解决思路:先把TS编译成JS再用
1. 手动编译(用TypeScript官方编译器tsc)
- 先装TypeScript:全局装的话用
npm install -g typescript,项目里装就用npm install typescript --save-dev - 写你的TS代码(比如
shared-lib.ts):
function calculate(param1: number, param2: number): number { return param1 + param2; } // 必须把函数挂到全局作用域,不然JSContext/WKWebView找不到 (window as any).calculate = calculate;
- 编译TS到JS:
- 先生成配置文件:
tsc --init,然后改几个关键配置:"target": "ES5"(兼容iOS老版本)"outFile": "./shared-lib.js"(输出合并后的JS文件)"module": "none"(避免模块系统导致全局访问不到函数)
- 执行编译命令:
tsc shared-lib.ts,就能得到shared-lib.js
- 先生成配置文件:
- 把编译好的
shared-lib.js加到iOS项目里,和你之前用JS文件的方式一样
2. 复杂场景用构建工具(Webpack/Vite)
如果你的共享库依赖多、代码拆分复杂,用Webpack或Vite打包更省心:
- 配置打包工具把TS打包成IIFE(立即执行函数)或UMD格式,确保函数暴露到全局
- 打包后的JS文件直接丢iOS项目里用就行
集成到iOS项目后的代码示例
按你之前的Swift逻辑,换成编译后的JS文件就行:
let jsContext = JSContext() // 加载编译好的shared-lib.js guard let jsURL = Bundle.main.url(forResource: "shared-lib", withExtension: "js"), let jsScript = try? String(contentsOf: jsURL, encoding: .utf8) else { return } jsContext.evaluateScript(jsScript) jsContext.setObject(10, forKeyedSubscript: NSString(string: "param1")) jsContext.setObject(20, forKeyedSubscript: NSString(string: "param2")) if let resultJSValue = jsContext.evaluateScript("calculate(param1, param2);"), let result = resultJSValue.toInt32() { print("计算结果:\(result)") // 会输出30 }
WKWebView里的用法注意
在WKWebView里用的话,要么在加载的HTML里引入编译后的JS,要么直接用evaluateJavaScript执行:
let webView = WKWebView(frame: .zero) guard let jsURL = Bundle.main.url(forResource: "shared-lib", withExtension: "js"), let jsScript = try? String(contentsOf: jsURL, encoding: .utf8) else { return } // 先加载JS代码 webView.evaluateJavaScript(jsScript) { _, error in if let error = error { print("加载JS失败:\(error)") return } // 调用calculate函数 webView.evaluateJavaScript("calculate(10,20)") { result, error in if let result = result as? Int { print("WKWebView计算结果:\(result)") } } }
内容的提问来源于stack exchange,提问作者balazs630
相关产品推荐
相关产品推荐

