2016-05-09 1 views
1

ich einen Ordner App haben, die enthält:Können sich zwei Dateien als Abhängigkeiten in Javascript bei der Verwendung von Webpacks enthalten?

  • index.html
  • lib Ordner mein Javascript (JS) -Dateien

Ich verwende webpack enthält meine JS-Dateien zu bündeln, so dass jede JS-Datei erfordert Es sind Abhängigkeiten (andere JS-Dateien im selben lib-Ordner) oben und module.exports unten.

spaceship.js exportiert eine Konstruktorfunktion Spaceship und bullet.js exportiert eine Konstruktorfunktion Bullet.

Ich habe dann eine JS-Datei factory.js, die ein Objekt namens Factory exportiert. Dieses Objekt enthält eine Methode namens createSpaceship und andere genannt createBullet:

// Factory.js 
var Bullet = require("./bullet.js"); 
var Spaceship = require("./spaceship.js"); 

var Factory { 
    createSpaceship: function() { 
    (...) 
    return new Spaceship(); 
    }, 
    createBullet: function() { 
    (...) 
    return new Bullet(); 
    } 
} 

module.exports = Factory; 

jedoch innerhalb von spaceship.js, gibt es ein Verfahren genannt fireBullet, die eine neue Instanz der Kugel erzeugt. Um dies zu tun, möchte ich factory.js in spaceship.js anfordern. Ist es ein Problem zwei Dateien zu haben, die sich gegenseitig auf diese Weise benötigen?

// spaceship.js 
var Factory = require("./factory.js"); 

var Spaceship = function() { 
    //constructor 
} 

Spaceship.prototype.fireBullet = function() { 
    (...) 
    return Factory.createBullet(); 
} 

Ich erhalte einen Fehler in spaceship.js wie

Uncaught TypeError: Factory.createBullet is not a function

Ich weiß nicht, technisch wie webpack funktioniert, und so kann ich nicht sicher sein, dass diese gegenseitige erforderlich ist, was die Erzeugung Error.

+1

Wäre das nicht sein eine zirkuläre Referenz, und wie würden Sie etwas in A von B benötigen, das A verwendet, um B arbeiten zu lassen, wenn A noch nicht fertig ist, weil es immer noch B verwendet, welches zuerst kommt, das Huhn oder das Ei? – adeneo

+0

Ja, ich stimme zu. Ich wollte nur eine etwas technische Bestätigung, dass das tatsächlich so ist. – evianpring

Antwort

2

Webpack verarbeitet zyklische Abhängigkeiten auf die gleiche Weise wie Knoten, so dass sie unterstützt werden - Einschränkungen siehe https://nodejs.org/api/modules.html.

Wie bereits angemerkt, zyklische Abhängigkeiten können im Allgemeinen durch Redesign vermieden werden, aber Sie haben zwei Möglichkeiten, um es Ihr aktuelles Design gegeben zu beheben:

// Spaceship.js 
var Factory = require('./Factory'); 

function Spaceship(name) { 
    // Re-require the factory during instantiation, this works because the factory module has since defined it's export. 
    Factory = require('./Factory'); 
    this.name = name; 
} 

Oder alternativ

// Factory.js 
// Mutate the provided exports object instead of overriding `module.exports`. This works because Node knows what the export will be upfront. NOTE: like the first example the methods will only available in other modules after this module has returned. 
exports.createSpaceship = function(name) { 
    return new Spaceship(name); 
}; 

exports.createBullet = function(name) { 
    return new Bullet(name); 
}; 
Verwandte Themen