Skip to content
← Back to rules

node/global-require 风格

它做了什么

要求 require() 调用必须位于模块的顶层作用域

为什么这是个问题?

在 Node.js 中,模块依赖是通过 require() 函数引入的,例如:

js
var fs = require("fs");

虽然 require() 可以在代码中的任何位置调用,但一些编码规范建议仅在模块的顶层调用它,以便更容易识别依赖关系。 例如,当依赖被嵌套在函数和其他语句内部时,识别起来会更困难:

js
function foo() {
  if (condition) {
    var fs = require("fs");
  }
}

由于 require() 执行的是同步加载,如果在其他位置使用可能会导致性能问题。 此外,ES6 模块规定 importexport 语句只能出现在模块体的顶层。

示例

此规则的 错误 代码示例:

js
// 在函数内部调用 require() 是不允许的
function readFile(filename, callback) {
  var fs = require("fs");
  fs.readFile(filename, callback);
}

// 条件性地调用 require() 也不允许
if (DEBUG) {
  require("debug");
}

// switch 语句中的 require() 也会被标记
switch (x) {
  case "1":
    require("1");
    break;
}

// 你不能在箭头函数体内部调用 require()
var getModule = (name) => require(name);

// 也不能在普通函数体内部调用 require()
function getModule(name) {
  return require(name);
}

// 你不能在 try/catch 块中调用 require()
try {
  require(unsafeModule);
} catch (e) {
  console.log(e);
}

此规则的 正确 代码示例:

js
// 所有这些形式的 require() 都是允许的
require("x");
var y = require("y");
var z;
z = require("z").initialize();

// 引入模块并在函数中使用是可以接受的
var fs = require("fs");
function readFile(filename, callback) {
  fs.readFile(filename, callback);
}

// 你可以使用三元运算符来决定要引入哪个模块
var logger = DEBUG ? require("dev-logger") : require("logger");

// 如果你愿意,也可以在模块末尾进行 require()
function doSomethingA() {}
function doSomethingB() {}
var x = require("x"),
  z = require("z");

如何使用

要通过配置文件或 CLI 启用 此规则,可以使用:

json
{
  "plugins": ["node"],
  "rules": {
    "node/global-require": "error"
  }
}
bash
oxlint --deny node/global-require --node-plugin

参考资料