Je ne sais toujours pas comment résoudre les chemins de module avec webpack. Maintenant j'écris:
myfile = require('../../mydir/myfile.js')
mais j'aimerais écrire
myfile = require('mydir/myfile.js')
Je pensais que résoudre.alias peut aider puisque je vois un exemple similaire utilisant { xyz: "/some/dir" }
comme alias alors que je peux require("xyz/file.js")
.
Mais si je règle mon alias sur { mydir: '/absolute/path/mydir' }
, require('mydir/myfile.js')
cela ne fonctionnera pas.
Je me sens stupide parce que j'ai lu la doc plusieurs fois et j'ai l'impression de manquer quelque chose. Quelle est la bonne façon d'éviter d'écrire tout ce que le parent requiert avec ../../
etc?
javascript
webpack
gpbl
la source
la source
resolve.alias
fonctionne exactement comme vous l'avez suggéré. Je me demande s'il échouait à cause de quelque chose d'autre dans votreresolve
configuration. J'utilisealias{ mydir: path.resolve( __dirname, 'path', 'to', 'mydir' )
etrequire( 'mydir/myfile.js' )
fonctionne très bien.Réponses:
Webpack> 2.0
Voir la réponse de wtk .
Webpack 1.0
Une manière plus simple de le faire serait d'utiliser resolver.root.
http://webpack.github.io/docs/configuration.html#resolve-root
Dans ton cas:
configuration webpack
module consommateur
ou
voir aussi: http://webpack.github.io/docs/configuration.html#resolve-modulesdirectories
la source
root
,modulesDirectories
et un mélange des deux, mais cela n'a pas fonctionné. Il semble que les sous-modules (par exemplerequire("mydir/file")
) ne soient pas acceptés.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'.
Pour référence future, webpack 2 a tout supprimé mais
modules
comme un moyen de résoudre les chemins. Ce moyenroot
ne pas fonctionner.https://gist.github.com/sokra/27b24881210b56bbaff7#resolving-options
L'exemple de configuration commence par:
la source
modulesDirectories
est toujours utilisé par webpack-dev-server, même avec webpack 2, ce qui rend cela très déroutant.resolve.alias
devrait fonctionner exactement comme vous l'avez décrit, donc je fournis ceci comme une réponse pour aider à atténuer toute confusion qui pourrait résulter de la suggestion dans la question originale que cela ne fonctionne pas.une configuration de résolution comme celle ci-dessous vous donnera les résultats souhaités:
require( 'mydir/myfile.js' )
fonctionnera comme prévu. Si ce n'est pas le cas, il doit y avoir un autre problème.Si vous avez plusieurs modules que vous souhaitez ajouter au chemin de recherche,
resolve.root
cela a du sens, mais si vous souhaitez simplement pouvoir référencer des composants dans le code de votre application sans chemins relatifs, celaalias
semble être le plus simple et le plus explicite.Un avantage important de
alias
est qu'il vous donne la possibilité d'espacer vos noms,require
ce qui peut ajouter de la clarté à votre code; tout comme il est facile de voir à partir d'autresrequire
s quel module est référencé,alias
vous permet d'écrire des descriptifsrequire
qui montrent clairement que vous avez besoin de modules internes, par exemplerequire( 'my-project/component' )
.resolve.root
vous place simplement dans le répertoire souhaité sans vous donner la possibilité de l'espace de noms plus loin.la source
alias: {'~': path.resolve(__dirname)},
require('mydir/myfile')
)? Cela devrait fonctionner. Vous pouvez avoir plusieurs entrées dansalias
; J'utilise cela pour importer de monsrc
répertoire pour les modules JavaScript et un autre pour importer de monstyles
répertoire pour css. Faites-moi savoir si j'ai complètement mal compris votre question.import './path/to/Component1';
- simplement sans le nom de fichier interne et l'extension dans le chemin. webpack a réussi à détecter que le fichier Inner porte le nom du répertoire et l'a simplement importé. maintenant ce que je veux faire, c'est l'importer comme ça:import 'shared\Component1';
quand 'shared' est l'alias. mais cela ne fonctionne pas sans spécifier le nom du fichier interne. Merci!Au cas où quelqu'un d'autre rencontrerait ce problème, j'ai pu le faire fonctionner comme ceci:
où ma structure de répertoires est:
Puis de n'importe où dans l'
src
annuaire, je peux appeler:la source
'node_modules'
plutôt la chaîne .[ path.resolve(__dirname, 'src'), 'node_modules' ],
lodash
, je veuxlodash
être résolu UNIQUEMENT à partir deprojectA/node_modules
. C'est ce quiresolve.modules: [path.resolve(__dirname, 'node_modules')]
est utile. Cependant, je rencontre des problèmes avec les sous-dépendances comme vous l'avez dit. Existe-t-il un moyen de dire à Webpack de rechercher également des sous-dépendances en plus de restreindre la résolution node_modules àprojectA/node_modules
?Mon plus gros mal de tête fonctionnait sans un chemin d'espacement de noms. Quelque chose comme ça:
Avant, j'avais l'habitude de configurer mon environnement pour faire cela:
J'ai trouvé beaucoup plus pratique d'éviter un
src
chemin implicite , qui cache des informations contextuelles importantes.Mon objectif est d'exiger comme ceci:
Comme vous le voyez, tout le code de mon application vit dans un espace de noms de chemin obligatoire. Cela montre clairement quel appel nécessite une bibliothèque, un code d'application ou un fichier de test.
Pour cela, je m'assure que mes chemins de résolution sont justes
node_modules
et le dossier d'application actuel, à moins que vous n'espacez votre application dans votre dossier source commesrc/my_app
C'est ma valeur par défaut avec webpack
Ce serait encore mieux si vous définissez la variable d'environnement
NODE_PATH
sur votre fichier de projet actuel. C'est une solution plus universelle et cela vous aidera si vous souhaitez utiliser d'autres outils sans webpack: test, peluchage ...la source
Je l'ai résolu avec Webpack 2 comme ceci:
Vous pouvez ajouter plus de répertoires au tableau ...
la source
J'ai résolu ce problème en utilisant Webpack 2:
la source
Si vous utilisez create-react-app , vous pouvez simplement ajouter un
.env
fichier contenantSource: https://medium.com/@ktruong008/absolute-imports-with-create-react-app-4338fbca7e3d
la source
Ce fil de discussion est ancien mais comme personne n'a posté sur require.context, je vais le mentionner:
Vous pouvez utiliser require.context pour définir le dossier à parcourir comme ceci:
la source
Je n'ai pas compris pourquoi quelqu'un a suggéré d'inclure le répertoire parent de myDir dans les modulesDirectories du webpack, cela devrait faciliter le truc:
la source
Utilisez simplement babel-plugin-module-resolver :
Créez ensuite un
.babelrc
fichier sous root si vous n'en avez pas déjà:Et tout ce qui se trouve sous root sera traité comme une importation absolue:
Pour la prise en charge de VSCode / Eslint, cliquez ici .
la source