2017-01-31 44 views
9

W projekcie mam łączącej jest to architektura dla node_packages:Django npm i pakiety węzłów architektura

|- Django project 
|-- app1 
|-- app2 
|-- node_modules 
|--- foundation-sites 
|--- grunt 
|-- static 
|--- css 
|--- images 
|--- js 
|--urls.py 
|--settings.py 
|--package.json 

Osobiście uważam node_packages powinien być statyczny w folderze js jak również package.json jak tak :

|- Django project 
|-- app1 
|-- app2 
|-- static 
|--- css 
|--- images 
|--- js 
|---- node_modules 
|----- foundation-sites 
|----- grunt 
|---- packages.json 
|--urls.py 
|--settings.py 

czy jest różnica? która jest najlepsza praktyka? czemu?

Odpowiedz

15

Rozumiem twoje myślenie chcąc zachować wszystkie pliki związane javascript w jednym miejscu, ale oto kilka powodów, może chcesz zachować folder node_modules i plik z static katalogu Django aplikacji package.json.

  1. Najprawdopodobniej skończy się statycznie wyświetlanie plików, które nie są przeznaczone. Jeśli folder node_modules istnieje w środowisku produkcyjnym, uruchomienie collectstatic będzie musiało sprawdzić, czy jest ono zsynchronizowane za każdym razem, co może być wolne ze względu na strukturę zależności zagnieżdżonych węzłów. I zakładając, że masz krok kompilacji do pakowania i transpozycji JS, jeśli te pliki źródłowe są w zakresie static, one również będą wyświetlane jako pliki statyczne, bez powodu.
  2. Możesz chcieć użyć węzła do czegoś więcej niż tylko procesu budowania JavaScript. Widzę, że korzystasz z Grunta i możesz chcieć go użyć do spełnienia więcej niż Twoje potrzeby JavaScript, np. Minimalizując swój css lub uruchamiając serwer proxy wokół serwera Django, który automatycznie przeładowuje przeglądarkę po zmianie plików lub Serwer Django zostanie zrestartowany. Mając to na uwadze, bardziej sensowne wydaje się myślenie o Node.js jako narzędziu w procesie kompilacji, które może dotknąć jakiejkolwiek części twojego projektu, a łączenie/transpozycja JavaScript jest tylko jedną częścią tego.
+0

myślę, że to jest najlepszy swer, ale zaczynam się zastanawiać, dlaczego w ogóle nie wyjść poza projekt? –

+1

Dzięki. Tak, próbowałem odpowiedzieć na pytanie z punktu widzenia braku strukturyzacji, ponieważ jeśli chodzi o strukturę projektu, to naprawdę zależy to od twojego projektu. Na przykład mam kilka projektów Django, które są całkowicie oparte na API, oparte na React/Redux. Przy takich projektach staram się całkowicie wysuwać pliki front-end do własnego repo i hostować osobno. W projektach wykorzystujących system szablonów Django zwykle bardziej sensowne jest dla mnie, aby był on sam w projekcie Django. – joslarson

+0

Dlaczego to nie ma sensu? Szablony Django można owijać w projekty React, aw niektórych przypadkach (np. Strony administracyjne), chcesz mieć dostęp do pakietów npm. – AlxVallejo

1

Ogólnie rzecz biorąc, node_modules powinien znajdować się poza aplikacją Django. Typowa Format używam dla aplikacji Django jest następujący:

- AppName 
---- appname (This is the Django Project) 
---- appname-env (Python virtualenv) 
---- bower_components 
---- bower.json 
---- gulpfile.js 
---- node_modules 
---- package.json 
---- requirements.txt 

Następnie używam łyk skopiować elementy z obu modułów węzłów lub elementów Bower do mojego katalogu app static/lib.

+0

Dlaczego uważasz, że powinno to być poza aplikacją? Nie sądzę, że to ogólna rzecz. Poza tym jest to dobry i nowy pomysł na podejście do node.js z django –

+1

Myślę, że głównym powodem jest to, że tylko pliki, które mają być dostarczane klientowi, powinny znajdować się w folderze statycznym twojego projektu. Nie ma powodu, aby nadmiar i niepotrzebne pliki były dostępne dla klienta. – turbotux

6
  • Put npm_modules i package.json na najwyższym poziomie projektu:

    • łatwo dostępne, należy zainstalować moduły i wykonywania poleceń na najwyższym poziomie projektu
    • dependecies narażone na najwyższym poziomie, zwykle obok wymagań pip
    • biblioteki zewnętrzne/moduły oddzielone od kodu
  • Dodaj npm_modules do .gitignore
  • Obsługuj tylko wygenerowane pliki.Zachować kod źródłowy poza STATICFILES_DIRS

  • (Opcjonalnie) Jeśli chcesz, aby służyć niektóre moduły NPM bez vendoring (zamiast altany) użyć narzędzia takie jak django-npm aby określić, jakie będą narażone

Przykładowe projekty:

https://github.com/mbrochh/django-reactjs-boilerplate

https://github.com/Seedstars/django-react-redux-base

+0

Chociaż głosowałem za twoją odpowiedzią, ponieważ pomoże to ludziom, którzy są nowi w ustawieniach, nie odpowiedziałeś na moje pytanie, które brzmi "dlaczego", a nie "jak" –