全局设置项目的node_modules位置

如果我写

var moment = require('moment'); 

在我的项目中,节点浪费了大量时间查看实际上不包含文件的地方,正如这个dtruss输出显示的那样。

  PID/THRD RELATIVE SYSCALL(args) = return 7079/0x7cf313: 1244530 stat64("/Users/burke/code/api/api/models/node_modules/moment\0", 0x7FFF5FBFE5D8, 0x9) = -1 Err#2 7079/0x7cf313: 1244575 stat64("/Users/burke/code/api/api/models/node_modules/moment.js\0", 0x7FFF5FBFE578, 0x9) = -1 Err#2 7079/0x7cf313: 1244595 stat64("/Users/burke/code/api/api/models/node_modules/moment.json\0", 0x7FFF5FBFE578, 0x9) = -1 Err#2 7079/0x7cf313: 1244612 stat64("/Users/burke/code/api/api/models/node_modules/moment.node\0", 0x7FFF5FBFE578, 0x9) = -1 Err#2 7079/0x7cf313: 1244628 stat64("/Users/burke/code/api/api/models/node_modules/moment.coffee\0", 0x7FFF5FBFE578, 0x9) = -1 Err#2 7079/0x7cf313: 1244663 open("/Users/burke/code/api/api/models/node_modules/moment/package.json\0", 0x0, 0x1B6) = -1 Err#2 7079/0x7cf313: 1244694 stat64("/Users/burke/code/api/api/models/node_modules/moment/index.js\0", 0x7FFF5FBFE578, 0x1B6) = -1 Err#2 7079/0x7cf313: 1244713 stat64("/Users/burke/code/api/api/models/node_modules/moment/index.json\0", 0x7FFF5FBFE578, 0x1B6) = -1 Err#2 7079/0x7cf313: 1244729 stat64("/Users/burke/code/api/api/models/node_modules/moment/index.node\0", 0x7FFF5FBFE578, 0x1B6) = -1 Err#2 7079/0x7cf313: 1244745 stat64("/Users/burke/code/api/api/models/node_modules/moment/index.coffee\0", 0x7FFF5FBFE578, 0x1B6) = -1 Err#2 7079/0x7cf313: 1244767 stat64("/Users/burke/code/api/api/node_modules/moment\0", 0x7FFF5FBFE5D8, 0x1B6) = -1 Err#2 7079/0x7cf313: 1244788 stat64("/Users/burke/code/api/api/node_modules/moment.js\0", 0x7FFF5FBFE578, 0x1B6) = -1 Err#2 7079/0x7cf313: 1244805 stat64("/Users/burke/code/api/api/node_modules/moment.json\0", 0x7FFF5FBFE578, 0x1B6) = -1 Err#2 7079/0x7cf313: 1244821 stat64("/Users/burke/code/api/api/node_modules/moment.node\0", 0x7FFF5FBFE578, 0x1B6) = -1 Err#2 7079/0x7cf313: 1244837 stat64("/Users/burke/code/api/api/node_modules/moment.coffee\0", 0x7FFF5FBFE578, 0x1B6) = -1 Err#2 7079/0x7cf313: 1244862 open("/Users/burke/code/api/api/node_modules/moment/package.json\0", 0x0, 0x1B6) = -1 Err#2 7079/0x7cf313: 1244887 stat64("/Users/burke/code/api/api/node_modules/moment/index.js\0", 0x7FFF5FBFE578, 0x1B6) = -1 Err#2 7079/0x7cf313: 1244904 stat64("/Users/burke/code/api/api/node_modules/moment/index.json\0", 0x7FFF5FBFE578, 0x1B6) = -1 Err#2 7079/0x7cf313: 1244920 stat64("/Users/burke/code/api/api/node_modules/moment/index.node\0", 0x7FFF5FBFE578, 0x1B6) = -1 Err#2 7079/0x7cf313: 1244936 stat64("/Users/burke/code/api/api/node_modules/moment/index.coffee\0", 0x7FFF5FBFE578, 0x1B6) = -1 Err#2 7079/0x7cf313: 1244964 stat64("/Users/burke/code/api/node_modules/moment\0", 0x7FFF5FBFE5D8, 0x1B6) = 0 0 7079/0x7cf313: 1244990 stat64("/Users/burke/code/api/node_modules/moment.js\0", 0x7FFF5FBFE578, 0x1B6) = -1 Err#2 7079/0x7cf313: 1245015 stat64("/Users/burke/code/api/node_modules/moment.json\0", 0x7FFF5FBFE578, 0x1B6) = -1 Err#2 7079/0x7cf313: 1245038 stat64("/Users/burke/code/api/node_modules/moment.node\0", 0x7FFF5FBFE578, 0x1B6) = -1 Err#2 7079/0x7cf313: 1245488 madvise(0x1008AE000, 0x21000, 0x9) = 0 0 7079/0x7cf313: 1245503 stat64("/Users/burke/code/api/node_modules/moment.coffee\0", 0x7FFF5FBFE578, 0x9) = -1 Err#2 7079/0x7cf313: 1245612 open("/Users/burke/code/api/node_modules/moment/package.json\0", 0x0, 0x1B6) = 11 0 

有没有办法让节点不浪费那么多时间在不包含node_modules目录的地方? 就像,我可以设置一些CHECK_HERE_FIRST=$HOME/code/api/node_modules环境variables,如果require不是相对path,那么这将是Node检查的第一个地方。

我可以更改所有require行来加载相对导入,但对于大型项目来说这似乎很麻烦。

从io.js v2.3.1中删除了这个行为(使得太多的stat)(参见PR ),它将会在node.js的下一个主要版本中可用。

我不认为有没有一个优雅的方式来做到这一点,而不require改变,这是应该避免的。 如果您担心性能问题,可能会帮助您在晚上睡觉,因为只有一次因模块caching而发生这种情况。

也许你可以在你的应用程序启动时require所有你需要的模块。

根据节点的文档 ,没有办法改变这种行为

如果传递给require()的模块标识符不是本地模块,并且不以“/”,“../”或“./”开头,则节点从当前模块的父目录开始,并添加/ node_modules,并尝试从该位置加载模块。

如果在那里没有find,那么它会移到父目录,依此类推,直到到达文件系统的根目录。

你应该注意,加载的模块被caching,所以性能不应该成为一个问题。 如果您使用Express,则此加载过程仅在启动时完成。