Module._resolveLookupPaths 源码解析
Module._resolveLookupPaths = function (request, parent) {
  if (NativeModule.canBeRequiredByUsers(request)) {
    debug("looking for %j in []", request);
    return null;
  }
  // Check for node modules paths.
  if (
    StringPrototypeCharAt(request, 0) !== "." ||
    (request.length > 1 &&
      StringPrototypeCharAt(request, 1) !== "." &&
      StringPrototypeCharAt(request, 1) !== "/" &&
      (!isWindows || StringPrototypeCharAt(request, 1) !== "\\"))
  ) {
    let paths = modulePaths;
    if (parent != null && parent.paths && parent.paths.length) {
      paths = ArrayPrototypeConcat(parent.paths, paths);
    }
    debug("looking for %j in %j", request, paths);
    return paths.length > 0 ? paths : null;
  }
  // In REPL, parent.filename is null.
  if (!parent || !parent.id || !parent.filename) {
    // Make require('./path/to/foo') work - normally the path is taken
    // from realpath(__filename) but in REPL there is no filename
    const mainPaths = ["."];
    debug("looking for %j in %j", request, mainPaths);
    return mainPaths;
  }
  debug("RELATIVE: requested: %s from parent.id %s", request, parent.id);
  const parentDir = [path.dirname(parent.filename)];
  debug("looking for %j", parentDir);
  return parentDir;
};
1. 判断是否为内置模块
if (NativeModule.canBeRequiredByUsers(request)) {
  debug("looking for %j in []", request);
  return null;
}
如果是内置模块,返回 null
2. 判断 request 的值
// Check for node modules paths.
if (
  request.charAt(0) !== "." ||
  (request.length > 1 &&
    StringPrototypeCharAt(request, 1) !== "." &&
    StringPrototypeCharAt(request, 1) !== "/" &&
    (!isWindows || StringPrototypeCharAt(request, 1) !== "\\"))
) {
  let paths = modulePaths;
  if (parent != null && parent.paths && parent.paths.length) {
    paths = ArrayPrototypeConcat(parent.paths, paths);
  }
  debug("looking for %j in %j", request, paths);
  return paths.length > 0 ? paths : null;
}
- request 是否为相对路径
- request 是一个 .
- request 是以 . 开头的
- request 是以 / 开头的
 
2.1 获取模块目录
let paths = modulePaths;
modulePaths 是在环境变量中存储的一些环境变量的目录
2.2 添加路径
if (parent != null && parent.paths && parent.paths.length) {
  paths = parent.paths.concat(paths);
}
合并到传递过来的数组中