You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在iPhone的Content View中运行导入npm库的JavaScript脚本

问题排查与解决方案

核心错误原因

你当前代码返回undefined的根本原因是:JavaScriptCore(JSContext)仅提供基础的ECMAScript运行环境,没有内置Node.js专属的运行时能力,不支持require模块加载语法,也没有node_modules路径查找逻辑,执行到require('node-rsa')时就会抛出异常,导致函数没有返回值。


问题1:Xcode项目中是否可以导入JS模块?

可以,但不能直接使用Node.js的模块加载逻辑,需要做以下适配:

  • 不能直接调用require加载node_modules内的依赖,需要用前端打包工具(webpack/rollup/esbuild)将你写的JS逻辑和所有依赖(包含node-rsa及其所有子依赖)打包为单份无Node环境依赖的UMD/IIFE格式JS文件,打包时要配置构建目标为通用JS环境,排除Node专属API的依赖。
  • 打包完成后将生成的单JS文件拖入Xcode项目,勾选Copy items if needed和对应APP的target,在Swift中读取该文件内容后再注入JSContext执行即可。

适配后的Swift代码示例:

import Foundation
import SwiftUI
import JavaScriptCore

class Cube {
    func doJS(text: String) -> String? {
        // 读取打包好的JS bundle
        guard let bundleUrl = Bundle.main.url(forResource: "rsa-bundle", withExtension: "js"),
              let jsBundleContent = try? String(contentsOf: bundleUrl),
              let context = JSContext() else {
            return nil
        }
        // 执行bundle加载所有依赖和全局方法
        context.evaluateScript(jsBundleContent)
        // 捕获JS执行错误方便排查
        context.exceptionHandler = { context, error in
            print("JS执行错误: \(error?.toString() ?? "未知错误")")
        }
        guard let testFunc = context.objectForKeyedSubscript("testFunct") else {
            return nil
        }
        return testFunc.call(withArguments: [text]).toString()
    }
}

struct ContentView: View {
    var body: some View {
        Text(Cube().doJS(text: "Hello, world!") ?? "No result")
            .fontWeight(.black)
            .foregroundColor(Color.green)
            .padding()
    }
}

问题2:该功能能否在iPhone上正常运行?

可以。只要你打包后的JS代码没有调用Node专属API、浏览器DOM/BOM API,纯算法逻辑在iOS端的JavaScriptCore中完全兼容,性能和Safari内置JS引擎一致,RSA密钥生成这类纯计算逻辑可以正常运行。

注意事项

如果打包后还是报crypto相关API不存在,是因为node-rsa依赖Node.js原生的crypto模块,你可以替换为纯JS实现的RSA库,不需要依赖原生模块,打包后可以直接在JSContext中运行。


内容的提问来源于stack exchange,提问作者Konstantin Petrov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 23:57:03