Live data from Hacker News

How I Work Around The require(“../../../../../../../”) Problem In NodeJS

lostechies.com

11–20 of 44 posts

Re: How I Work Around The require(“../../../../../../../”) Problem In NodeJS

#11

can't you install a private npm module by npm link? That won't touch the npm servers [1]. Then your other project in the same file system can just require like a first class public npm module. [1] https://www.npmjs.org/doc/cli/npm-link.html

How do you go about setting these links when you freshly checked out a project through source control? There is no "npm link all", is there?

https://github.com/clux/symlink

Re: How I Work Around The require(“../../../../../../../”) Problem In NodeJS

#12

can't you install a private npm module by npm link? That won't touch the npm servers [1]. Then your other project in the same file system can just require like a first class public npm module. [1] https://www.npmjs.org/doc/cli/npm-link.html

I don't think npm link is meant to be used in production like that.

Re: How I Work Around The require(“../../../../../../../”) Problem In NodeJS

#15
For me, a relative path in a require statement signifies that the required code is a part of the application itself.

Consider:

    require('foo');
Versus:

    require('./foo');
If I find that a module is becoming popular, I may turn it into an npm module by moving it to it's own folder and adding a package.json, then using npm's bundledDependencies property to inform npm that it lives locally.

(edit: Note that I've shifted my perspective on the module when this happens. The shift is from "This code is in a separate module to keep my application organized" to "This code is in a separate module because it has some logical independence from the application.")

If the module needed even more independence, I'd move it to it's own git repo and create an internal mirror of the npm repo so that it can be discovered internally, and unbundle it from my app. (I could see this happening especially with larger teams, or teams that embrace the "module all the things" philosophy.)

And of course, there's always the possibility of moving the module out to the public npm repos and hosting it there.

I've never had require with relative paths of more than two or three "double dots". (Note to self: Look up what those things are called formally.)

Re: How I Work Around The require(“../../../../../../../”) Problem In NodeJS

#16
I had this similar problem, but I solved it in a different way by creating a module outside of the node_modules folder, and putting a symlink in the node_modules folder. Read here to see how I broke this down http://winder.ws/blog/2013/10/15/structuring-local-node-modu...

Re: How I Work Around The require(“../../../../../../../”) Problem In NodeJS

#18
While I don't personally do this - I try to follow node idiom of having each package be a relatively thin layer of functionality and having packages depend on each other, I believe that you don't need to use relative paths if you don't want to.

For example, if your package is called my-node-module and you have something in my-node-module/lib/app/dir/thingy/wotsit/jimminy.js, it can reference something in my-node-module/lib/server/alf.js by simply going

    require("my-node-module/lib/server/alf.js");
There's no need for the relative path at all. It's possible that this only works if your package is in an node_modules directory (which it will be if it's installed as a dependency), but I always symlink my development directory to node_modules anyway.

Re: How I Work Around The require(“../../../../../../../”) Problem In NodeJS

#19
post #13

I am not sure all your private code on git should be publicly accessible. Wouldn't it be possible to point dependency to private in-house GIT repository?

That is the option (g) here:

https://www.npmjs.org/doc/install.html

You can also use your own npm registy using `--registry`:

https://www.npmjs.org/doc/misc/npm-registry.html

Re: How I Work Around The require(“../../../../../../../”) Problem In NodeJS

#20
There are lots of workarounds. My preferred workaround isn't especially good, but it keeps me sane since I also hate having giant relative paths. https://gist.github.com/jdc0589/9115898

Usage is as follows:

    var pRequire("./projectRequire")(rootPathOfYourProject);
    var MyModule = pRequire("~/lib/foo/bar/myModule");
It doesn't really buy you anything over `require("nameOfYourPackage/path/to/module")`, but I like the consistent "~" prefix across projects using the same scheme.

Moving things to their own NPM package is a great solution when its something re-usable that logically makes sense to exist on it's own, but that isn't the case most of the time.

Post reply on HN