Mam pytanie dotyczące najlepszych praktyk w zakresie włączenia node_modules
do witryny HTML.
Wyobraź sobie, że mam Bootstrap w moim node_modules
folderze. W przypadku wersji produkcyjnej witryny, jak dołączyć skrypt Bootstrap i pliki CSS znajdujące się w node_modules
folderze? Czy sensowne jest pozostawienie Bootstrap w tym folderze i zrobienie czegoś takiego?
<script src="./node_modules/bootstrap/dist/bootstrap.min.js"></script>
Czy też muszę dodać reguły do mojego pliku gulp, który następnie skopiuje te pliki do mojego folderu dist? A może lepiej byłoby pozwolić, by łyk całkowicie usunął lokalny bootstrap z mojego pliku HTML i zastąpił go wersją CDN?
Odpowiedzi:
Zwykle nie chcesz ujawniać żadnej z wewnętrznych ścieżek dotyczących struktury serwera na zewnątrz. Możesz zrobić
/scripts
statyczną trasę na serwerze, która pobiera pliki z dowolnego katalogu, w którym się znajdują. Więc jeśli twoje pliki się znajdują"./node_modules/bootstrap/dist/"
. Następnie tag skryptu na twoich stronach wygląda następująco:Jeśli korzystasz z express z nodejs, statyczna trasa jest tak prosta:
Następnie wszelkie żądania przeglądarki
/scripts/xxx.js
będą automatycznie pobierane zdist
katalogu na stronie__dirname + /node_modules/bootstrap/dist/xxx.js
.Uwaga: Nowsze wersje NPM umieszczają więcej rzeczy na najwyższym poziomie, nie zagnieżdżone tak głęboko, więc jeśli używasz nowszej wersji NPM, nazwy ścieżek będą inne niż wskazane w pytaniu PO i aktualnej odpowiedzi. Ale koncepcja jest nadal taka sama. Aby dowiedzieć się, gdzie pliki są fizycznie znajduje się na dysku serwera, a ty zrób
app.use()
zexpress.static()
zrobić pseudo-ścieżkę do tych plików, dzięki czemu nie naraża faktyczną organizację systemu plików serwera do klienta.Jeśli nie chcesz tworzyć statycznej trasy w ten sposób, prawdopodobnie lepiej jest po prostu skopiować publiczne skrypty na ścieżkę, którą twój serwer internetowy traktuje jako
/scripts
dowolne oznaczenie najwyższego poziomu, którego chcesz użyć. Zwykle kopiowanie może stać się częścią procesu kompilacji / wdrażania.Jeśli chcesz ustawić tylko jeden konkretny plik w katalogu, a nie wszystkie znalezione w nim katalogi, możesz ręcznie utworzyć indywidualne trasy dla każdego pliku, zamiast używać
express.static()
takich jak:I kod do utworzenia trasy do tego
Lub, jeśli nadal chcesz wyznaczyć trasy dla skryptów
/scripts
, możesz to zrobić:I kod do utworzenia trasy do tego
źródło
/scripts
ponieważ w ten sposób utrzymane byłyby wszelkie zależności w module.express.static()
wysyła pierwsze znalezione dopasowanie. Ponieważ każdaexpress.static()
instrukcja tworzy tylko jedną możliwą ścieżkę dopasowania, nie powinno być duplikatów z jednejexpress.static()
instrukcji. Jeśli masz wieleexpress.static()
instrukcji, z których każda może pasować, to pierwsza w twoim kodzie to ta, która zostanie użyta. Ponadto naprawdę nie powinieneś mieć wielu plików o tej samej nazwie i ścieżce względnej osiągalnej przezexpress.static()
instrukcje. Najlepszą praktyką jest nie robienie tego.express.static()
katalog, który zawiera TYLKO pliki publiczne (zawierają podkatalogi). Tak więc nie mogę sobie wyobrazić projektu, w którymdist
opublikowano wiele katalogów. To wydaje mi się bardzo niezwykłe. Być może chcesz wyznaczyć określoną trasę do określonego pliku lub 2-3 plików. W takim przypadku jesteś odpowiedzialny za ujednoznacznienie tych plików. I tak nie przyda ci się mieć czteryscript.js
pliki./script.js
zażąda tego przeglądarka. Tak więc abstrakcyjna odpowiedź jest taka, że nie powinieneś dopuszczać do istnienia sytuacji zduplikowanych nazw plików, ponieważ nie jest to problem do rozwiązania, chyba że potrzebujesz unikalnego prefiksu dla każdego katalogu plików. Zatem zduplikowane nazwy katalogu głównego i tak nie stanowią problemu. Aby uzyskać bardziej szczegółową odpowiedź ze szczegółową rekomendacją, musisz opublikować własne pytanie z dokładnymi szczegółami.Użyłbym modułu ścieżki npm, a następnie zrobiłbym coś takiego:
WAŻNE: używamy path.join, aby ścieżki łączyły się w sposób agnostyczny systemowy, tj. W Windowsie i Uniksie mamy różne separatory ścieżek (/ i)
źródło
Jak wspomniano przez jfriend00, nie powinieneś ujawniać swojej struktury serwera. Możesz skopiować pliki zależności projektu do czegoś takiego
public/scripts
. Możesz to zrobić bardzo łatwo za pomocą dep-linkera :źródło
src
s będą wtedy podobne/scripts/[package-name]/dist/file.min.js
.Jeśli chcesz szybkiego i łatwego rozwiązania (i masz zainstalowany łyk).
W moim
gulpfile.js
uruchamiam proste zadanie kopiowania, które umieszcza wszystkie potrzebne pliki w./public/modules/
katalogu.Wadą tego jest to, że nie jest zautomatyzowane. Jeśli jednak wystarczy kilka skryptów i stylów skopiowanych (i przechowywanych na liście), to powinno wystarczyć.
źródło
'scripts': {'install':'yarn gulp copy-modules'}
pakiecie.json w skryptach , zakładając, że przędza jest menedżerem pakietów, a gulp jest zainstalowany w pakiecie.Katalog „node_modules” może nie znajdować się w bieżącym katalogu, dlatego ścieżkę należy rozwiązać dynamicznie.
źródło
Chcę zaktualizować to pytanie za pomocą prostszego rozwiązania. Utwórz dowiązanie symboliczne do node_modules.
Najłatwiejszym sposobem na przyznanie publicznego dostępu do modułów_węzła jest utworzenie dowiązania symbolicznego do modułów_węzła z katalogu publicznego. Dowiązanie symboliczne sprawi, że pliki będą istnieć wszędzie tam, gdzie zostanie utworzone łącze.
Na przykład, jeśli serwer węzłów ma kod do obsługi plików statycznych
a __dirname odnosi się do / path / to / app, więc twoje pliki statyczne są obsługiwane z / path / to / app / dist
a node_modules znajduje się w / path / to / app / node_modules, a następnie utwórz takie dowiązanie symboliczne na mac / linux:
lub tak w systemie Windows:
Teraz otrzymaj prośbę o:
otrzyma odpowiedź z plikiem na
który tak naprawdę jest plikiem
Jeśli twój katalog w / path / to / app / dist nie jest bezpieczną lokalizacją, być może z powodu ingerencji w proces kompilacji z gulpem lub chrząknięciem, możesz dodać osobny katalog dla linku i dodać nowe wywołanie servStatic, takie jak:
i w węźle dodaj:
źródło
Nie znalazłem żadnych czystych rozwiązań (nie chcę ujawniać źródła wszystkich moich modułów_węzła), więc po prostu napisałem skrypt Powershell, aby je skopiować:
źródło
Zrobiłem poniższe zmiany, aby AUTO-ZAWIERA pliki w indeksie HTML. Aby dodać plik do folderu, zostanie on automatycznie pobrany z folderu, bez konieczności dołączania pliku do pliku index.html
źródło
Oto co skonfigurowałem na moim
express
serwerze:Powodzenia...
źródło