Алексей Тен, это не то, там описывается цикл поиска модуля и файла как я в вопросе и описал
spoiler
require(X) from module at path Y
1. If X is a core module,
a. return the core module
b. STOP
2. If X begins with '/'
a. set Y to be the filesystem root
3. If X begins with './' or '/' or '../'
a. LOAD_AS_FILE(Y + X)
b. LOAD_AS_DIRECTORY(Y + X)
c. THROW "not found"
4. LOAD_SELF_REFERENCE(X, dirname(Y))
5. LOAD_NODE_MODULES(X, dirname(Y))
7. THROW "not found"
LOAD_AS_FILE(X)
1. If X is a file, load X as JavaScript text. STOP
2. If X.js is a file, load X.js as JavaScript text. STOP
3. If X.json is a file, parse X.json to a JavaScript Object. STOP
4. If X.node is a file, load X.node as binary addon. STOP
Указывая / или ./, или ../ явно сообщается откуда начинать поиск. Но туда же можно подсунуть свою функцию, которая будет искать файл по тем папкам, по которым захочешь. Так что пользуйся.
Еще в данную функцию можно передать список путей, где искать. require.resolve(request[, options])
Но я бы не маялся это фигней. Может случиться так, что будут два модуля с одним именем. Ты будешь думать, что подключил один, а автоматом был найден другой. Или захочешь узнать что да как, и откуда ноги растут и будешь вручную брутфорсить папки. Поддержки в IDE никакой не будет.