11

如果我写

var moment = require('moment');

在我的项目中,Node 浪费了大量时间来查找实际上不包含该文件的位置,如此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 不会在不包含目录的地方浪费太多时间node_modules?就像,我可以设置某种CHECK_HERE_FIRST=$HOME/code/api/node_modules环境变量,如果需要的不是相对路径,那将是 Node 检查的第一个地方。

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

4

3 回答 3

5

io.js v2.3.1中已删除此行为(生成太多统计信息)(请参阅PR),它将在 node.js 的下一个主要版本中可用。

于 2015-06-26T18:29:46.293 回答
0

我不认为有一种优雅的方式可以做到这一点而无需改变require,应该避免。如果您担心性能问题,它可能会帮助您在晚上睡觉,因为知道由于模块缓存而这只发生一次。

也许您可以require在应用程序启动期间获得所需的所有模块。

于 2015-06-11T02:34:52.250 回答
0

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

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

如果在那里没有找到,则移动到父目录,依此类推,直到到达文件系统的根目录。

您应该注意加载的模块被缓存,因此性能应该不是问题。如果您使用 Express,则此加载过程仅在启动时完成。

于 2015-06-19T16:05:19.033 回答