How to use Browserify & iOS JavaScriptCore
Asked Answered
B

1

7

Given an Node.js module that does not rely on any Node.js functionality except modules (export/require) how do I access its functions from Objective-C or Swift using JS core?

Example "module":

var compute = function compute(number) {
  return 2 * number
};

exports.compute = compute;

Browserified bundle (bundle.js):

(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){

var compute = function compute(number) {
  return 2 * number
};

exports.compute = compute;

},{}]},{},[1])

Swift Code:

The code bellow seems not to be able to find the compute function within the bundle.js – the result is NaN.

var path = b.pathForResource("bundle", ofType: "js")
var source : String = NSString.stringWithContentsOfFile(path, encoding: NSUTF8StringEncoding, error: nil)
var context = JSContext()
context.evaluateScript(source)
let compute = context.objectForKeyedSubscript("compute")
let value = compute.callWithArguments([42])
var result = value.toNumber()

How to access "browserified" JavaScript functions?

Boice answered 29/6, 2014 at 14:45 Comment(1)
Did you solve this problem?Indignity
B
2

thejh's answer to a related question here explains that by default, browserify doesn't let you access the functions and modules from outside of the browserified code. His answer shows how you could define wrapper functions at the 'window' level which you can then call from ObjC / Swift

Brittaniebrittany answered 1/7, 2014 at 0:59 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.