Próbuję przekonwertować aplikację kątową z gulp na webpack. w gulp używam gulp-preprocess do zamiany niektórych zmiennych na stronie HTML (np. nazwa bazy danych) w zależności od NODE_ENV. Jaki jest najlepszy sposób na osiągnięcie podobnego rezultatu z webpackiem?
javascript
webpack
kpg
źródło
źródło
Odpowiedzi:
Istnieją dwa podstawowe sposoby osiągnięcia tego celu.
DefinePlugin
Pamiętaj, że spowoduje to zastąpienie dopasowań „jak jest”. Dlatego łańcuch ma format, w którym jest. Możesz mieć bardziej złożoną strukturę, na przykład obiekt, ale masz pomysł.
EnvironmentPlugin
EnvironmentPlugin
używaDefinePlugin
wewnętrznie i mapuje wartości środowiska, aby je zakodować. Składnia Terser.Alias
Alternatywnie możesz zużyć konfigurację za pośrednictwem modułu aliasowego . Od strony konsumenta wyglądałoby to tak:
Sama konfiguracja może wyglądać następująco:
Powiedzmy, że
process.env.NODE_ENV
jestdevelopment
. To by się./config/development.js
wtedy odwzorowało . Moduł, na który mapuje, może eksportować konfigurację w następujący sposób:źródło
JSON.stringify()
'process.env.NODE_ENV': `"${process.env.NODE_ENV || 'development'}"`
JSON.stringify('development')
as może nie być naprawdę przydatny. Zamiast tegoJSON.stringify(someVariable)
może być całkiem!NODE_ENV
to zrobić. Jak to ustawić, zależy od twojej platformy.process.env.NODE_ENV
wzoru i działa.Kolejna opcja, jeśli chcesz korzystać tylko z interfejsu cli, po prostu skorzystaj z
define
opcji webpack. Dodaję następujący skrypt w moimpackage.json
:Więc po prostu muszę biec
npm run build-production
.źródło
Zbadałem kilka opcji ustawiania zmiennych specyficznych dla środowiska i skończyłem z tym:
Obecnie mam 2 konfiguracje pakietu webpack:
webpack.production.config.js
webpack.config.js
W moim kodzie otrzymuję wartość API_URL w ten (krótki) sposób:
const apiUrl = process.env.API_URL;
EDYCJA 3 listopada 2016 r
Dokumenty pakietu Webpack zawierają przykład: https://webpack.js.org/plugins/define-plugin/#usage
W ESLint musisz w szczególności zezwalać na niezdefiniowane zmienne w kodzie, jeśli masz
no-undef
włączone reguły. http://eslint.org/docs/rules/no-undef jak to:EDYCJA 7 września 2017 r. (Specyficzne dla aplikacji Create-React-App)
Jeśli nie chcesz zbyt wiele konfigurować, sprawdź Create-React-App: Create-React-App - Dodawanie niestandardowych zmiennych środowiskowych . Pod maską CRA i tak korzysta z Webpacka.
źródło
process.env
toprocess.env.PORT
na przykład nie zostanie rozwiązaneundefined
podczas kompilacji pakietu internetowego, co oznacza, że nie możesz już zastąpić portu ze środowiska?Możesz przekazać dowolny argument wiersza poleceń bez dodatkowych wtyczek przy użyciu
--env
od webpacka 2:Za pomocą zmiennej w pliku webpack.config.js:
Źródło
źródło
Możesz użyć bezpośrednio z
EnvironmentPlugin
dostępnych w,webpack
aby mieć dostęp do dowolnej zmiennej środowiskowej podczas transpilacji.Musisz tylko zadeklarować wtyczkę w swoim
webpack.config.js
pliku:Pamiętaj, że musisz jawnie zadeklarować nazwę zmiennych środowiskowych, których chcesz użyć.
źródło
Aby osobiście dodać do szeregu odpowiedzi, wolę:
Używając tego, nie ma żadnych funky zmiennych env ani problemów międzyplatformowych (w przypadku zmiennych env). Wszystko, co robisz, to uruchamianie normalnie
webpack
lub odpowiedniowebpack -p
dla deweloperów lub produkcji.Odniesienie: Problem Github
źródło
'process.env.NODE_ENV': JSON.stringify('production')
ponadprocess: { env: { NODE_ENV: JSON.stringify('production') } }
. Użycie tego drugiego spowoduje zastąpienie obiektu procesu, co może zepsuć zgodność z niektórymi modułami, które oczekują, że zostaną zdefiniowane inne wartości w obiekcie procesu.Ponieważ moja edycja powyższego postu przez ewangelistę nie została zatwierdzona , zamieszczam dodatkowe informacje.
Jeśli chcesz wybrać wartość z pliku package.json jak zdefiniowany numer wersji i uzyskać do niej dostęp za pośrednictwem DefinePlugin w JavaScript.
Następnie importu package.json wewnątrz odpowiedniego webpack.config , dostęp atrybut użyciu zmiennej importu, a następnie za pomocą atrybutu w DefinePlugin .
Na przykład niektóre konfiguracje w pliku webpack.config używają METADANE dla DefinePlugin:
Dostęp do tego w dowolnym pliku maszynopisu:
Najmądrzejszy sposób wyglądałby następująco:
Dzięki Ross Allen
źródło
Kolejna odpowiedź podobna do odpowiedzi @ zer0chain. Jednak z jednym wyróżnieniem.
Ustawienie
webpack -p
jest wystarczające.Jest taki sam jak:
I to jest to samo co
Dlatego może być potrzebne tylko coś takiego w
package.json
pliku węzła:Kilka wskazówek z DefinePlugin :
To dlatego możesz sprawdzić, czy piszesz
webpack --help
źródło
Aby dodać do zestawu odpowiedzi:
Użyj ExtendedDefinePlugin zamiast DefinePlugin
ExtendedDefinePlugin jest znacznie prostszy w użyciu i jest udokumentowany :-) link
Ponieważ DefinePlugin nie ma dobrej dokumentacji, chcę pomóc, mówiąc, że faktycznie działa jak #DEFINE in c # .
Dlatego jeśli chcesz zrozumieć, jak działa DefinePlugin, przeczytaj c #define Doucmentation. połączyć
źródło
Wolę używać pliku .env dla innego środowiska.
env.dev
do .env do folderu głównegoenv.prod
na .envi w kodzie
posługiwać się
require('dotenv').config(); const API = process.env.API ## which will store the value from .env file
źródło
Znalazłem następujące rozwiązanie, które jest najłatwiejsze do ustawienia zmiennej środowiskowej dla Webpack 2:
Na przykład mamy ustawienia pakietu internetowego:
Dodaj zmienną środowiskową w pakiecie internetowym:
Zdefiniuj zmienną wtyczki i dodaj ją do
plugins
:Teraz po uruchomieniu polecenia webpack podaj
env.NODE_ENV
jako argument:Teraz możesz uzyskać dostęp do
NODE_ENV
zmiennej w dowolnym miejscu w kodzie.źródło
Od wersji Webpack v4, po prostu ustawienie
mode
w konfiguracji pakietu Webpack ustawiNODE_ENV
dla ciebie (przezDefinePlugin
). Dokumenty tutaj.źródło
Oto sposób, który zadziałał dla mnie i pozwolił mi zachować zmienne środowiskowe w stanie DRY poprzez ponowne użycie pliku json.
źródło
Nie jestem wielkim fanem ...
... ponieważ nie zapewnia żadnego rodzaju bezpieczeństwa. zamiast tego poprawiasz swoje tajne rzeczy, chyba że dodasz webpack do gitignore 🤷♀️ istnieje lepsze rozwiązanie.
Zasadniczo w tej konfiguracji po skompilowaniu kodu wszystkie zmienne env procesu zostaną usunięte z całego kodu, nie będzie jednego procesu. Na szczęście VAR w górę dzięki wtyczce babel
transform-inline-environment-variables
PS, jeśli nie chcesz skończyć z całą masą niezdefiniowanych, upewnij się, że wywołujesz env.js, zanim webpack wywoła babel-loader, dlatego jest to pierwsza rzecz, którą wywołuje webpack. tablica vars w pliku babel.config.js musi pasować do obiektu w env.js. teraz jest tylko jedna rzecz do koszenia. dodaj.env
plik umieść tam wszystkie zmienne env, plik musi znajdować się w katalogu głównym projektu lub możesz go dodać gdziekolwiek chcesz, po prostu upewnij się, że ustawiłeś tę samą lokalizację w pliku env.js, a także dodaj go do gitignoreJeśli chcesz zobaczyć cały babel + webpack + ts, zdobądź go z heaw
https://github.com/EnetoJara/Node-typescript-babel-webpack.git
i ta sama logika dotyczy reakcji i wszystkich innych 💩
env.js
plik webpack bez wtyczek troll
babel.config.js
źródło
Nie wiem dlaczego, ale tak naprawdę nikt nie wspomina o najprostszym rozwiązaniu. To działa dla mnie na nodejs i chrząknięcie. Ponieważ dla wielu osób webpack może być mylący, możesz po prostu użyć poniższej linii:
process.env.NODE_ENV = 'production';
Dzięki powyższemu rozwiązaniu tak naprawdę nie musisz używać envify ani webpacka. Czasami proste zakodowane rozwiązanie może działać dla niektórych osób.
źródło