Zaczęto używać funkcji sprawdzania poprawności właściwości ReactJS , która, jak mówią dokumenty, działa tylko w „trybie programistycznym” ze względu na wydajność.
Wydaje się, że React sprawdza właściwości konkretnego komponentu, o którym pisałem, ale nie pamiętam, żebym jawnie włączał „tryb programowania”.
Próbowałem znaleźć sposób wyzwalania / przełączania trybu programowania, ale nie miałem szczęścia.
process.env
dla użytkownikówOdpowiedzi:
Druga odpowiedź zakłada, że używasz zewnętrznych, gotowych plików z firmy React i chociaż jest to poprawne, większość ludzi nie zamierza lub powinna korzystać z Reacta jako pakietu. Co więcej, w tym momencie większość bibliotek i pakietów React również korzysta z tej samej konwencji wyłączania pomocników dev time podczas produkcji. Samo użycie zminimalizowanej reakcji pozostawi wszystkie te potencjalne optymalizacje również na stole.
Ostatecznie magia sprowadza się do osadzania odniesień do
process.env.NODE_ENV
Reacta w całej bazie kodu; te działają jak przełącznik funkcji.Powyższy wzorzec jest najbardziej rozpowszechniony, podobnie jak inne biblioteki. Więc do „Wyłącz” tych kontroli musimy przełączać
NODE_ENV
się"production"
Właściwym sposobem wyłączenia „trybu deweloperskiego” jest skorzystanie z wybranego pakietu.
webpack
Użyj
DefinePlugin
w konfiguracji swojego webpacka w następujący sposób:Browserify
Użyj transformacji Envify i uruchom krok kompilacji browserify z
NODE_ENV=production
("set NODE_ENV=production"
w systemie Windows)Wynik
Spowoduje to utworzenie pakunków wyjściowych, w których wszystkie wystąpienia
process.env.NODE_ENV
zastąpiono literałem ciągu:"production"
Premia
Podczas minimalizacji przekształconego kodu można skorzystać z „Eliminacji martwego kodu”. DCE występuje wtedy, gdy minifier jest wystarczająco inteligentny, aby zdać sobie sprawę, że:
"production" !== "production"
jest zawsze fałszywy, a więc po prostu usunie dowolny kod w bloku if, oszczędzając bajty.źródło
'"production"'
np. w podwójnym cudzysłowie, stringify robi to za CiebieJSON.stringify(process.env.NODE_ENV)
aby można było przełączać zaNODE_ENV=production webpack ...
pomocą wiersza poleceń. Dodano bonus w postaci jawnego kodu =)DefinePlugin
użycie można zastąpićnew webpack.EnvironmentPlugin(['NODE_ENV'])
Tak, nie jest to dobrze udokumentowane, ale na stronie pobierania ReactJS mówi o trybach rozwoju i produkcji:
Zasadniczo niezminifikowana wersja Reacta jest w trybie „programistycznym”, a zminimalizowana wersja Reacta w trybie „produkcyjnym”.
Aby być w trybie „produkcyjnym”, wystarczy dołączyć wersję zminimalizowaną
react-0.9.0.min.js
źródło
npm
budujesz bezpośrednio z pakietu reagowania, użyj czegoś takiego jak envify, aby ustawićNODE_ENV = 'production'
wykonywanie tych samych testów. @EdwardMSmith Daj mi znać, gdzie chciałbyś zobaczyć te informacje, a mogę je dodać (lub możesz po prostu przesłać PR)!NODE_ENV
powinna znajdować się na górze.Opublikowałem to gdzie indziej, ale szczerze mówiąc, tutaj byłoby lepsze miejsce.
Zakładając, że zainstalujesz React 15.0.1 z npm,
import react from 'react'
lubreact = require('react')
uruchomisz,./mode_modules/react/lib/React.js
który jest surowym źródłem Reacta .Dokumentacja React sugeruje użycie
./mode_modules/react/dist/react.js
do rozwoju ireact.min.js
produkcji.Powinieneś zminimalizować
/lib/React.js
lub/dist/react.js
uruchomisz produkcyjną, React wyświetli ostrzeżenie, że zminimalizowałeś kod nieprodukcyjny:Warning: It looks like you're using a minified copy of the development build of React. When deploying React apps to production, make sure to use the production build which skips development warnings and is faster. See fb.me/react-minification for more details.
React-dom, redux, reag-redux zachowują się podobnie. Redux wyświetla komunikat ostrzegawczy. Uważam, że reakcja też.
Dlatego wyraźnie zachęcamy do korzystania z wersji produkcyjnej z
/dist
.Jeśli jednak zminimalizujesz plik
/dist
zminimalizujesz wersje, UglifyJsPlugin z webpacka będzie narzekać.WARNING in ../~/react/dist/react.js Critical dependencies: 4:478-485 This seems to be a pre-built javascript file. Though this is possible, it's not recommended. Try to require the original source to get better results. @ ../~/react/dist/react.js 4:478-4851
Nie możesz uniknąć tego komunikatu, ponieważ UglifyJsPlugin może wykluczać tylko fragmenty pakietu webpack, a nie pojedyncze pliki.
Sam korzystam z wersji rozwojowej i produkcyjnej
/dist
./dist/react.min.js
jest zoptymalizowana pod kątem produkcji. Nie przeczytałem żadnego dowodu na to'process.env': { NODE_ENV: JSON.stringify(IS_PRODUCTION ? 'production' : 'development') }
plus uglify działa tak dobrze jak "/ dist / reaguj.min.js". Nie przeczytałem żadnego dowodu, że otrzymujesz ten sam wynikowy kod.Możesz użyć webpacka do korzystania z
/dist
wersji z:źródło
W przypadku kompilacji opartej na pakiecie webpack skonfigurowałem osobny plik webpack.config.js dla DEV i PROD. W przypadku Prod rozwiąż alias jak poniżej
Możesz znaleźć działający tutaj
źródło
Jeśli pracujesz z czegoś takiego, jak ten samouczek dotyczący ReactJS.NET / Webpack , nie możesz używać process.env do włączania / wyłączania trybu programowania React, o ile wiem. Ten przykład łączy bezpośrednio zreak.js (patrz Index.cshtml ), więc wystarczy wybrać plik .min.js lub niezminifikowany wariant, zmieniając adres URL.
Nie jestem pewien, dlaczego tak jest, ponieważ plik webpack.config.js próbki zawiera komentarz, który wydaje się sugerować,
externals: { react: 'React' }
że wykona zadanie, ale następnie włącza reakcję bezpośrednio na stronę.źródło
Dla wyłącznie WebPACK użytkowników v4:
Określenie
mode: production
imode: development
w konfiguracji WebPacka zdefiniujeprocess.env.NODE_ENV
domyślnie użycie DefinePlugin. Nie potrzeba dodatkowego kodu!webpack.prod.js (pobrane z dokumentów)
A w naszym JS:
Dokumenty Webpack: https://webpack.js.org/guides/production/#specify-the-mode
źródło
Używam ręcznego procesu kompilacji, który działa przez Webpack, więc był to dla mnie proces dwuetapowy:
Ustaw zmienną środowiskową z package.json za pomocą pakietu cross-env:
"scripts": { "build-dev": "cross-env NODE_ENV=development webpack --config webpack.config.js", "build-prod": "cross-env NODE_ENV=production webpack --config webpack.config.js" }
Zmień plik webpack.config.js, aby używał zmiennej środowiskowej (która jest przekazywana do Reacta w celu określenia, czy jesteśmy w trybie programistycznym, czy produkcyjnym) i wyłącz minimalizowanie utworzonego pakietu, jeśli jesteśmy w trybie programistycznym, abyśmy mogli zobaczyć aktualne nazwy naszych komponentów. W tym celu musimy użyć właściwości optymalizacji pakietu webpack w naszym pliku webpack.config.js :
optimization: { nodeEnv: process.env.NODE_ENV, minimize: process.env.NODE_ENV === 'production' }
webpack v4.41.5, React v16.9.19, cross-env v7.0.0, node v10.16.14
źródło