node/global-require 风格
它做了什么
要求 require() 调用必须位于模块的顶层作用域
为什么这是个问题?
在 Node.js 中,模块依赖是通过 require() 函数引入的,例如:
js
var fs = require("fs");虽然 require() 可以在代码中的任何位置调用,但一些编码规范建议仅在模块的顶层调用它,以便更容易识别依赖关系。 例如,当依赖被嵌套在函数和其他语句内部时,识别起来会更困难:
js
function foo() {
if (condition) {
var fs = require("fs");
}
}由于 require() 执行的是同步加载,如果在其他位置使用可能会导致性能问题。 此外,ES6 模块规定 import 和 export 语句只能出现在模块体的顶层。
示例
此规则的 错误 代码示例:
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