Ainda estou confuso sobre como resolver os caminhos dos módulos com o webpack. Agora eu escrevo:
myfile = require('../../mydir/myfile.js')
mas eu gostaria de escrever
myfile = require('mydir/myfile.js')
Eu estava pensando que resolve.alias pode ajudar, pois vejo um exemplo semelhante usando { xyz: "/some/dir" }
como alias, então eu posso require("xyz/file.js")
.
Mas se eu definir meu alias { mydir: '/absolute/path/mydir' }
, require('mydir/myfile.js')
não funcionará.
Me sinto burra porque li o documento várias vezes e sinto falta de alguma coisa. Qual é o caminho certo para evitar escrever todo o parente exige com ../../
etc?
javascript
webpack
gpbl
fonte
fonte
resolve.alias
funciona exatamente da maneira que você sugeriu. Gostaria de saber se estava falhando por causa de outra coisa na suaresolve
configuração. Eu usoalias{ mydir: path.resolve( __dirname, 'path', 'to', 'mydir' )
erequire( 'mydir/myfile.js' )
funciona muito bem.Respostas:
Webpack> 2.0
Veja a resposta de wtk .
Webpack 1.0
Uma maneira mais direta de fazer isso seria usar o resolve.root.
http://webpack.github.io/docs/configuration.html#resolve-root
No seu caso:
configuração do webpack
módulo consumidor
ou
consulte também: http://webpack.github.io/docs/configuration.html#resolve-modulesdirectories
fonte
root
,modulesDirectories
e uma mistura de ambos, mas não funcionou. Parece que os submódulos (por exemplorequire("mydir/file")
) não são aceitos.WebpackOptionsValidationError: Invalid configuration object. Webpack has been initialised using a configuration object that does not match the API schema. - configuration.resolve has an unknown property 'root'.
Para referência futura, o webpack 2 removeu tudo, mas
modules
como uma maneira de resolver caminhos. Isso significaroot
que não vai funcionar.https://gist.github.com/sokra/27b24881210b56bbaff7#resolving-options
A configuração de exemplo começa com:
fonte
modulesDirectories
ainda é usado pelo webpack-dev-server, mesmo com o webpack 2, o que torna isso muito confuso.resolve.alias
deve funcionar exatamente da maneira que você descreveu, por isso estou fornecendo isso como uma resposta para ajudar a atenuar qualquer confusão que possa resultar da sugestão na pergunta original de que ela não funciona.uma configuração de resolução como a abaixo fornecerá os resultados desejados:
require( 'mydir/myfile.js' )
funcionará como esperado. Caso contrário, deve haver outro problema.Se você possui vários módulos que deseja adicionar ao caminho de pesquisa,
resolve.root
faz sentido, mas se você apenas deseja referenciar componentes no código do aplicativo sem caminhos relativos,alias
parece ser o mais direto e explícito.Uma vantagem importante
alias
é que ela oferece a oportunidade de nomear seusrequire
s, o que pode adicionar clareza ao seu código; assim como é fácil ver de outrasrequire
s quais módulos estão sendo referenciados,alias
permite que você escrevarequire
s descritivas que tornam óbvio que você está exigindo módulos internos, por exemplorequire( 'my-project/component' )
.resolve.root
basta colocá-lo no diretório desejado sem dar a você a oportunidade de colocá-lo ainda mais em namespace.fonte
alias: {'~': path.resolve(__dirname)},
require('mydir/myfile')
)? Isso deve realmente funcionar. Você pode ter várias entradasalias
; Eu uso isso para importar do meusrc
diretório para módulos JavaScript e outro para importar do meustyles
diretório para css. Deixe-me saber se eu entendi completamente sua pergunta.import './path/to/Component1';
- simplesmente sem o nome e a extensão do arquivo interno no caminho. De alguma forma, o webpack conseguiu detectar que o arquivo Inner tem o nome do diretório e apenas o importou. agora o que eu quero fazer é importá-lo assim:import 'shared\Component1';
quando 'shared' é o alias. mas não funciona sem especificar o nome do arquivo interno. Obrigado!Caso alguém encontre esse problema, eu consegui fazê-lo funcionar assim:
onde minha estrutura de diretórios é:
Então, de qualquer lugar do
src
diretório que eu possa chamar:fonte
'node_modules'
lugar.[ path.resolve(__dirname, 'src'), 'node_modules' ],
lodash
, querolodash
ser resolvido SOMENTE a partir deprojectA/node_modules
. É para isso queresolve.modules: [path.resolve(__dirname, 'node_modules')]
é útil. No entanto, estou tendo problemas com subdependências, como você disse. Existe uma maneira de dizer ao webpack para também encontrar subdependências, além de restringir a resolução de node_modulesprojectA/node_modules
?Minha maior dor de cabeça estava trabalhando sem um caminho com espaço para nome. Algo assim:
Antes de definir meu ambiente para fazer isso:
Achei muito mais conveniente evitar um
src
caminho implícito , que oculta informações importantes do contexto.Meu objetivo é exigir assim:
Como você vê, todo o código do meu aplicativo reside em um espaço de nome de caminho obrigatório. Isso deixa bem claro que chamada requer uma biblioteca, código de aplicativo ou arquivo de teste.
Para isso, certifique-se de que meus caminhos de resolução sejam justos
node_modules
e a pasta atual do aplicativo, a menos que você coloque o nome do aplicativo dentro da pasta de origem, comosrc/my_app
Esse é o meu padrão com o webpack
Seria ainda melhor se você definir o ambiente var
NODE_PATH
para o seu arquivo de projeto atual. Esta é uma solução mais universal e ajudará se você quiser usar outras ferramentas sem o webpack: teste, limpeza ...fonte
Eu resolvi isso com o Webpack 2 assim:
Você pode adicionar mais diretórios à matriz ...
fonte
Resolvi isso usando o Webpack 2:
fonte
Se você estiver usando o create-react-app , poderá simplesmente adicionar um
.env
arquivo contendoFonte: https://medium.com/@ktruong008/absolute-imports-with-create-react-app-4338fbca7e3d
fonte
Este tópico é antigo, mas como ninguém postou sobre require.context, vou mencioná-lo:
Você pode usar o require.context para definir a pasta a ser visualizada da seguinte maneira:
fonte
Não entendi por que alguém sugeriu incluir o diretório pai do myDir nos modulesDirectories no webpack, o que deve facilitar o truque:
fonte
Simplesmente use babel-plugin-module-resolver :
Em seguida, crie um
.babelrc
arquivo na raiz, se você ainda não tiver um:E tudo na raiz será tratado como uma importação absoluta:
Para suporte ao VSCode / Eslint, consulte aqui .
fonte