NodeJS需要一个文件中的所有模块,这是一个好习惯吗?

时间:2017-12-15 07:28:52

标签: javascript node.js node-modules dompurify

我想知道是否有任何缺点,从设计或安全的角度来看,有一个文件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')

我无法弄清楚使用这样的构造是否有任何缺点。由于这些模块都已加载到全球空间,我看不出我的方法有任何缺点?

2 个答案:

答案 0 :(得分:2)

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

对于某些其他模块而言,它不应该只需要在其他地方保存几个字母。没有理由这样做。模块由系统缓存,因此在需要它的模块中使用require()而不是从其他文件导出导致模块更独立,更独立并减少不必要的依赖。

所以,如果你在一个地方require()然后将其导出,你只需创建一个巨大的相互依赖的项目,其中没有任何东西独立于其他任何东西。在其他项目中,单个模块本身不能重复使用,因为一切都取决于特定于应用程序的核心应用程序文件。而且,你通过摆脱模块独立性实际获得了什么?可能只是保存了几行打字 - 这就是全部。

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

  

我无法弄清楚使用这样的构造是否有任何缺点。既然模块都被加载到全局空间中,我认为我的方法没有任何缺点吗?

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

  1. 降低模块独立性和模块可重用性。
  2. 在查看代码时,模块依赖性不那么明显。
  3. 使模块更难以独立测试。
  4. 在不需要相互依赖的文件之间创建不必要的相互依赖性,以便加载他们想要使用的东西。
  5. 有时你会发现有很多模块需要同时使用很多模块。在这种情况下,不要将它们从应用程序导出到所有内容中。相反,创建一个新的可共享模块,导入其他模块并导出它们。然后,您将核心模块保持独立,并创建了一个新的可重用模块,该模块可以为您提供一组通常一起使用的模块。通过这种方式,您可以通过增加模块性和可重用性而不是通过减少它来解决同样的问题(并且您也可以节省一些打字)。

答案 1 :(得分:1)

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