版本

no-mixed-requires

禁止将 require 调用与常规变量声明混合使用

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

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

规则详情

启用此规则时,每个 var 语句都必须满足以下条件

  • 要么没有变量声明是 require 声明,要么所有变量声明都是 require 声明(默认值)
  • 所有 require 声明必须是相同类型(分组)

此规则区分六种变量声明类型

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

在本文档中,前四种类型在术语“require 声明”下进行了汇总。

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 模块未加载到变量声明中,则此规则显然对您不起作用。

版本

此规则是在 ESLint v0.0.9 中引入的。

资源

更改语言