Creo una clase de extensión para QJSEngine que proporciona una función importModule() al objeto global del motor que funciona como una declaración de import estándar en JS.
La versión simplificada de esta clase se encuentra a continuación.
class ModuleImportExtension : public QObject { Q_OBJECT public: ModuleImportExtension(QJSEngine* engine) : QObject(), m_engine(engine) {} protected: Q_INVOKABLE void import(const QString& relativePath, const QString& jsIdentifier) { auto moduleJsVal = m_engine->importModule(QDir::current().absoluteFilePath(relativePath)); m_engine->globalObject().setProperty(jsIdentifier, moduleJsVal); Q_ASSERT(m_engine->globalObject().hasProperty(jsIdentifier)); } private: QJSEngine* m_engine; }; Para usarlo, debe crear un QJSValue desde la instancia de ModuleImportExtension y establecer su propiedad de importación en el objeto global del motor.
// ... QJSEngine engine; auto extObj = engine.newQObject(new ModuleImportExtension(&engine)); engine.globalObject().setProperty("importModule", extObj.property("import")); // ...Funciona bien, excepto en el caso de que el código de un módulo contenga tipos desconocidos.
módulo.js
export var obj = new ccc("abcdef"); // ccc has not been declared yetprincipal.js
importModule("module.js", "Module"); console.log(Module.obj);Si evalúo main.js , fallaría con el mensaje
"ReferenceError: el módulo no está definido"
Decidí agregar un Q_ASSERT en ModuleImportExtension::import y falla en este caso. Es decir, la instancia QJSValue del módulo no se establece como una propiedad en el objeto global del motor. ¿Podría explicarme por qué m_engine->globalObject().setProperty(jsIdentifier, moduleJsVal) no hace nada?
PS A pesar de que el módulo tiene tipos desconocidos, QJSEngine::importModule() no devuelve error (QJSValue::isError() es falso). Sin embargo, el resultado toString() de importModule() devuelve
ReferenceError: ccc no está definido