The specifier of an import statement is the string after the from keyword,
e.g. 'path' in import { sep } from 'path'. Specifiers are also used in
export from statements, and as the argument to an import() expression.
There are three types of specifiers:
Relative specifiers like
'./startup.js'or'../config.mjs'. They refer to a path relative to the location of the importing file. The file extension is always necessary for these.Bare specifiers like
'some-package'or'some-package/shuffle'. They can refer to the main entry point of a package by the package name, or a specific feature module within a package prefixed by the package name as per the examples respectively. Including the file extension is only necessary for packages without an ["exports"][] field.Absolute specifiers like
'file:///opt/nodejs/config.js'. They refer directly and explicitly to a full path.
Bare specifier resolutions are handled by the [Node.js module resolution algorithm][]. All other specifier resolutions are always only resolved with the standard relative [URL][] resolution semantics.
Like in CommonJS, module files within packages can be accessed by appending a
path to the package name unless the package’s [package.json][] contains an
["exports"][] field, in which case files within packages can only be accessed
via the paths defined in ["exports"][].
For details on these package resolution rules that apply to bare specifiers in the Node.js module resolution, see the packages documentation.
