Eu preciso de um módulo que foi instalado via npm. Desejo acessar um arquivo .js subordinado a esse módulo (para que possa criar uma subclasse de um método Construtor nele). Eu não posso (bem, não quero) modificar o código do módulo, então não tenho um lugar para extrair seu __dirname.
Estou ciente da seguinte questão, mas é sobre como obter o caminho de um módulo sobre o qual se tem controle de código (portanto, __dirname é a solução): No Node.js, como posso saber o caminho do módulo `this`?
~~~
Ainda melhor seria obter as informações do módulo carregado do módulo
Respostas:
Se entendi corretamente sua pergunta, você deve usar require.resolve () :
Exemplo:
var pathToModule = require.resolve('module');
fonte
require.resolve () é uma resposta parcial. A resposta aceita pode funcionar para muitos módulos de nó, mas não funcionará para todos eles.
require.resolve("moduleName")
não fornece o diretório onde o módulo está instalado; fornece a localização do arquivo definido nomain
atributo do módulopackage.json
.Isso pode ser
moduleName/index.js
ou poderia sermoduleName/lib/moduleName.js
. No último caso,path.dirname(require.resolve("moduleName"))
retornará um diretório que você não deseja ou espera:node_modules/moduleName/lib
A maneira correta de obter o caminho completo para um módulo específico é resolvendo o nome do arquivo:
Se você quer apenas o diretório do módulo (talvez você vá fazer muitas
path.join()
chamadas), resolva opackage.json
- que deve estar sempre na raiz do projeto - e passe parapath.dirname()
:fonte
package.json
arquivo. Você não deveria usarpath.join('moduleName', 'package.json')
para ser compatível com o Windows?require.resolve
é agnóstico de plataforma, assim comorequire
não é necessário usarpath.join
const path = require('path');
antes de usarpath.dirname
.require.resolve('@scope/module')
que me dá algo parecido/path/to/@scope/module/dist/index.js
, porém se eu tentar executá-require.resolve('@scope/module/package.json')
lo gera umMODULE_NOT_FOUND
erro. Estou no Nó 14.4.0 e o módulo que estou tentando resolver tem"type": "module"
em seu package.json com umexports
campo que não incluipackage.json
. Não tenho certeza se isso tem alguma coisa a ver com isso ...type: module
, aparentementepackage.json
tem que ser explicitamente exposto noexports
campo. Achei que o novo recurso ESM do Node não bloqueou arequire
resolução de caminhos como de costume, mas parece que sim.FYI,
require.resolve
retorna o identificador do módulo de acordo com CommonJS. Em node.js, este é o nome do arquivo. No webpack, é um número.Em situação de webpack , aqui está minha solução para descobrir o caminho do módulo:
Então
__webpack_modules__[pathToModule]
, obtive informações como esta:Acontece que eu precisava de scripts antigos do arquivo de compilação dll anterior (para velocidade de compilação mais rápida), de modo que meu arquivo de módulo atualizado não funcionasse como eu esperava. Finalmente eu reconstruí meu arquivo DLL e resolvi meu problema.
Ref: Usando
require.resolve
para obter o caminho do arquivo resolvido (nó)fonte
Espero ter entendido corretamente suas necessidades: obter o arquivo de ponto de entrada de algum módulo. Digamos que você deseja obter o ponto de entrada do
jugglingdb
módulo:Como você pode ver, esta não é a maneira "oficial" de obter esse tipo de informação sobre o módulo, portanto, o comportamento dessa função pode mudar de versão para versão. Eu o encontrei na fonte do nó: https://github.com/joyent/node/blob/master/lib/module.js#L280
fonte
De acordo com a solução @anatoliy, no MacOS XI encontrei os caminhos de pesquisa fazendo
então eu obtenho os caminhos de pesquisa resolvidos
Considerando que a
não vai resolver o módulo que estava procurando de jeito nenhum, na verdade o mais louco é que
_load
não vai resolver o módulo:enquanto a
require
vontade:mas eu não tenho este módulo em
então onde está este módulo ???
Primeiro eu tive que fazer um
$ sudo /usr/libexec/locate.updatedb
Então depois de um café eu fizlocate myModule
ou melhorlocate myModule/someFile.js
et voilà, descobri que estava em uma pasta pai do meu projeto, ou seja, fora da pasta raiz do meu projeto:
então você não pode evitar
rm -rf ../../node_modules/myModule/
e um novonpm install
.Posso argumentar que ninguém foi instruído
npm
a varrer meu computador em busca de módulos em outro lugar além da pasta raiz do projeto onde deveria ser executado ou no caminho de pesquisa de módulos padrão.fonte
Talvez seja isso que você está procurando, verifique:
fonte
A resposta de Jason foi a melhor resposta, até que o Node.js ESM e o
exports
campo surgiram.Agora que o Node oferece suporte a pacotes com um
exports
campo que, por padrão, impedirá que arquivos comopackage.json
sejam resolvidos , a menos que o autor do pacote decida explicitamente expô-los, o truque na resposta de Jason falhará para pacotes que não os expõem explicitamentepackage.json
.Existe um pacote chamado
resolve-package-path
que resolve o problema.Veja como usá-lo:
que irá produzir algo como
independentemente do que o
exports
campo do pacote contém.fonte