版本

no-mixed-requires

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

重要提示

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

了解更多

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

规则详情

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

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

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

  • 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 } 时,不正确代码示例

在 Playground 中打开
/*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 } 时,正确代码示例

在 Playground 中打开
/*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 } 选项时,不正确代码示例

在 Playground 中打开
/*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 } 选项时,不正确代码示例

在 Playground 中打开
/*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 } 选项时,正确代码示例

在 Playground 中打开
/*eslint no-mixed-requires: ["error", { "allowCall": true }]*/

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

已知限制

  • 该实现没有意识到任何可能遮蔽 Node.js 全局 require 的名为 require 的本地函数。

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

何时不使用

如果您使用诸如 UMD 之类的模式,其中 require 的模块未加载到变量声明中,则此规则显然对您不起作用。

版本

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

资源

更改语言