2016-06-29 3 views
0

Я пытаюсь создать титановый модуль iOS с использованием предварительно скомпилированного модуля CommonJS. Как файл README говорит:Модуль iOS CommonJS возвращает ошибку «undefined is not a constructor»

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.

Я создал файл, как это:

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

Я использую 5.1.2.GA SDK (также попытался с 5.3.0.GA) и я могу построить модуль успешно либо с python build.py, либо titanium build --platform iOS --build-only. Тогда, в моем тестовом приложении делания:

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

дает мне эту ошибку:

undefined is not a constructor

неопределенными не является конструктором. Я пробовал много альтернатив, но ничего не работает, и я не нашел никакой помощи в документации о предварительно скомпилированных JS-модулях для iOS. На самом деле, тот же процесс отлично подходит для Android! У вас есть идея, почему?

Моя среда:

XCode 7.3.1

Операционная система Имя - Mac OS X Version - 10.11.5 Architecture - 64-разрядные # процессоры - 8 памяти - 16.0GB

Node.js Node.js Версия - 0.12.7 npm Версия - 2.11.3

Appcelerator CLI Installer - 4.2.6 Основной пакет - 5.3.0

Titanium CLI CLI версия - 5.0.9 узла APPC версия - 0.2.31

Может быть, это что-то связано с моим Версия узла или приложение CLI, не уверены =/

Спасибо!

+0

Где вы разместили файл 'com.moduletest.js'? –

+0

Привет, Брентон, я положил его в папку с папками модулей. Тестирование/активы/com.moduletest.js http://i.imgur.com/4OW2i86.png –

+0

Для модулей commonjs вы можете просто поместить их прямо в проект приложения. Попробуйте поместить этот файл в папку /app/lib/com.moduletest.js вашего приложения. –

ответ

0

Я использую немного другой шаблон, который работает отлично:

Сначала небольшой фрагмент из моего «модуля»:

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; 

И тогда это путь я использую его:

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

Существует 2 решения.

1) Не размещайте его в активах, а в папке /app/lib, как упомянули другие.

2) завернуть его в качестве фактического модуля CommonJS, как module I wrote

В обоих случаях, вы можете просто использовать require('modulename').В случае 2 вам нужно будет добавить его в файл tiapp.xml, как и любой другой модуль.

Путь к файлу будет представлен в /modules/commonjs/modulename/version/module.js или что-то в этом роде. Мой связанный модуль покажет вам необходимые требования и пути.

Смежные вопросы