2016-06-29 12 views
0

Ich versuche, ein iOS Titanium-Modul mit einem vorkompilierten CommonJS-Modul zu erstellen. Da die Readme-Datei sagt:iOS CommonJS-Modul gibt "undefined ist kein Konstruktor" Fehler

function ModuleTest(url){ 
if(url){ 
    return url; 
} 
} 
exports.ModuleTest = ModuleTest; 

Ich verwende (auch versucht, mit 5.3.0.GA) das 5.1.2.GA SDK:

All JavaScript files in the assets directory are IGNORED except if you create a file named "com.moduletest.js" in this directory in which case it will be wrapped by native code, compiled, and used as your module. This allows you to run pure JavaScript modules that are pre-compiled.

ich die Datei wie folgt erstellt haben und ich kann das Modul erfolgreich entweder mit python build.py oder titanium build --platform iOS --build-only bauen. in meinem Test-App Tun Dann:

var test = require('com.moduletest'); 
var url = new test.ModuleTest('http://url'); 

gibt mir diese Fehlermeldung:

undefined is not a constructor

undefiniert ist kein Konstruktor. Ich habe viele Alternativen versucht, aber nichts scheint zu funktionieren und ich habe keine Hilfe bei der Dokumentation über vorkompilierte JS-Module für iOS gefunden. Eigentlich funktioniert der gleiche Prozess gut für Android! Haben Sie eine Idee warum?

Meine Umgebung:

XCode 7.3.1

Betriebssystem Name - Mac OS X Version - 10.11.5 Architektur - 64bit # CPUs - 8 Speicher - 16.0GB

Node.js Node.js Version - 0.12.7 npm Version - 2.11.3

Appcelerator CLI Installer - 4.2.6 Core-Package - 5.3.0

Titanium CLI CLI Version - 5.0.9 Knoten-appc Version - 0.2.31

Vielleicht ist das etwas im Zusammenhang mit meiner Knotenversion oder appc CLI, nicht sicher =/

Vielen Dank!

+0

Wo haben Sie Ihre Datei 'com.moduleter.js' abgelegt? –

+0

Hallo Brenton, ich habe es in den Ordner Assets moduleTest/assets/com.moduletest.js http://i.imgur.com/4OW2i86.png –

+0

Für commonjs-Module können Sie sie einfach direkt in Ihr App-Projekt einfügen. Versuchen Sie, diese Datei in '/app/lib/com.moduletest.js 'Ihrer App zu speichern. –

Antwort

0

ich ein etwas anderes Muster, das ausgezeichnet funktioniert:

Zuerst ein kleiner Ausschnitt aus meinem „Modul“:

Stopwatch = function(listener) { 
    this.totalElapsed = 0; // * elapsed number of ms in total 
    this.listener = (listener != undefined ? listener : null); // * function to receive onTick events 
}; 

Stopwatch.prototype.getElapsed = function() { 
    return this.totalElapsed; 
}; 

module.exports = Stopwatch; 

Und dann ist dies die Art, wie ich es verwenden:

var StopWatch = require('utils/StopWatch'); 
var stopWatch = new StopWatch(listenerFunction); 
console.log('elapsed: ' + stopWatch.getElapsed()); 
3

Es gibt 2 Lösungen.

1) Legen Sie es nicht in Assets, sondern in den Ordner /app/lib, wie andere erwähnt haben.

2) wickeln Sie es als eine tatsächliche Commonjs Modul, wie die module I wrote

In beiden Fällen können Sie nur require('modulename') verwenden.In Fall 2 müssen Sie es wie jedes andere Modul zur Datei tiapp.xml hinzufügen.

Der Pfad Ihrer Datei wird in /modules/commonjs/modulename/version/module.js oder etwas ähnliches kommen. Mein verknüpftes Modul zeigt Ihnen die erforderlichen Anforderungen und Pfade.