# no-mixed-requires

此规则在 ESLint v7.0.0 中已弃用。请使用 eslint-plugin-node 中的相应规则。

在 Node.js 社区中,通常习惯将调用 require 模块的初始化与其他变量声明分开,有时还按模块类型对它们进行分组。此规则可帮助您执行此约定。

# 规则详情

启用此规则后,每条 var 语句必须满足以下条件:

  • none 或 all 变量声明必须是 require 声明(默认)
  • 所有要求声明必须是同一类型(分组)

该规则区分了六种变量声明类型:

  • core:需要的核心模块的声明
  • file:需要的文件模块的声明
  • module:从 node_modules 文件夹 声明所需模块
  • computed:无法确定类型的必需模块的声明(因为它是计算的,或者因为在没有参数的情况下调用了require)
  • uninitialized:未初始化的声明
  • other:任何其他类型的声明

在本文档中,前四种类型在术语要求声明下进行了总结。

var fs = require('fs'),        // "core"     \
    async = require('async'),  // "module"   |- these are "require declaration"s
    foo = require('./foo'),    // "file"     |
    bar = require(getName()),  // "computed" /
    baz = 42,                  // "other"
    bam;                       // "uninitialized"

# 选项

此规则可以有一个对象字面选项,其两个属性默认具有 false 值。

不推荐使用一个布尔选项 true 配置此规则。

带有默认 { "grouping": false, "allowCall": false } 选项的此规则的错误代码示例:

/*eslint no-mixed-requires: "error"*/

var fs = require('fs'),
    i = 0;

var async = require('async'),
    debug = require('diagnostics').someFunction('my-module'),
    eslint = require('eslint');

带有默认 { "grouping": false, "allowCall": false } 选项的此规则的正确代码示例:

/*eslint no-mixed-requires: "error"*/

// only require declarations (grouping off)
var eventEmitter = require('events').EventEmitter,
    myUtils = require('./utils'),
    util = require('util'),
    bar = require(getBarModuleName());

// only non-require declarations
var foo = 42,
    bar = 'baz';

// always valid regardless of grouping because all declarations are of the same type
var foo = require('foo' + VERSION),
    bar = require(getBarModuleName()),
    baz = require();

# grouping

此规则使用 { "grouping": true } 选项的错误代码示例:

/*eslint no-mixed-requires: ["error", { "grouping": true }]*/

// invalid because of mixed types "core" and "module"
var fs = require('fs'),
    async = require('async');

// invalid because of mixed types "file" and "unknown"
var foo = require('foo'),
    bar = require(getBarModuleName());

# allowCall

此规则使用 { "allowCall": true } 选项的错误代码示例:

/*eslint no-mixed-requires: ["error", { "allowCall": true }]*/

var async = require('async'),
    debug = require('diagnostics').someFunction('my-module'), /* allowCall doesn't allow calling any function */
    eslint = require('eslint');

此规则使用 { "allowCall": true } 选项的正确代码示例:

/*eslint no-mixed-requires: ["error", { "allowCall": true }]*/

var async = require('async'),
    debug = require('diagnostics')('my-module'),
    eslint = require('eslint');

# 已知限制

  • 该实现不知道任何名称为 require 的本地函数可能会影响 Node.js 的全局 require。

  • 在内部,核心模块列表通过 require("repl")._builtinLibs 检索。如果您为 ESLint 和您的应用程序使用不同版本的 Node.js,则每个版本的核心模块列表可能会有所不同。上面提到的 _builtinLibs 属性在 0.8 中可用,对于早期版本,模块名称的硬编码列表用作后备。如果您的 Node.js 版本早于 0.6,则该列表可能不准确。

# 何时不使用

如果您使用诸如 UMD 之类的模式,其中 required 模块未在变量声明中加载,则此规则显然对您没有任何帮助。

Last Updated: 5/13/2023, 8:55:38 PM