iOS CommonJS模块返回“未定义不是构造函数”错误

我正在尝试使用预编译的CommonJS模块创建一个iOS Titanium模块。 正如自述文件所说:

资产目录中的所有JavaScript文件都是IGNORED,除非您在此目录中创建名为“com.moduletest.js”的文件,在这种情况下,它将被本机代码包装,编译并用作您的模块。 这允许您运行预编译的纯JavaScript模块。

我已经创建了这样的文件:

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

我正在使用5.1.2.GA SDK(也尝试使用5.3.0.GA),我可以使用python build.pytitanium build --platform iOS --build-only成功构建模块。 然后,在我的测试应用程序中执行:

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

给我这个错误:

未定义不是一个构造函数

未定义不是一个构造函数。 我一直在尝试很多的选择,但似乎没有任何工作,我没有找到任何关于iOS预编译JS模块的文档的帮助。 实际上,同样的过程对Android非常有用! 你有一些想法,为什么?

我的环境:

XCode 7.3.1

操作系统名称 - Mac OS X版本 - 10.11.5架构 - 64位#CPU - 8内存 - 16.0GB

Node.js Node.js版本 - 0.12.7 npm版本 - 2.11.3

Appcelerator CLI安装程序 - 4.2.6核心软件包 - 5.3.0

Titanium CLI CLI版本 - 5.0.9 node-appc版本 - 0.2.31

也许这与我的Node版本或appc CLI有关,不知道= /

谢谢!


有2个解决方案。

1)不要把它放在assets中,而应该放在/app/lib文件夹中,就像其他人提到的一样。

2)将它包装为一个真正的commonjs模块,就像我写的模块一样

在这两种情况下,您都可以使用require('modulename') 。 在情况2中,您需要将其添加到tiapp.xml文件中,就像其他任何模块一样。

你的文件的路径将出现在/modules/commonjs/modulename/version/module.js或类似的地方。 我的链接模块将向您显示所需的要求和路径。


我使用了一个稍微不同的模式,效果很好:

首先从我的“模块”中选择一小段代码:

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());
链接地址: http://www.djcxy.com/p/96613.html

上一篇: iOS CommonJS module returns "undefined is not a constructor" error

下一篇: Titanium Appcelerator; CommonJS has no method