Michael_K: Node module - ich verzweifle

Hallo,

ich würde gerne das node module docx4js testen. Das Modul hat 5 Abhängigkeiten und ich habe es mir mit npm install docx4js installiert.

Ich möchte das modul aber nicht in einer node.js Umgebung nutzen sondern direkt im Browser in einer web app. Soweit ich es verstehe, brauche ich dafür ein Hilfsmittel, damit ich require() anwenden kann. Ich wollte nun dafür RequireJS nutzen und habe die Anleitung befolgt. Hierzu habe ich die node module aus dem dem ordner kopiert, der von npm angelegt wurde.

Aber ich bekomme es einfach nicht zum Laufen. Habe ich einen Fehler in meinen Überlegungen, z.B. kann ich die Ordner einfach aus dem node modules ordner kopieren? Wenn nein, wie sollte man vorgehen, damit man die node modules nutzen kann?

Vielen Dank für Hinweise Michael

  1. Lieber Michael_K,

    was passiert, wenn Du es so einbindest?

    <script src="/path/to/script.js" type="module"></script>
    

    Das Script, das require verwenden will, muss meines Wissens als Modul geladen werden, benötigt also das type-Attribut mit dem Wert "module". Die zu ladenden Module benötigen ihrerseits ebenfalls dieses Attribut, wenn ich mich nicht täusche.

    Liebe Grüße

    Felix Riesterer

  2. Hallo Michael_K,

    was Du vorhast, ist aus unterschiedlichen Gründen nicht einfach. Ich habe mir docx4js nicht genauer angeschaut und kann darum nicht sagen, ob es darin Variationen gibt, die den Einsatz im Browser überhaupt ermöglichen.

    Denn die erste Hürde zeigt sich schon im Einführungsbeispiel der readme-Datei:

    docx4js.load("~/test.docx").then(
    

    Sofern test.docx vom Server kommt, mag das funktionieren, aber lokale Dateien (auf dem PC des Users) kannst Du auf diese Weise nicht öffnen. Das lässt der Browser nicht zu.

    Nächste Hürde: require von Node und requirejs sind nicht das Gleiche. Es gibt bei requirejs eine Seite über einen Node-Adapter in require.js (r.js), aber da geht es darum, wie man requirejs in Node einsetzt, um einen einheitlichen Modul-Loader im Browser und in Node zu haben. Du kannst node-Module nicht einfach so im Browser laufen lassen, da hilft Dir auch requirejs nicht. Node ist eine ganz andere Laufzeitumgebung.

    Und requirejs ist mittlerweile auch alt. ES6 Module (also das import Statement) und requirejs sind strikt inkompatibel. Es ist schon merkwürdig (oder ich kapiere Node nicht, kann auch sein), dass docx4js mit import geladen wird und das Beispiel dann mit require ein Modul nachlädt.

    Alle weiteren Hürden sind leider im Nebel der nicht existenten Dokumentation unsichtbar. Es gibt genau ein API Beispiel, das ist ein trauriger Witz. Du musst den Sourcecode durcharbeiten, um herauszufinden, was diese Lib überhaupt kann und wie man damit umgeht.

    Mein Fazit nach kurzer Betrachtung: Finger weg. Wenn diese Lib Gold enthält, ist es unter einer dicken Schicht Teerschlamm versteckt.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Hallo Rolf,

      danke für die Antwort. Das mit dem Teer und Gold muss ich mir merken ;-) Ich glaube, dass ich in den sauren Apfel beissen muss und die Node-Module selbst per Hand einzeln anpassen muss, um diese client-seitig nutzbar zu machen. Das ist wirklich eine extrem unschöne Entwicklung, dass es zwei komplett unterschiedliche inkompatible Module-Architekturen gibt.

      Ob das Module docx4js für meine Zwecke etwas taugt, möchte ich ja gerade herausfinden und es etwas mehr testen. Es wäre mir ja schon geholfen, wenn es mir die Word-Strukture aufbereitet und ich dann den Parser zum Inhalt selber anassen kann. Das Module kann auch docxjs.load(input.files[0]) verareiten, sodass es grundsätzlich auch client-seitig nutzbar wäre, wenn das Word-Dokument ausgewählt wird.

      Man kann nur hoffen, dass es irgendwann eine vereinte Lösung gibt, die für beide Module-Ansätze funktioniert. Selsbt wenn es unterschiedliche Laufzeitumgebungen sind, solange die Module von der gleichen Quelle geladen werden, ist für mich nicht ersichtlich, warum diese Unterschiede nicht überwunden werden können.

      Gruss, Michael