Some food for thought from a non-standard use-case.
So, from my POV, loading a module from script with the extension .js is not ideal. If you are going to assign meaning to the extension, you must think about what it means. In our case, it indicates the file type to load, and the implementation of the library is not relevant to the library user - only the API matters. And if you are only ever going to allow one extension type, then there is no point to typing .js on the end of every module name.
In my opinion, the ModuleSpecifier should be fed the module name, and is it up to the loader to munge the filename (eg by adding .js) as it sees fit.