Nadal nie wiem, jak rozwiązać ścieżki modułów za pomocą pakietu webpack. Teraz piszę:
myfile = require('../../mydir/myfile.js')
ale chciałbym napisać
myfile = require('mydir/myfile.js')
Pomyślałem, że solution.alias może pomóc, ponieważ widzę podobny przykład używający { xyz: "/some/dir" }
aliasu, wtedy mogę require("xyz/file.js")
.
Ale jeśli ustawię alias na { mydir: '/absolute/path/mydir' }
, require('mydir/myfile.js')
nie zadziała.
Czuję się głupio, ponieważ czytałem dokumentację wiele razy i czuję, że czegoś mi brakuje. Jaki jest właściwy sposób uniknięcia zapisywania wszystkich potrzebnych krewnych za pomocą ../../
itp.?
javascript
webpack
gpbl
źródło
źródło
resolve.alias
działa dokładnie tak, jak sugerowałeś. Zastanawiam się, czy to zawodziło z powodu czegoś innego w twojejresolve
konfiguracji. Używamalias{ mydir: path.resolve( __dirname, 'path', 'to', 'mydir' )
irequire( 'mydir/myfile.js' )
działa dobrze.Odpowiedzi:
Pakiet WebPack> 2.0.0
Zobacz odpowiedź wtk .
Webpack 1.0
Prostszym sposobem na zrobienie tego byłoby użycie metody resell.root.
http://webpack.github.io/docs/configuration.html#resolve-root
W Twoim przypadku:
konfiguracja pakietu webpack
zużywający moduł
lub
zobacz także: http://webpack.github.io/docs/configuration.html#resolve-modulesdirectories
źródło
root
,modulesDirectories
i to mieszanka obu, ale to nie działa. Wygląda na to, że podmoduły (np.require("mydir/file")
) Nie są akceptowane.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'.
Na przyszłość, webpack 2 usunął wszystko, ale
modules
jako sposób na rozwiązanie ścieżek. Oznacza to,root
że nie zadziała.https://gist.github.com/sokra/27b24881210b56bbaff7#resolving-options
Przykładowa konfiguracja zaczyna się od:
źródło
modulesDirectories
jest nadal używany przez webpack-dev-server, nawet z pakietem webpack 2, co sprawia, że jest to bardzo zagmatwane.resolve.alias
powinien działać dokładnie tak, jak opisałeś, więc podaję to jako odpowiedź, aby pomóc złagodzić wszelkie nieporozumienia, które mogą wynikać z sugestii w pierwotnym pytaniu, że nie działa.konfiguracja rozwiązywania, taka jak ta poniżej, da pożądane wyniki:
require( 'mydir/myfile.js' )
będzie działać zgodnie z oczekiwaniami. Jeśli tak się nie stanie, musi być inny problem.Jeśli masz wiele modułów, które chcesz dodać do ścieżki wyszukiwania,
resolve.root
ma to sens, ale jeśli chcesz mieć możliwość odwoływania się do komponentów w kodzie aplikacji bez ścieżek względnych,alias
wydaje się , że jest to najbardziej proste i wyraźne.Ważną zaletą programu
alias
jest to, że daje on możliwość tworzenia przestrzeni nazw,require
co może zwiększyć przejrzystość kodu; tak jak z innych stron łatwo jest zobaczyć, dorequire
jakiego modułu się odwołujemy,alias
pozwala na pisanie opisowych,require
które jasno wskazują, że potrzebujesz modułów wewnętrznych, nprequire( 'my-project/component' )
.resolve.root
po prostu umieszcza cię w wybranym katalogu bez możliwości dalszego umieszczania go w przestrzeni nazw.źródło
alias: {'~': path.resolve(__dirname)},
require('mydir/myfile')
)? To powinno faktycznie zadziałać. Możesz mieć wiele wpisów walias
; Używam tego do importu z mojegosrc
katalogu dla modułów JavaScript i innego do importu z mojegostyles
katalogu dla css. Daj mi znać, jeśli całkowicie źle zrozumiałem Twoje pytanie.import './path/to/Component1';
- po prostu bez wewnętrznej nazwy pliku i rozszerzenia w ścieżce. webpack w jakiś sposób zdołał wykryć, że plik wewnętrzny ma nazwę katalogu i właśnie go zaimportował. teraz chcę to zaimportować w ten sposób:import 'shared\Component1';
kiedy „shared” jest aliasem. ale nie działa bez określenia wewnętrznej nazwy pliku. Dzięki!Na wypadek, gdyby ktoś inny napotkał ten problem, udało mi się to uruchomić w następujący sposób:
gdzie moja struktura katalogów to:
Następnie z dowolnego miejsca w
src
katalogu mogę zadzwonić:źródło
'node_modules'
Zamiast tego użyj ciągu .[ path.resolve(__dirname, 'src'), 'node_modules' ],
lodash
, chcęlodash
rozwiązać TYLKO zprojectA/node_modules
. Do tegoresolve.modules: [path.resolve(__dirname, 'node_modules')]
się przydaje. Jednak mam problemy z pod-zależnościami, jak powiedziałeś. Czy istnieje sposób, aby nakazać pakietowi Webpack, aby znalazł również zależności podrzędne, oprócz ograniczenia rozdzielczości node_modules doprojectA/node_modules
?Moim największym bólem głowy była praca bez ścieżki z przestrzenią nazw. Coś takiego:
Zanim ustawiłem moje środowisko, aby to zrobić:
O wiele wygodniej jest unikać ukrytej
src
ścieżki, która ukrywa ważne informacje kontekstowe.Moim celem jest takie wymaganie:
Jak widać, cały mój kod aplikacji znajduje się w obowiązkowej przestrzeni nazw ścieżki. To wyjaśnia, które wywołanie wymaga biblioteki, kodu aplikacji lub pliku testowego.
W tym celu upewniam się, że moje ścieżki rozpoznawania są tylko
node_modules
i bieżącym folderem aplikacji, chyba że przestrzeń nazw aplikacji zostanie umieszczona w folderze źródłowym, na przykładsrc/my_app
To jest moje domyślne ustawienie w pakiecie webpack
Byłoby jeszcze lepiej, gdybyś ustawił zmienną środowiska
NODE_PATH
na bieżący plik projektu. Jest to rozwiązanie bardziej uniwersalne i pomoże, jeśli będziesz chciał korzystać z innych narzędzi bez webpacka: testowanie, lintowanie ...źródło
Rozwiązałem to za pomocą Webpack 2 w następujący sposób:
Możesz dodać więcej katalogów do tablicy ...
źródło
Rozwiązałem to za pomocą Webpack 2:
źródło
Jeśli używasz aplikacji create-react-app , możesz po prostu dodać
.env
plik zawierającyŹródło: https://medium.com/@ktruong008/absolute-imports-with-create-react-app-4338fbca7e3d
źródło
Ten wątek jest stary, ale ponieważ nikt nie pisał o require.context wspomnę o tym:
Możesz użyć require.context, aby ustawić wygląd folderu w następujący sposób:
źródło
Nie rozumiem, dlaczego ktokolwiek zasugerował włączenie katalogu nadrzędnego myDir do modulesDirectories w pakiecie internetowym, co powinno łatwo załatwić sprawę:
źródło
Po prostu użyj babel-plugin-module-resolver :
Następnie utwórz
.babelrc
plik w katalogu głównym, jeśli jeszcze go nie masz:I wszystko w katalogu głównym będzie traktowane jako import absolutny:
Informacje na temat obsługi VSCode / Eslint można znaleźć tutaj .
źródło