2017-08-25 3 views
1

Gibt es bessere Möglichkeiten, diese Art von Problem in node.js unten zu lösen?Wie umgehen Sie die Frustration der Anforderung ("../../../../../../") in NodeJS?

import foo from "../../../modules/home/models/index.js" 
import bar from "../../../modules/about/models/index.js" 
import baz from "../../../modules/contact/models/index.js" 

Zumindest machen sie so etwas?

import foo from "/home/models/index.js" 
import bar from "/about/models/index.js" 
import baz from "/contact/models/index.js" 

Irgendwelche Ideen?

+2

Meine erste Frage wäre, warum strukturierst du deine Dateien so, dass du das tun musst? Meine Empfehlung wäre, Ihre Dateien zu reorganisieren, aber Sie haben nicht viel weiter gegeben. Warum müssen Sie in diesem Fall auf alle Modelle aus einer Datei zugreifen? – loganfsmyth

+0

Richten Sie Ihren Verzeichnisbaum ein und legen Sie Ihre Dateien auf eine andere Weise, mit weniger Unterverzeichnissen/näher zum Code, der es verwendet? – Pac0

+0

Nach meiner Erfahrung endet die Einrichtung eines Workarounds dafür immer mehr Ärger als es wert ist. –

Antwort

3

Sie benötigen eine Inversion der Steuerung.

./modules/home/index.js

const homeModel1 =() => { 
    //... 
} 
const homeModel2 =() => { 
    //... 
} 

module.exports = Object.assign({}, { homeModel1, homeModel2 }) 

1. Ein Objekt wird von der folgenden Form exportiert werden:

{ 
    homeModel1:() => {}, 
    homeModel2:() => {} 
} 

2. Wenn Sie einen neuen hinzufügen Modell, fügen Sie es einfach hinzu oder importieren Sie es in diese Datei und fügen Sie es dann dem Exportobjekt hinzu.

./modules/index.js

import { homeModels } from './modules/home' 
import { aboutModels } from './modules/about' 
import { contactModels } from './modules/contact' 

module.exports = Object.assign({}, { homeModels, aboutModels, contactModels }) 
  1. Die Modelle sind destrukturiert und dann als Verfahren auf ein neues Objekt exportiert.
  2. Gleichermaßen wird das Objekt mit der gleichen Form exportiert, wobei all Ihre Modelle zusammen kultiviert werden und alle Abhängigkeiten mit ihnen verbunden sind.

woanders

import modules from './modules' 

const query = modules.homeModels.homeModel1() 

Bonus: Um zu klären, schafft Object.assign({}, obj1, obj2) ein neues Objekt mit dem Prototyp zum Objekt Prototyp gesetzt, und geht die Eigenschaften und Methoden von obj1 und obj2. In dieser einfachen Form ist es im Wesentlichen das gleiche wie const obj = {}.

Etwas fortgeschrittener ist Object.assign({}, { obj1, obj2 }), die obj1 und obj2 Eigenschaften auf das neue Objekt macht. Sie können einige einfache Tests durchführen, um ein Gefühl für die Datenstrukturen zu bekommen.

Wir verwendeten auch etwas Destrukturierung. Wenn Sie Probleme haben, die Dinge richtig aufgereiht zu bekommen, sollten Sie sich diese Aspekte anschauen und darüber, wie Sie sie in eine Datei importieren. Beispiel: import obj1 from './modules' bringt das gesamte Objekt aus ./modules, aber import { obj1 } from './modules' zerstört obj1 von dem Objekt, das es einliest, also war obj1 eine Methode/Eigenschaft des Objekts.

Machen Sie etwas Forschung in Inversion von Kontrolle und Abhängigkeitsinjektion.

+1

danke für diese Idee. aber kann ich das tun 'export {homeModel1, homeModel2}' anstelle von 'module.exports = Object.assign ({}, {homeModel1, homeModel2})'? Es sieht kürzer und besser aus ... – laukok

+1

Ja. Das einzige, was Sie nicht tun können, ist Object.assign (Object.create (obj3), {obj1, obj2}), das die vom Prototyp geerbten Methoden/Requisiten von einem dritten Objekt erbt (schnellere theoretische Speicherleistung vs. nicht Object.create()). Gehe mit dem Export. Es entspricht Ihrer Auswahl der Importsyntax. – agm1984

+1

tbh, Export ist wahrscheinlich identisch, sobald es durch babel geht. – agm1984

Verwandte Themen