How to share code between node.js apps?

Issue

I have several apps in node that all share a few modules that I’ve written. These modules are not available via npm. I would like to be able to share freely between apps, but I don’t want to copy directories around, nor rely on Git to do so. And I’m not really big on using symlinks to do this either.

I would like to arrange directories something like this:

app1
 server.js
 node_modules
  (public modules from npm needed for app1)
 lib
  (my own modules specific to app1)

app2
 server.js
 node_modules
  (public modules from npm needed for app2)
 lib
  (my own modules specific to app2)

shared_lib
 (my own modules that are used in both app1 and app2)

The problem I’m seeing is that the modules in shared_lib seem to get confused as to where to find the modules that will be in the node_modules directory of whichever app they are running in. At least I think that is the problem.

So….what is a good way to do this that avoids having duplicates of files? (note that I don’t care about duplicates of things in node_modules, since those aren’t my code, I don’t check them into Git, etc)

Solution

I’ve got this working by having node_modules folders at different levels – node then automatically traverses upwards until it finds the module.

Note you don’t have to publish to npm to have a module inside of node_modules – just use:

"private": true

Inside each of your private package.json files – for your project I would have the following:

app1
 server.js
 node_modules
  (public modules from npm needed for app1)
  (private modules locally needed for app1)

app2
 server.js
 node_modules
  (public modules from npm needed for app2)
  (private modules locally needed for app2)

node_modules
  (public modules from npm needed for app1 & app2)
  (private modules locally for app1 & app2)

The point is node.js has a mechanism for dealing with this already and it’s awesome. Just combine it with the ‘private not on NPM’ trick and you are good to go.

In short a:

require('somemodule')

From app A or B would cascade upwards until it found the module – regardless if it lived lower down or higher up. Indeed – this lets you hot-swap the location without changing any of the require(…) statements.

node.js module documentation

Answered By – Bino Carlos

Answer Checked By – Terry (AngularFixing Volunteer)

Leave a Reply

Your email address will not be published.