[英]Node.js package self-reference
包可以require
其自身及其子系統嗎?
例如,有一個模塊: src/deep/path/to/module.js
,它需要src/another/module.js
代替:
require('./../../../another/module.js');
可以一個:
require('<self>/another/module.js');
?
例如,這可能在測試中很有用:測試單元可以引用其測試對象,而無需使用冗長的上下路徑。
我有兩個考慮事項(但它們不能完全滿足此問題):
如果package已在node_modules
文件夾中,則可以通過其規范名稱(在package.json
)對其進行引用。
程序包可以在自己的node_modules
文件夾中創建指向自身的符號鏈接(sic!)。 尚未嘗試過,在某些解決情況下可能會導致無限循環。
將其拆分為不同的子項目,然后將每個項目放入不同的文件夾中。 舉個例子:
sub.project.1/
sub.project.2/
在sub.project.1 /中
# cd ../sub.project.1
npm link
# cd ../sub.project.2
npm link sub.project.1
然后在sub.project.2中,您可以簡單地做到這一點:
var something = require(“ sub.project.1”)
這可以刪除“ .. / .. / ...”相對路徑。
注意:可以在同一文件夾/項目中完成此操作,這樣可以在子文件夾中輕松引用項目自身 。 例如,當sub.project.1
和sub.project.2
被sub.project.2
替換my.project
。 當然,所有名稱都應為npm初始化的package.json
的name
。
在文件夾node_modules/
創建一個鏈接
# cd node_modules
ln -s .. myProjectRootDir
#
# where: .. : means parent directory in linux shell
# '#' means comments in linux shell
#
然后可以在相同級別的目錄樹下使用:
var something = require("myProjectRootDir/path/to/js/file")
因此,“ .. / .. / ...”可以更容易地更改為路徑讀取。 而且,如果myProjectRootDir
恰好是package.json
的項目名稱和包名稱,也可以。
有npm軟件包: require-self
, install-self
,它們做類似的事情。
在容易require
地方編寫一個新的.js
文件,然后將所有煩人的相對引用放入其中。
例如,將其寫在node_modules/mymods.js
// mymod.js
module.exports.mod_one = require("../path/to/mod/one.js");
//...
然后require('mymod')
可以提供所有其他模塊。 這不是最佳解決方案,所有需要參考的內容都需要手工完成。 但這是一個文件,因此是可管理的,並且可以集中引用以供將來部署。
此解決方案的缺點之一是,如果將其放在node_modules/
文件夾中,而該文件夾在git存儲庫中被忽略,則在推送或分支git repo時需要小心。
刪除node_modules文件夾時,也可能會意外刪除該文件。
好吧,您可以將其縮短一點。 在這種情況下,您不需要./
require("../../../another/module.js");
並通過刪除結尾的.js
進一步操作
require("../../../another/module");
另一個答案是建議使用process.cwd()
但要非常小心。 僅當應用程序是從同一目錄初始化的,您的require
調用才會起作用。
從聲音上看,4個目錄已經很深了。 您可能要考慮將大型項目分成較小的,單一用途的模塊。 我們將需要有關該項目的更多信息,以了解這是否是正確的決定。
我經常使用process.cwd()
使這樣的事情更易於管理。 這將返回實際運行節點應用程序的位置,並允許您以更簡潔的方式創建路徑。
可能類似於var x = require(process.cwd() + '/lib/module')
沒有確切地看到您要做什么? 我不確定這是否會有所幫助,但您也可以執行var connect = require('express/connect')
類的操作。 基本上,您可以傳遞已安裝的本地模塊,然后再從中創建路徑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.