2017-08-25 52 views
1

在node.js中解決這類問題的更好方法如下?如何解決require(「../../../../../../../」)挫折在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" 

至少使它們弄成這個樣子?

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

任何想法?

+2

我的第一個問題是,你爲什麼要構建你的文件,你必須這樣做?我的建議是重新組織你的文件,但是你沒有做太多的工作。在這種情況下,爲什麼需要從一個文件訪問所有模型? – loganfsmyth

+0

設置你的目錄樹並以其他方式放置你的文件,使用更少的子目錄/更接近使用它的代碼? – Pac0

+0

根據我的經驗,爲此設置一個解決方法總是會比其價值更麻煩。 –

回答

3

您需要反轉控制。

./modules/home/index.js

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

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

1.一種對象將被導出以下形狀:

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

2.當增加一個新的模型,只需將其添加或導入到該文件中,然後將其添加到導出對象。

./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. 這些模型解構出來,然後導出爲一個新對象的方法。
  2. 同樣,相同形狀的物體會與您一起培養的所有模型一起導出,從而爲它們帶來所有依賴關係。

別的地方

import modules from './modules' 

const query = modules.homeModels.homeModel1() 

獎勵: 澄清,Object.assign({}, obj1, obj2)創建具有設置爲對象的原型樣機一個新的對象,並融合了性能和OBJ1的方法和obj2的。在這種簡單的形式中,它基本上與const obj = {}相同。

更高級一點,是Object.assign({}, { obj1, obj2 }),它使新對象上的obj1和obj2屬性。你可以做一些簡單的測試來感受數據結構。

我們也使用了一些解構。如果您遇到問題需要進行正確排列,您應該查看這些方面以及如何將它們導入到文件中。例如,import obj1 from './modules'將從./modules中提取整個對象,但是import { obj1 } from './modules'將從其拉入的對象中解構obj1,因此obj1是對象的方法/屬性。

做一些研究控制和依賴注入的反演。

+1

感謝您的這個想法。但我可以做'export {homeModel1,homeModel2}'而不是'module.exports = Object.assign({},{homeModel1,homeModel2})''?它看起來越來越短... – laukok

+1

是的。你唯一不能做的就是Object.assign(Object.create(obj3),{obj1,obj2}),它從第三個對象繼承原型繼承的方法/道具(更快的理論內存性能而不是Object.create() )。去出口。它與您的導入語法選擇相匹配。 – agm1984

+1

tbh,一旦它通過babel,出口可能是相同的。 – agm1984