There are essentially two ways to do this. Which one is suitable for you depends on what you want to accomplish.
Case 1: A, B and C are loosely related, that is if e.g. B can be used without A and C. Having A and/or C available would extend the functionality of B.
Case 2: A, B and C are tightly related and some part of A, B or C relies on the existence of A, B or C. Together they form a logical unit.
If Case 1 fits your projects' purpose, then you want to build separate node modules and have the end user pull in those modules and use them at will.
If Case 2 fits better, then you want to compile A, B and C into one module e.g. ABC. You can still structure the source code (and exported API) of the ABC module according to A, B and C.
Building three separate modules and linking them dynamically makes little sense. In fact, they are dynamically linked (by node) when imported (
require'd) in node-land. Linking them together statically might make more sense, bus is essentially just a messier way of accomplishing "solution 2" (producing a single module).
If A, B and C are three modules that are not authored by you, then you are dealing with a hierarchy. As you explain it in your hypothesis, the hierarchy of dependance is:
B --requires--> A
C --requires--> B
C --requires--> A
require the three modules. Compile A, B and C as separate modules and have them live "inside" your compound module. The file system structure could look something like this:
foo/ # Your compound module
foo/index.js # require('./_A'), require('./_B'), require('./_C')
As the code in _C.node requires certain symbols to be implemented (i.e. the depending symbols from A and B), you will need to load the modules in order.
Note that I have not tested this, but in theory, this should work.