Skip to content

Does the require.resolve paths option work just like the baseDir option? #188

Description

@watson

Since Node.js v8.9.0, a new paths option was made available to the core Node.js require.resolve function:

paths <string[]> Paths to resolve module location from. If present, these paths are used instead of the default resolution paths, with the exception of GLOBAL_FOLDERS like $HOME/.node_modules, which are always included. Note that each of these paths is used as a starting point for the module resolution algorithm, meaning that the node_modules hierarchy is checked from this location.

As far as I can see, if just given a single element in the paths array, this works identical to the baseDir option of this module. The new paths features does however take into account the GLOBAL_FOLDERS, which I'm not sure if this module does?

I ask because I would like to feature detect this and use the internal Node.js function if available, but fall back to this module if not. But I wasn't sure if the behavior was 100% identical 🤔

Activity

  1. ljharb commented on Mar 20, 2019

    @ljharb
    Member

    Since it's relatively new, this package hasn't adapted to it yet, no.

    Would you be willing to make a PR with test cases, comparing require.resolve's paths option to the basedir option?

    Another possibility might be, adding a paths option to resolve itself.

    (do you need the GLOBAL_FOLDERS? requiring things from there is widely considered an antipattern)

  2. watson commented on Mar 21, 2019

    @watson
    Author

    I don't mind taking a stab at it.

    I don't personally use GLOBAL_FOLDERS no, but I'm the maintainer of a popular module which is used to patch the require function where I depend on being able to resolve modules. And I can't rule out if any of their apps depend on the GLOBAL_FOLDERS environment variable unfortunately.

  3. watson commented on Mar 31, 2019

    @watson
    Author

    I somehow can't get the normal test suite to run in master. Is it because I have cloned this repo into a folder whos path already contain a node_modules folder? Usually that's where I keep my all the Node modules I'm working on which makes working on multiple modules with inter-dependencies much easier.

    image

  4. watson commented on Mar 31, 2019

    @watson
    Author

    Installed in /tmp and it worked. So I guess it's related to the node_modules folder in the path

  5. watson commented on Mar 31, 2019

    @watson
    Author

    As far as I can see, no where in the current tests do you validate that require.sync returns the same result as require.resolve. Is this on purpose?

  6. ljharb commented on Apr 6, 2019

    @ljharb
    Member

    Not that I know of; I've always found that a bit confusing but haven't taken the time to fix it.

    It sounds like there's a few action items here:

    1. file an issue about the repo not working properly with a sibling node_modules (if i've understood the problem correctly)
    2. make a PR that adds a test suite comparing both resolve and resolve.sync with require.resolve, to ensure consistency and/or illustrate the differences
    3. make a PR for adding the paths option

    Thoughts?

  7. wclr commented on Aug 24, 2020

    @wclr

    resolve definitely does not mimic require.resolve behavior in terms of paths option. In require.resolve it works as multiple basedir. But also require includes there dirs from NODE_PATH which is rarely desired behavior.

  8. ljharb commented on Aug 25, 2020

    @ljharb
    Member

    @watson are you interested in doing any of the steps I outlined above?

  9. ljharb commented on Jan 4, 2022

    @ljharb
    Member

    I've added bullet point 2 in 067db38.

    If you could give me some examples of test cases for paths with more than one item, i can look into supporting it in resolve.

  10. JounQin commented on May 28, 2025

    @JounQin

    I found a Node.js potential regression starts from Node 12.

    nodejs/node#58487

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions