簡體   English   中英

Node.js包自引用

[英]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');

例如,這可能在測試中很有用:測試單元可以引用其測試對象,而無需使用冗長的上下路徑。

我有兩個考慮事項(但它們不能完全滿足此問題):

  1. 如果package已在node_modules文件夾中,則可以通過其規范名稱(在package.json )對其進行引用。

  2. 程序包可以在自己的node_modules文件夾中創建指向自身的符號鏈接(sic!)。 尚未嘗試過,在某些解決情況下可能會導致無限循環。

解決方案1

將其拆分為不同的子項目,然后將每個項目放入不同的文件夾中。 舉個例子:

  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.1sub.project.2sub.project.2替換my.project 當然,所有名稱都應為npm初始化的package.jsonname

解決方案2

在文件夾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的項目名稱和包名稱,也可以。

解決方案3

有npm軟件包: require-selfinstall-self ,它們做類似的事情。

解決方案4

在容易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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM