How to make node.js require absolute? (instead of relative)
I would like to require my files always by the root of my project and not relative to the current module.
For example if you look at https://github.com/visionmedia/express/blob/2820f2227de0229c5d7f28009aa432f9f3a7b5f9/examples/downloads/app.js line 6 you will see
express = require('../../')
That's really bad IMO. Imagine I would like to put all my examples closer to the root only by one level. That would be impossible, because I would have to update more than 30 examples and many times within each example. To this:
express = require('../')
My solution would be to have a special case for root based: if a string starts with an $ then it's relative to the root folder of the project.
Any help is appreciated, thanks
Update 2
Now I'm using require.js which allows you to write in one way and works both on client and on server. Require.js also allows you to create custom paths.
Update 3
Now I moved to webpack + gulp and I use enhanced-require to handle modules on the server side. See here the rationale: http://hackhat.com/p/110/module-loader-webpack-vs-requirejs-vs-browserify/
And what about:
var myModule = require.main.require('./path/to/module');
It requires the file as if it were required from the main js file, so it works pretty well as long as your main js file is at the root of your project... and that's something I appreciate.
There's a really interesting section in the Browserify Handbook:
avoiding ../../../../../../..
Not everything in an application properly belongs on the public npm and the overhead of setting up a private npm or git repo is still rather large in many cases. Here are some approaches for avoiding the
../../../../../../../
relative paths problem.node_modules
People sometimes object to putting application-specific modules into node_modules because it is not obvious how to check in your internal modules without also checking in third-party modules from npm.
The answer is quite simple! If you have a
.gitignore
file that ignoresnode_modules
:node_modules
You can just add an exception with
!
for each of your internal application modules:node_modules/* !node_modules/foo !node_modules/bar
Please note that you can't unignore a subdirectory, if the parent is already ignored. So instead of ignoring
node_modules
, you have to ignore every directory insidenode_modules
with thenode_modules/*
trick, and then you can add your exceptions.Now anywhere in your application you will be able to
require('foo')
orrequire('bar')
without having a very large and fragile relative path.If you have a lot of modules and want to keep them more separate from the third-party modules installed by npm, you can just put them all under a directory in
node_modules
such asnode_modules/app
:node_modules/app/foo node_modules/app/bar
Now you will be able to
require('app/foo')
orrequire('app/bar')
from anywhere in your application.In your
.gitignore
, just add an exception fornode_modules/app
:node_modules/* !node_modules/app
If your application had transforms configured in package.json, you'll need to create a separate package.json with its own transform field in your
node_modules/foo
ornode_modules/app/foo
component directory because transforms don't apply across module boundaries. This will make your modules more robust against configuration changes in your application and it will be easier to independently reuse the packages outside of your application.symlink
Another handy trick if you are working on an application where you can make symlinks and don't need to support windows is to symlink a
lib/
orapp/
folder intonode_modules
. From the project root, do:ln -s ../lib node_modules/app
and now from anywhere in your project you'll be able to require files in
lib/
by doingrequire('app/foo.js')
to getlib/foo.js
.custom paths
You might see some places talk about using the
$NODE_PATH
environment variable oropts.paths
to add directories for node and browserify to look in to find modules.Unlike most other platforms, using a shell-style array of path directories with
$NODE_PATH
is not as favorable in node compared to making effective use of thenode_modules
directory.This is because your application is more tightly coupled to a runtime environment configuration so there are more moving parts and your application will only work when your environment is setup correctly.
node and browserify both support but discourage the use of
$NODE_PATH
.