我想为Node.js设计和打包一个JS库,并将其与QML(特别是ProtoBuf library)一起使用。 ProtoBuf库依赖于ByteBuffer library。
我修改了bytebuffer.js
和protobuf.js
以添加.pragma library
作为第一行。然后,在我的.qml
我有:
import "qrc:/scripts/bytebuffer.js" as BB
import "qrc:/scripts/protobuf.js" as PB
Window {
Component.onCompleted: {
console.log('PB', PB);
console.log('func',PB.loadProtoFile);
for (var k in PB) console.log(k,typeof PB[k],PB[k]);
console.log('done!')
}
}
我看到的输出是:
qml: PB [object Object]
qml: func undefined
qml: done!
因此,QML在某种意义上加载了ProtoBuf库(我已将调试消息放入该库并确认generic loader正在运行且能够找到ByteBuffer
),但是它不是methods that I expect的对象,例如loadProtoFile()
。
如何访问库公开的〜真实ProtoBuf
对象?或者我应该如何修改库以正确使用QML?
答案 0 :(得分:2)
我现在明白了QML命名空间库的方式,语句
import "qrc:/scripts/protobuf.js" as PB
导致PB
成为运行库脚本的全局范围。因此,库在此代码中公开的“真正的”ProtoBuf:
(global["dcodeIO"] = global["dcodeIO"] || {})["ProtoBuf"] = factory(global["dcodeIO"]["ByteBuffer"]);
可以在QML中找到:
var ProtoBuf = PB.dcodeIO.ProtoBuf;
console.log( ProtoBuf.loadProtoFile );
//-> function() { [code] }