Importing modules using ES6 syntax and dynamic path [duplicate]
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).
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.