Root directory in package.json
UPDATE 2020
The issue suggesting mainDir is now closed. Instead there is a new field called exports
which can be used almost like es import maps to map a folder to an export alias:
// ./node_modules/es-module-package/package.json
{
"exports": {
"./my/": "./src/js/lib/my/"
}
}
import thing from 'es-module-package/my/thing.js';
// Loads ./node_modules/es-module-package/src/js/lib/my/thing.js
As suggested in the issue linked in the original answer below it may be possible to map the root to a folder to access import thing from pkg/thing.js
as so:
{
"type": "module",
"main": "./dist/index.js",
"exports": {
"./": "./src/js/lib/my/"
}
}
Original Answer
For a native solution, see this node issue https://github.com/nodejs/node/issues/14970
The feature request suggests a mainDir
field in the package.json next to main.
The more people that vote, the faster/more likely it will be implemented
As the doc says:
The main field is a module ID that is the primary entry point to your program.
So you'll have something like "main": "src/js/lib/my/app.js"
in your package.json file.
I would suggest you to create an app.js
file and module.exports
your different children. For example:
module.exports.thing = require('./thing');
module.exports.that = require('./that');
And use them like this:
var mylib = require('mylib')
, thing = mylib.thing
, that = mylib.that;
package.json
is mainly a file used by npm
to install and manage dependencies.
the require
construct does not care a lot about package.json
so you will not be able to use it to subvert the way require
works and make it believe that packages are not where the require
loading scheme expects them.
See the documentation on https://nodejs.org/api/modules.html and the loading scheme here: https://nodejs.org/api/modules.html#modules_all_together
you could maybe use the technique that the documentation calls 'Loading from the global folders' and define the NODE_PATH
environment variable.
but I advise you to stick to a more standard way : - put your modules in a node_modules directory - or start your module hierarchy in the same directory where your app.js or index.js is located
Now this is ugly workaround and it does pollute the root of your package. But until Jordan's answer works, this feels like the way to achieve what you ask.
Just add a file in the root of your package for each of the modules you want to export using the require with slash notation. Such file will have the same name as the module being exported and it will simply reexport it.
.
├── package.json
├── thing.js <--
├── that.js <--
├── src
| ├── js
| └────── lib
| └───────── my
| └───────────── thing.js
| └───────────── that.js
For example file ./thing.js
will contain:
module.exports = require('./src/js/lib/my/thing');
And so you could require it as:
const thing = require('mypackage/thing');
Also as stated in the bug about adding mainDir
property into package.json
you can just temporarily copy your sources and the package.json file into one directory and publish from there.