global-require
要求 `require()` 调用放置在顶级模块作用域中
此规则已在 ESLint v7.0.0 中 **弃用**。请在 eslint-plugin-n
中使用相应的规则。
在 Node.js 中,模块依赖项使用 `require()` 函数包含,例如
var fs = require("fs");
虽然 `require()` 可以被调用在代码中的任何地方,但一些风格指南规定它应该只在模块的顶层调用,以便更容易识别依赖项。例如,当它们嵌套在函数和其他语句中时,识别依赖项可以说更困难
function foo() {
if (condition) {
var fs = require("fs");
}
}
由于 `require()` 执行同步加载,因此在其他位置使用时可能会导致性能问题。
此外,ES6 模块规定 `import` 和 `export` 语句只能出现在模块主体顶层。
规则细节
此规则要求所有对 `require()` 的调用都位于模块的顶层,类似于 ES6 的 `import` 和 `export` 语句,它们也只可以出现在顶层。
此规则 **错误** 代码示例
在 Playground 中打开
/*eslint global-require: "error"*/
// calling require() inside of a function is not allowed
function readFile(filename, callback) {
var fs = ;
fs.readFile(filename, callback);
}
// conditional requires like this are also not allowed
if (DEBUG) {
;
}
// a require() in a switch statement is also flagged
switch (x) {
case "1":
;
break;
}
// you may not require() inside an arrow function body
var getModule = (name) => ;
// you may not require() inside of a function body as well
function getModule(name) {
return ;
}
// you may not require() inside of a try/catch block
try {
;
} catch (e) {
console.log(e);
}
此规则 **正确** 代码示例
在 Playground 中打开
/*eslint global-require: "error"*/
// all these variations of require() are ok
require("x");
var y = require("y");
var z;
z = require("z").initialize();
// requiring a module and using it in a function is ok
var fs = require("fs");
function readFile(filename, callback) {
fs.readFile(filename, callback);
}
// you can use a ternary to determine which module to require
var logger = DEBUG ? require("dev-logger") : require("logger");
// if you want you can require() at the end of your module
function doSomethingA() {}
function doSomethingB() {}
var x = require("x"),
z = require("z");
何时不使用它
如果您有一个必须使用来自文件系统的信息初始化的模块,或者一个模块仅在非常罕见的情况下使用并且加载它会导致很大的开销,那么禁用该规则可能是有意义的。如果您需要在 `try` / `catch` 内部 `require()` 一个可选依赖项,您可以使用 `// eslint-disable-line global-require` 注释仅为此依赖项禁用此规则。
版本
此规则是在 ESLint v1.4.0 中引入的。