1

从设计或安全的角度来看,我想知道是否有任何缺点,requires()将我需要的所有模块放在一个文件中,然后导出它们。这将使我不必跟踪每个文件中的所有模块。

例子:

// my_requires.js
const bodyParser = require('body-parser')
const parseForm = bodyParser.urlencoded({extended: false})

const DOMPurify = require('dompurify');
const {JSDOM} = require('jsdom');

const jwt = require('jsonwebtoken');
const passport = require('passport');
require('../config/passport')(passport)

module.exports = {
    bodyParser: bodyParser,
    parseForm: parseForm,
    jwt: jwt,
    passport: passport,
    bcrypt: bcrypt
}

然后在我需要它们的任何文件中,我只需要

const reqs = require('my_requires.js')

我不知道使用这样的构造是否有任何缺点。由于模块都加载到全局空间中,我没有看到我的方法有任何缺点吗?

4

2 回答 2

5

对于使模块最容易在其他项目中重用的良好模块化设计,模块应该只包含它自己需要或绝对必须与其他人共享的东西。

它不应该要求其他模块只是为了在其他地方保存一些键入的字母。没有理由这样做。模块由系统缓存,因此require()在需要它的模块中使用 a 而不是从其他文件中获取导出会使模块更加独立,更加独立并减少不必要的依赖关系。

所以,如果你require()把所有东西都放在一个地方,然后把它导出来,你就创建了一个巨大的相互依赖的项目,其中没有任何东西独立于其他任何东西。没有一个模块可以在其他项目中单独重用,因为一切都取决于特定于应用程序的核心应用程序文件。而且,摆脱模块独立性,您实际上获得了什么?可能只是节省了几行打字-仅此而已。

当从其他没有像 node.js 那样实现模块化的编程环境中加速 node.js 时,这有点违反直觉,但是每个模块都应该从require()它所依赖的外部库的语句列表开始。是的,其中一些代码将在其他模块中重复,但我不认为这是不必要的重复,而是为了清晰和模块化而对依赖关系的有组织的陈述。这是这个模块所依赖的。为了重用这个模块,必须安装以下内容。这是独立于应用程序其余部分使用此模块的方法。

我不知道使用这样的构造是否有任何缺点。由于模块都加载到全局空间中,我没有看到我的方法有任何缺点吗?

没有什么是非黑即白的。有时有理由分享一组东西。但是,我会列出您的方法的这些缺点,并且我通常会避免使用该技术:

  1. 降低模块独立性和模块可重用性。
  2. 在查看代码时使模块依赖关系不那么明显。
  3. 使模块更难独立测试。
  4. 在不需要相互依赖来加载他们想要使用的东西的文件之间创建不必要的相互依赖关系。

在某些情况下,您会发现很多模块同时需要一组通用模块。在这种情况下,不要将它们从应用程序导出到所有内容中。相反,创建一个新的可共享模块来导入其他模块并导出它们。然后,您使核心模块保持独立,并创建了一个新的可重用模块,该模块为您提供了一组您经常一起使用的模块。通过这种方式,您可以通过增加模块化和可重用性而不是减少模块化来解决相同的问题(并且您还可以节省一些输入)。

于 2017-12-15T07:49:01.057 回答
1

这是我在服务器文件中所做的典型事情。但是,它们中的大多数在我的代码中只使用一次或两次,通常在服务器文件中。所以,只有在很多地方使用它们才有意义,我把它放在一个单独的文件中。其他情况我认为是重复代码。

于 2017-12-15T07:40:10.890 回答