Importing modules using ES6 syntax and dynamic path

41,824

Solution 1

No, this is not possible. ES6 modules need to be able to statically resolve their dependencies, without executing module code, so that import statements do work reliably. The module specifier must be a string literal.

However, the module loader of your choice should support dynamic loading of modules with variable names. You wouldn't be able to get a bound app identifier in your module scope however (and cannot reexport it), it typically would only be available in a callback or so.

Solution 2

ES6 imports are declarative and meant for static analysis. They cannot be dynamic.

Generally the expectation would be that if you had some conditional imports, it would be the responsibility of the underlying path resolution logic to decide what module to load based on some static path.

That or you'd use the async module loader rather than declarative imports.

Share:
41,824
Félix Sanz
Author by

Félix Sanz

Updated on May 20, 2020

Comments

  • Félix Sanz
    Félix Sanz almost 4 years

    This works:

    import app from './../app.js';
    

    But this doesn't:

    import app from path.join(process.cwd(), 'app');
    

    I'm Getting:

    SyntaxError: /path/file.js: Unexpected token (5:16)
    > 5 | import app from path.join(process.cwd(), 'app');
        |                 ^
    

    It is possible (and/or how) to use "dynamic" paths? (not hardcoding the path or rely in relative paths).