【问题标题】:How to work around the require(“../../../../../../../”) frustration In NodeJS?如何解决 NodeJS 中的 require(“../../../../../../../”) 挫折?
【发布时间】:2018-02-03 17:34:09
【问题描述】:

在下面的node.js中有没有更好的方法来解决这种问题?

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"

有什么想法吗?

【问题讨论】:

  • 我的第一个问题是,你为什么要构建你的文件,这样你就必须这样做?我的建议是重新组织你的文件,但你没有做太多的事情。在这种情况下,为什么需要从一个文件中访问所有模型?
  • 设置您的目录树并以其他方式放置您的文件,子目录更少/更接近使用它的代码?
  • 根据我的经验,为此设置解决方法总是比它的价值更麻烦。
  • article 调查了用于为烦人路径设置别名的方法。
  • 修复你的目录结构,也许还有你的模块依赖图。对于正确的设计,这不是必需的,因此您应该询问如何修复设计,而不是如何处理导入路径。而且,我们需要更多地了解您正在做什么,以提出更好的布局/架构。

标签: node.js import ecmascript-6


【解决方案1】:

你需要控制反转。

./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) 创建了一个新对象,其原型设置为 Object 原型,并合并了 obj1 和 obj2 的属性和方法。在这个简单的形式中,它与const obj = {}基本相同。

更高级的是Object.assign({}, { obj1, obj2 }),它在新对象上创建了obj1 和obj2 属性。你可以做一些简单的测试来感受一下数据结构。

我们还使用了一些解构。如果您在正确排列事物时遇到问题,您应该查看这些方面以及如何将它们导入文件。例如,import obj1 from './modules' 将从 ./modules 中引入整个对象,但 import { obj1 } from './modules' 将从它引入的对象中解构 obj1,因此 obj1 是该对象的方法/属性。

对控制反转和依赖注入做一些研究。

【讨论】:

  • 感谢这个想法。但是我可以这样做export { homeModel1, homeModel2 } 而不是module.exports = Object.assign({}, { homeModel1, homeModel2 }) 吗?它看起来更短更好......
  • 是的。您唯一不能做的是 Object.assign(Object.create(obj3), { obj1, obj2 }) 从第三个对象继承原型继承的方法/道具(更快的理论内存性能而不是 Object.create() )。去出口。它符合您的导入语法选择。
  • tbh,一旦通过 babel,export 可能是相同的。
猜你喜欢
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
相关资源
最近更新 更多