Importing modules using ES6 syntax and dynamic path

Javascriptnode.jsModuleEcmascript 6

Javascript Problem Overview


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).

Javascript Solutions


Solution 1 - Javascript

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 - Javascript

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionFélix SanzView Question on Stackoverflow
Solution 1 - JavascriptBergiView Answer on Stackoverflow
Solution 2 - JavascriptloganfsmythView Answer on Stackoverflow