Sven K.: namespaced object für nodejs

Hallo,

ich habe eine javascript Bibliothek für ein Projekt erstellt und verwende dabei den oft empfohlenen Weg, für ein namespaced object. Jetzt würde ich gerne diese Bibliothek auch in einem Projekt als nodejs module benutzen. Weiss jemand, wie ich nachfolgendes Object umschreiben muss, damit ich die Library auch gleichzeitig für nodejs benutzen kann?

  
(function (myObject, $, undefined) {  
  
  
}  
(window.myObject= window.myObject|| new Object, jQuery));  

Da es in nodejs keine window object gibt, wie müsste ich die letzte Anweisung ergänzen, so dass es als normale library für eine Webseite funktioniert, als auch für eine App auf Basis von Nodejs verwendet werden kann. Nachdem, was ich lesen konnte, müsste noch etwas in der Form module.exports.myObject ergänzt werden. Kann mir jemand einen Tipp geben?

Gruss,
Sven

  1. Da es in nodejs keine window object gibt, wie müsste ich die letzte Anweisung ergänzen, so dass es als normale library für eine Webseite funktioniert, als auch für eine App auf Basis von Nodejs verwendet werden kann.

    Du benutzt das window-Objekt, weil es der globale Namensraum für Browser ist. In Node.js heißt das globale Objekt schlich global. Von dieser Art Module zugänglich zu machen solltest du in einer Node.js-Umgebung aber Abstand nehmen und lieber mit dem dafür vorgesehenen Modul-System arbeiten.

    Nachdem, was ich lesen konnte, müsste noch etwas in der Form module.exports.myObject ergänzt werden. Kann mir jemand einen Tipp geben?

    Die Dokumentation von Node.js ist in diesem Punkt ziemlich ausführlich.

    Gruss,
    Sven

    --
    Hey Girl,
    i wish you were asynchronous, so you'd give me a callback.
    1. Da es in nodejs keine window object gibt, wie müsste ich die letzte Anweisung ergänzen, so dass es als normale library für eine Webseite funktioniert, als auch für eine App auf Basis von Nodejs verwendet werden kann.

      Du benutzt das window-Objekt, weil es der globale Namensraum für Browser ist. In Node.js heißt das globale Objekt schlich global.

      Unabhängig von der verwendeten Umgebung bekommt man das globale Objekt indem man sich in einer mit globalem Context/ohne Context aufgerufenen Funktion das this liefern lässt.

      function getGlobObj() {
        return this;
      }
      var g = getGlobObj();

    2. Hallo,

      Vielen Dank für die Antwort. Ich konnte noch nicht ganz nachvollziehen von der Dokumentation, warum ich es vermeiden sollte. Würde aber eine solche Schreibweise sinnvoll sein erscheinen?

        
      (function (myObject, $, undefined) {  
        
      }  
      ((typeof window !== 'undefined' ? window.myObject = window.myObject :  
      module.exports.myObject = module.exports.myObject) || new Object, jQuery));  
      
      

      Gruss,
      Sven

      1. Meine Herren,

        Hallo,

        Vielen Dank für die Antwort. Ich konnte noch nicht ganz nachvollziehen von der Dokumentation, warum ich es vermeiden sollte.

        Du hast es ja instinktiv schon besser gemacht. In Node.js gibt es zum einen den global-Kontext und zum anderen den Modul-Kontext. Wenn du eine Eigenschaft/Methode im global-Kontext anlegst, ist diese für alle Module immer verwendbar, wenn stattdessen den Modul-Kontext benutzt, muss das Modul erst angefordert werden (require), um es benutzen zu können.

        Würde aber eine solche Schreibweise sinnvoll sein erscheinen?

        (function (myObject, $, undefined) {

        }
        ((typeof window !== 'undefined' ? window.myObject = window.myObject :
        module.exports.myObject = module.exports.myObject) || new Object, jQuery));

          
        Ich verstehe den Zweck hinter den Selbst-Zuweisungen nicht.  
        
        > `window.myObject = window.myObject `{:.language-javascript}  
          
        Außerdem würde ich statt `module.exports.myObject`{:.language-javascript} besser nur `module.exports`{:.language-javascript} schreiben. Das vereinfacht imho. den Umgang mit deiner API.  
          
        Außerdem solltest du jQuery in die Abhängkeitsliste deines Moduls aufnahmen und mit require explizit für dein Modul zugänglich machen.  
        
        -- 
        Hey Girl,  
        i wish you were asynchronous, so you'd give me a callback.
        
        1. Servus,

          Ich verstehe den Zweck hinter den Selbst-Zuweisungen nicht.
          window.myObject = window.myObject

          "... The first argument looks quite strange. What is window.myObject = window.myObject || new Object() doing? The code checks to see if myObject exists in the global namespace (window). If it does not exist, then window.myObject is assigned an empty object literal. Using this approach we can build a library across JavaScript files. If another script uses the same technique, then it will pass in the existing instance and append logic to it. Inside the Anonymous Function, if we want something to be public, then we append it to the myObject. Any other properties or methods will be considered private. ..." Nachzulesen hier:

          Außerdem solltest du jQuery in die Abhängkeitsliste deines Moduls aufnahmen und mit require explizit für dein Modul zugänglich machen.

          Die Abhaengigkeit wuerde ich ja noch in package.json aufnehmen. Mir geht es darum, eine lib zu haben, die ich sowohl mit nodejs als auch mit dem Browser nutzen kann und zudem einfach erweiterbar ist.

          Gruss,
          Sven

          1. Ich verstehe den Zweck hinter den Selbst-Zuweisungen nicht.
            window.myObject = window.myObject

            "... The first argument looks quite strange. What is window.myObject = window.myObject || new Object() doing? [...]

            Fällt dir der Unterschied selber auf zwischen:
            window.myObject = window.myObject
            und
            window.myObject = window.myObject || new Object

            Außerdem solltest du jQuery in die Abhängkeitsliste deines Moduls aufnahmen und mit require explizit für dein Modul zugänglich machen.

            Die Abhaengigkeit wuerde ich ja noch in package.json aufnehmen.

            Das ist gut, das heißt bei der Installation von deinem Packet mit "npm install myModule" wird jQuery mitinstalliert, falls noch nicht vorhanden. In deinem Modul musst du jQuery trotzdem noch mit var jQuery = require('jQuery'); laden. Ein installiertes Paket ist nicht automatisch von jedem anderen Paket zu benutzen.

            --
            Hey Girl,
            i wish you were asynchronous, so you'd give me a callback.