Closes #1177 remove one node_modules optimization
to better support certain project structures.
This commit is contained in:
parent
88552c51ae
commit
39246f65df
@ -68,8 +68,7 @@ parent directory of the current module, and adds `/node_modules`, and
|
|||||||
attempts to load the module from that location.
|
attempts to load the module from that location.
|
||||||
|
|
||||||
If it is not found there, then it moves to the parent directory, and so
|
If it is not found there, then it moves to the parent directory, and so
|
||||||
on, until either the module is found, or the root of the tree is
|
on, until the root of the tree is reached.
|
||||||
reached.
|
|
||||||
|
|
||||||
For example, if the file at `'/home/ry/projects/foo.js'` called
|
For example, if the file at `'/home/ry/projects/foo.js'` called
|
||||||
`require('bar.js')`, then node would look in the following locations, in
|
`require('bar.js')`, then node would look in the following locations, in
|
||||||
@ -83,28 +82,6 @@ this order:
|
|||||||
This allows programs to localize their dependencies, so that they do not
|
This allows programs to localize their dependencies, so that they do not
|
||||||
clash.
|
clash.
|
||||||
|
|
||||||
#### Optimizations to the `node_modules` Lookup Process
|
|
||||||
|
|
||||||
When there are many levels of nested dependencies, it is possible for
|
|
||||||
these file trees to get fairly long. The following optimizations are thus
|
|
||||||
made to the process.
|
|
||||||
|
|
||||||
First, `/node_modules` is never appended to a folder already ending in
|
|
||||||
`/node_modules`.
|
|
||||||
|
|
||||||
Second, if the file calling `require()` is already inside a `node_modules`
|
|
||||||
hierarchy, then the top-most `node_modules` folder is treated as the
|
|
||||||
root of the search tree.
|
|
||||||
|
|
||||||
For example, if the file at
|
|
||||||
`'/home/ry/projects/foo/node_modules/bar/node_modules/baz/quux.js'`
|
|
||||||
called `require('asdf.js')`, then node would search the following
|
|
||||||
locations:
|
|
||||||
|
|
||||||
* `/home/ry/projects/foo/node_modules/bar/node_modules/baz/node_modules/asdf.js`
|
|
||||||
* `/home/ry/projects/foo/node_modules/bar/node_modules/asdf.js`
|
|
||||||
* `/home/ry/projects/foo/node_modules/asdf.js`
|
|
||||||
|
|
||||||
### Folders as Modules
|
### Folders as Modules
|
||||||
|
|
||||||
It is convenient to organize programs and libraries into self-contained
|
It is convenient to organize programs and libraries into self-contained
|
||||||
|
@ -199,12 +199,7 @@ Module._nodeModulePaths = function(from) {
|
|||||||
var paths = [];
|
var paths = [];
|
||||||
var parts = from.split(splitRe);
|
var parts = from.split(splitRe);
|
||||||
|
|
||||||
var root = parts.indexOf('node_modules') - 1;
|
for (var tip = parts.length - 1; tip >= 0; tip --) {
|
||||||
if (root < 0) root = 0;
|
|
||||||
|
|
||||||
var tip = parts.length - 1;
|
|
||||||
|
|
||||||
for (var tip = parts.length - 1; tip >= root; tip --) {
|
|
||||||
// don't search in .../node_modules/node_modules
|
// don't search in .../node_modules/node_modules
|
||||||
if (parts[tip] === 'node_modules') continue;
|
if (parts[tip] === 'node_modules') continue;
|
||||||
var dir = parts.slice(0, tip + 1).concat('node_modules').join(joiner);
|
var dir = parts.slice(0, tip + 1).concat('node_modules').join(joiner);
|
||||||
|
6
test/fixtures/node_modules/baz/index.js
generated
vendored
6
test/fixtures/node_modules/baz/index.js
generated
vendored
@ -25,11 +25,5 @@ console.error(module.paths.join('\n')+'\n');
|
|||||||
var assert = require('assert');
|
var assert = require('assert');
|
||||||
assert.equal(require('bar'), require('../bar.js'));
|
assert.equal(require('bar'), require('../bar.js'));
|
||||||
|
|
||||||
// since this is inside a node_modules folder,
|
|
||||||
// it should be impossible to ever see /node_modules in the
|
|
||||||
// lookup paths, since it's rooted on the uppermost node_modules
|
|
||||||
// directory.
|
|
||||||
assert.equal(-1, module.paths.indexOf('/node_modules'));
|
|
||||||
|
|
||||||
// this should work, and get the one in ./node_modules/asdf.js
|
// this should work, and get the one in ./node_modules/asdf.js
|
||||||
assert.equal(require('asdf'), require('./node_modules/asdf.js'));
|
assert.equal(require('asdf'), require('./node_modules/asdf.js'));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user