ESLintにおけるrequireの使い方

Reactでソースコードを書きながらESLintで構文チェックするという開発スタイルに馴染めていないです。という内容なのですが…

今回はrequireで怒られました。

Unexpected require(). (global-require) at…

早速、調べてみると

require関数はモジュールの一番上のスコープで使うことを強制します

ESLintのEnforceという単語にただただ力強さを感じます…

つまり、外部モジュールをインポートしたりするときにモジュール同士の依存関係が分かりやすいほうがいいよね?

ソースコードのネストしている中でrequire()なんてしたら分かりづらいよね?

ということです。

…ごもっともです。これに従うと関数のスコープでのrequire()や条件分岐に応じたrequire()のスイッチングが出来ないのです。

以下に簡単なサンプルを示します。

//bad
// calling require() inside of a function is not allowed
function readFile(filename, callback) {
    var fs = require('fs');
    fs.readFile(filename, callback)
}

//good
// requiring a module and using it in a function is ok
var fs = require('fs');
function readFile(filename, callback) {
    fs.readFile(filename, callback)
}
//bad
// conditional requires like this are also not allowed
if (DEBUG) { require('debug'); }

//good
// you can use a ternary to determine which module to require
var logger = DEBUG ? require('dev-logger') : require('logger');

極端な話、全部ソースコードの頭の方でrequireすればいいということですね。 でもメモリとか最適化されてないんじゃないかな…

http://eslint.org/docs/rules/global-require