Ich bin immer noch verwirrt, wie man Modulpfade mit Webpack auflöst. Jetzt schreibe ich:
myfile = require('../../mydir/myfile.js')
aber ich würde gerne schreiben
myfile = require('mydir/myfile.js')
Ich dachte, dass resolve.alias helfen könnte, da ich ein ähnliches Beispiel sehe, das { xyz: "/some/dir" }
als Alias verwendet wird, als ich kann require("xyz/file.js")
.
Aber wenn ich meinen Alias auf setze { mydir: '/absolute/path/mydir' }
, require('mydir/myfile.js')
funktioniert das nicht.
Ich fühle mich dumm, weil ich das Dokument oft gelesen habe und das Gefühl habe, etwas zu vermissen. Was ist der richtige Weg, um zu vermeiden, dass alle relativen Anforderungen mit ../../
etc geschrieben werden?
javascript
webpack
gpbl
quelle
quelle
resolve.alias
funktioniert genau so, wie Sie es vorgeschlagen haben. Ich frage mich, ob es an etwas anderem in Ihrerresolve
Konfiguration fehlgeschlagen ist . Ich benutzealias{ mydir: path.resolve( __dirname, 'path', 'to', 'mydir' )
undrequire( 'mydir/myfile.js' )
funktioniert gut.Antworten:
Webpack> 2.0
Siehe die Antwort von wtk .
Webpack 1.0
Ein einfacherer Weg, dies zu tun, wäre die Verwendung von resolve.root.
http://webpack.github.io/docs/configuration.html#resolve-root
In deinem Fall:
Webpack-Konfiguration
Verbrauchsmodul
oder
Siehe auch: http://webpack.github.io/docs/configuration.html#resolve-modulesdirectories
quelle
root
,modulesDirectories
und eine Mischung aus beiden, aber es hat nicht funktioniert. Es scheint, dass Submodule (z. B.require("mydir/file")
) nicht akzeptiert werden.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'.
Zum späteren Nachschlagen hat Webpack 2 alles entfernt
modules
, außer um Pfade aufzulösen. Dies bedeutet, dassroot
es nicht funktioniert.https://gist.github.com/sokra/27b24881210b56bbaff7#resolving-options
Die Beispielkonfiguration beginnt mit:
quelle
modulesDirectories
wird immer noch von webpack-dev-server verwendet, auch mit webpack 2, was dies sehr verwirrend macht.resolve.alias
sollte genau so funktionieren, wie Sie es beschrieben haben, daher gebe ich dies als Antwort, um Verwirrung zu vermeiden, die sich aus dem Vorschlag in der ursprünglichen Frage ergeben könnte, dass es nicht funktioniert.Eine Auflösungskonfiguration wie die folgende führt zu den gewünschten Ergebnissen:
require( 'mydir/myfile.js' )
wird wie erwartet funktionieren. Wenn dies nicht der Fall ist, muss ein anderes Problem vorliegen.Wenn Sie mehrere Module haben, die Sie dem Suchpfad hinzufügen möchten,
resolve.root
ist dies sinnvoll. Wenn Sie jedoch nur Komponenten in Ihrem Anwendungscode ohne relative Pfade referenzieren möchten,alias
scheint dies am einfachsten und explizitesten zu sein.Ein wichtiger Vorteil von
alias
ist, dass Sie die Möglichkeit haben, Ihrerequire
s zu benennen, wodurch Ihr Code klarer wird. Genauso wie es aus anderen leicht zu erkennenrequire
ist, auf welches Modul verwiesen wird,alias
können Sie beschreibenderequire
s schreiben , die deutlich machen, dass Sie interne Module benötigen, zrequire( 'my-project/component' )
.resolve.root
Sie werden einfach in das gewünschte Verzeichnis verschoben, ohne dass Sie die Möglichkeit haben, es weiter zu benennen.quelle
alias: {'~': path.resolve(__dirname)},
require('mydir/myfile')
)? Das sollte eigentlich funktionieren. Sie können mehrere Einträge in habenalias
; Ich verwende das zum Importieren aus meinemsrc
Verzeichnis für JavaScript-Module und ein anderes zum Importieren aus meinemstyles
Verzeichnis für CSS. Lassen Sie mich wissen, wenn ich Ihre Frage völlig falsch verstanden habe.import './path/to/Component1';
- einfach ohne den inneren Dateinamen und die Erweiterung im Pfad. Webpack hat es irgendwie geschafft zu erkennen, dass die innere Datei den Namen des Verzeichnisses hat, und es einfach importiert. Jetzt möchte ich es so importieren:import 'shared\Component1';
Wenn 'shared' der Alias ist. Es funktioniert jedoch nicht ohne Angabe des inneren Dateinamens. Vielen Dank!Falls jemand anderes auf dieses Problem stößt, konnte ich es so zum Laufen bringen:
wo meine Verzeichnisstruktur ist:
Dann kann
src
ich von überall im Verzeichnis anrufen:quelle
'node_modules'
stattdessen die Zeichenfolge .[ path.resolve(__dirname, 'src'), 'node_modules' ],
lodash
, möchte ichlodash
NUR von aufgelöst werdenprojectA/node_modules
. Dafür istresolve.modules: [path.resolve(__dirname, 'node_modules')]
es nützlich. Ich habe jedoch Probleme mit Unterabhängigkeiten, wie Sie sagten. Gibt es eine Möglichkeit, Webpack anzuweisen, neben der Einschränkung der Auflösung von node_modules auch Unterabhängigkeiten zu findenprojectA/node_modules
?Meine größten Kopfschmerzen waren das Arbeiten ohne einen Pfad mit Namensraum. Etwas wie das:
Bevor ich meine Umgebung so eingestellt habe:
Ich fand es weitaus bequemer, einen impliziten
src
Pfad zu vermeiden , der wichtige Kontextinformationen verbirgt.Mein Ziel ist es, Folgendes zu fordern:
Wie Sie sehen, befindet sich mein gesamter App-Code in einem obligatorischen Pfad-Namespace. Dies macht deutlich, für welche Aufrufe eine Bibliothek, ein App-Code oder eine Testdatei erforderlich ist.
Dafür stelle ich sicher, dass meine Auflösungspfade nur
node_modules
und der aktuelle App-Ordner sind, es sei denn, Sie benennen Ihre App in Ihrem Quellordner wiesrc/my_app
Dies ist meine Standardeinstellung bei Webpack
Es wäre sogar noch besser, wenn Sie die Umgebungsvariable
NODE_PATH
auf Ihre aktuelle Projektdatei einstellen . Dies ist eine universellere Lösung und hilft, wenn Sie andere Tools ohne Webpack verwenden möchten: Testen, Flusen ...quelle
Ich habe es mit Webpack 2 wie folgt gelöst:
Sie können dem Array weitere Verzeichnisse hinzufügen ...
quelle
Habe dies mit Webpack 2 gelöst:
quelle
Wenn Sie die Create-React-App verwenden , können Sie einfach eine
.env
Datei hinzufügen, die Folgendes enthältQuelle: https://medium.com/@ktruong008/absolute-imports-with-create-react-app-4338fbca7e3d
quelle
Dieser Thread ist alt, aber da niemand über require.context gepostet hat, werde ich ihn erwähnen:
Mit require.context können Sie festlegen, dass der Ordner folgendermaßen durchsucht wird:
quelle
Ich habe nicht verstanden, warum jemand vorgeschlagen hat, das übergeordnete Verzeichnis von myDir in modulesDirectories im Webpack aufzunehmen, was den Trick leicht machen sollte:
quelle
Verwenden Sie einfach den Babel-Plugin-Modul-Resolver :
Erstellen Sie dann eine
.babelrc
Datei unter root, falls Sie noch keine haben:Und alles unter root wird als absoluter Import behandelt:
Informationen zur VSCode / Eslint-Unterstützung finden Sie hier .
quelle