# 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
之类的模式,其中 require
d 模块未在变量声明中加载,则此规则显然对您没有任何帮助。