NEWS
Eigene Typescript Module schreiben
-
Hallo,
ich schreibe alles in Typescript und möchte meine Klassen auslagern, so dass ich sie in anderen Skripten einbinden kann.
Sie in global zu kopieren ist für micht keine Lösung. Das gibt nur Probleme.
Im Forum hab ich unter anderem folgender Beitrag gefunden: https://forum.iobroker.net/topic/78632/info-auslagerung-von-global-scripten-ins-filesystem von @uwe72
Hier der Code davon:class Kalender { private adapter: any; private myState: string; constructor(adapter, myState) { this.adapter = adapter; this.myState = myState; } public getCurrentWeekdayAsInteger() : number { var now = new Date(); return now.getDay(); } public updateState() { this.adapter.log("Update state within external file"); this.adapter.setState(this.myState, this.getCurrentWeekdayAsInteger()); } public sendTelegram() { this.adapter.log("Send telegram within external file"); this.adapter.sendTo("telegram.0", "Weekday is: " + this.getCurrentWeekdayAsInteger()); } } module.exports = { Kalender};
Kurz mal ausprobiert, das Modul auszulagern, aber das gibt bei mir immer den Fehler
"ReferenceError: module is not defined"
Was mache ich falsch?
PS: Arbeite mit Windows Pro 11. In welchem Pfad würde ich das Modul finden?
-
@iob69
Hast du auch den Abschnitt mit dem transpilieren beachtet?
Hast du denn Java Skript Adapter neu gestartet? -
@oliverio
Hallo,
soweit bin ich noch nicht ;-). Erst wollte ich das Modul auslagern. Aber wenn du das gerade ansprichst: kann ich das auch mit dem Befehl in der Win-Konsole machen? Das hab ich nämlich jetzt gerade versucht, da kam die Meldung:C:\Users\Admin>npx tsc kalender.ts This is not the tsc command you are looking for To get access to the TypeScript compiler, tsc, from the command line either: - Use npm install typescript to first add TypeScript to your project before using npx - Use yarn to avoid accidentally running code from un-installed packages C:\Users\Admin>
Ich weiss jetzt nicht, ob ich das einfach mit "npm install" machen darf, normalerweise sollte man ja soche dinge über iob machen?
-
@iob69 zeige doch ein wenig mehr, wo liegen die Dateien, wie sieht dein Script aus in iobroker.
-
@iob69
Theoretisch schon.
Aber du musst in das richtige Verzeichnis.
Woher soll der arme Befehl den wissen wo er die Datei finden soll.
Lese dir die Beschreibung nochmal genau von vorne nach hinten durch und auch mal noch ein paar Posts danach.Transpilieren von TypeScript nach JavaScript
kalender.ts muss zu kalender.js transpiliert werden.Copy to Clipboard
npx tsc kalender.ts
--> Es entsteht die Datei kalender.js im gleichen Verzeichnis.Den Satz mit Docker kannst ignorieren wenn du kein Docker verwendest. Ich hab den aus dem Zitat mal gelöscht
-
@uwe72
Ich hab wie gesagt noch nicht mehr. Das Script das ich gepostet hab ist alles. Es kompiliert aber nicht, wegen dem Fehler.
Deshalb wird wohl auch nichts erzeugt.
hier das log:javascript.0 2025-07-06 08:49:27.271 error at Script.runInContext (node:vm:149:12) javascript.0 2025-07-06 08:49:27.271 error at script.js.Eigene_Scripte.HowTo.ModuleExportImport:23:1 javascript.0 2025-07-06 08:49:27.271 error ReferenceError: module is not defined javascript.0 2025-07-06 08:49:27.270 error ^ javascript.0 2025-07-06 08:49:27.270 error module.exports = { Kalender: Kalender }; javascript.0 2025-07-06 08:49:27.270 error script.js.Eigene_Scripte.HowTo.ModuleExportImport: script.js.Eigene_Scripte.HowTo.ModuleExportImport:23
-
@oliverio
Mittlerweile hab ich herausgefunden, wie man dann wahrscheinlich kompilieren kann. Man muss ins Verzeichnis c:\iobroker wechseln und dort den befehlC:\ioBroker>npx tsc kalender.ts
eingeben. Bei mir kommt im Moment noch:
C:\ioBroker>npx tsc kalender.ts error TS6053: File 'kalender.ts' not found. The file is in the program because: Root file specified for compilation Found 1 error.
Weil es ja offenbar noch keine Datei gibt. Ein Test mit einer selbst erstellten .ts - Datei hat funktioniert, ich müsste dann nur noch wissen, wo er die Datei hinschreibt, wenn er denn das Modul exportieren würde. Aber das finde ich dann schon heraus.
Also mein Problem liegt noch darin, dass er das modul nicht exportieren will. Was fehlt in dieser Datei ganz oben?
Zur Not könnte ich die Datei ja einfach von Hand dort rein kopieren, ich weiss aber nicht in welches Verzeichnis sie hingehört. Deshalb wäre es gut, wenn das "module.exports" funktionieren würde. Dann wäre das Modul gleich an der richtigen Stelle.
@uwe72 könntest du vielleicht diese Datei nochmals testen und hier posten, vielleicht war da ja noch ein kleiner Fehler drin? -
Bin nun etwas weiter gekommen. Hab die .ts-Datei von Hand kompiliert und dies hat folgende .js-Datei ergeben:
var Kalender = /** @class */ (function () { function Kalender(adapter, myState) { this.adapter = adapter; this.myState = myState; } Kalender.prototype.getCurrentWeekdayAsInteger = function () { var now = new Date(); return now.getDay(); }; Kalender.prototype.updateState = function () { this.adapter.log("Update state within external file"); this.adapter.setState(this.myState, this.getCurrentWeekdayAsInteger()); }; Kalender.prototype.sendTelegram = function () { this.adapter.log("Send telegram within external file"); this.adapter.sendTo("telegram.0", "Weekday is: " + this.getCurrentWeekdayAsInteger()); }; return Kalender; }());
soweit, so gut.
Nun wollte ich die Datei verwenden, wieder in einer typescript-Datei nach vorlage von @uwe72const { Kalender } = require('kalender.js'); var myStateState = "0_userdata.0.html.test_module"; createState(myStateState, -1, { name: myStateState, desc: myStateState, type: 'number', read: true, write: true }); setState(myStateState, -1); const myCalender = new Kalender(this, myStateState); log("Heute ist: " + myCalender.getCurrentWeekdayAsInteger()); log("Wochentag is: " + getState(myStateState).val); myCalender.updateState(); log("Wochentag is: " + getState(myStateState).val);
Fehler:
javascript.0 2025-07-06 09:41:03.285 error at Script.runInContext (node:vm:149:12) javascript.0 2025-07-06 09:41:03.285 error at script.js.Eigene_Scripte.HowTo.ModuleExportImport:41:18 javascript.0 2025-07-06 09:41:03.284 error TypeError: Kalender is not a constructor javascript.0 2025-07-06 09:41:03.284 error ^ javascript.0 2025-07-06 09:41:03.284 error var myCalender = new Kalender(this, myStateState); javascript.0 2025-07-06 09:41:03.284 error script.js.Eigene_Scripte.HowTo.ModuleExportImport: script.js.Eigene_Scripte.HowTo.ModuleExportImport:41
Importieren/einbinden kann er die Datei offenbar...
Aber ich weiss nicht was bei mir fehlt, und wieso dass es bei uwe72 funktioniert, aber bei mir nicht? -
Also ich weiß nicht was du genau vorhast.
Lese doch bitte zuerst die komplette Beschreibung genau durch.
Außer das du die Kalender klasse verwendest hast sehe ich nichts, was du aus der Beschreibung nach machst.Wo hast du den deine Datei abgelegt? Die sollte ja nicht irgendwo rumliegen.
Beschreibe mal exakt, wo du deine Dateien ablegst.
-
@oliverio
Ich mache doch genau das was im Typesript-Beispiel steht, nur auf umwegen, weil module.exports nicht tut:- Typescript-Klasse geschrieben und in eine Datei abgespeichert
- Datei kompiliert
- Datei in richtigen Pfad kopiert
- Datei in neuem Typescript einbinden
Also eigentlich sollte ja das Script die Dateien ablegen. mit "module.exports = { Kalender};" oder nicht?
Ich hab mittlerweile herausgefunden, wo Module eingerichtet werden, wenn man sie im Javascript adapter configuriert:
C:\ioBroker\node_modules@iobroker-javascript.0
Dort hab ich dann auch die kompilierte datei kalender.js hingetan. (C:\ioBroker\node_modules@iobroker-javascript.0\kalender\kalender.js)
Das problem ist ja auch nicht der Pfad, denn er findet die Datei ja, sonst würde er ja nicht über etwas meckern, was dort drin steht... -
@iob69
Ich sehe da aber nichts in der lib, das ein export erzeugt. -
@ticaki
Unter der Klasse "Kalender" steht:module.exports = { Kalender};
-
@iob69
übersehen sry.EDIT: Kenne mich mit reinem Javascript nicht so gut aus, aber sollte sich das nicht in der transpilierten Datei finden?
-
@iob69 sagte in Eigene Typescript Module schreiben:
@ticaki
Unter der Klasse "Kalender" steht:module.exports = { Kalender};
ist das Leerzeichen gewollt und korrekt?