2015-04-20 55 views
11

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環境變量,並且如果require不是用於相對路徑,那將是Node檢查的第一個地方。

我可以更改我所有的require行來加載相對導入,但這對於大型項目來說似乎很麻煩。

回答

0

我不認爲有一個優雅的方式來做到這一點,而不會改變require,這應該避免。如果您擔心性能問題,它可能會幫助您在晚上睡覺,因爲它只會因模塊緩存而發生一次。

也許你可以require你的應用程序啓動過程中需要的所有模塊。

0

node's docs,有沒有辦法來改變這種行爲

如果傳遞給需要()的模塊標識符是不是原生模塊,並且不以「/」,開始「../」 ,或'./',那麼節點從當前模塊的父目錄開始,並添加/ node_modules,並嘗試從該位置加載模塊。

如果在那裏沒有找到它,那麼它將移到父目錄,依此類推,直到到達文件系統的根目錄。

您應該注意,加載的模塊已被緩存,因此性能不應該成爲問題。如果您使用Express,則此加載過程僅在啓動時完成。

4

從io.js v2.3.1中刪除了此行爲(使得太多stat)(請參閱PR),它將在下一個主要版本的node.js中可用。