ΠΡ Ρ ΠΎΡΠΈΡΠ΅ Π·Π°ΠΏΡΠΎΡΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ»ΠΈ ΡΠΎΠΎΠ±ΡΠΈΡΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ ?
Π£Π»ΡΡΡΠ΅Π½ΠΈΠ΅
ΠΠ°ΠΊΠΎΠ²ΠΎ ΡΠ΅ΠΊΡΡΠ΅Π΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅?
Π£ ΠΌΠ΅Π½Ρ Π±ΡΠ»ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² React ΠΏΠΎ ΠΎΡΠΈΠ±ΠΊΠ΅.
ΠΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Ρ
ΡΠΊΠΈ ΠΏΠΎΠ»ΡΡΠΈΠ» ΡΡΡ ΠΎΡΠΈΠ±ΠΊΡ:
hooks can only be called inside the body of a function component
Π§ΡΠΎ Π½Π΅Π²Π΅ΡΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ. ΠΠ½Π΅ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°Π»ΠΎΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠ΅ΠΌΡ, ΡΡΠΎΠ±Ρ Π½Π°ΠΉΡΠΈ Π½Π°ΡΡΠΎΡΡΡΡ ΠΏΡΠΈΡΠΈΠ½Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.
ΠΠ°ΠΊΠΎΠ²ΠΎ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅?
ΠΠΎΠΊΠ°ΠΆΠΈΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡΠ΅, ΡΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² React, ΠΈ ΡΠΊΠ°ΠΆΠ΅ΡΠ΅, ΡΡΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠΈΡΠΈΠ½ΠΎΠΉ ΠΎΡΠΈΠ±ΠΎΠΊ.
ΠΡΠ°ΠΊ, ΠΏΡΠΎΡΡΠΎ Π΄Π»Ρ ΡΡΠΎΡΠ½Π΅Π½ΠΈΡ: Π²Ρ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π»ΠΈ Ρ
ΡΠΊ (ΡΠΊΠ°ΠΆΠ΅ΠΌ, useState
) ΠΈΠ· Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ react
, ΠΎΡΠ»ΠΈΡΠ½ΠΎΠ³ΠΎ ΠΎΡ ΡΠΎΠ³ΠΎ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΡΡ Π΄Π»Ρ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°?
Π― ΡΠΎΠ³Π»Π°ΡΠ΅Π½, ΡΡΠΎ ΡΡΠΎ ΡΠ±ΠΈΠ²Π°Π΅Ρ Ρ ΡΠΎΠ»ΠΊΡ. ΠΠ΄Π½Π°ΠΊΠΎ Ρ Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½, Π΅ΡΡΡ Π»ΠΈ Ρ Π½Π°Ρ ΡΠΏΠΎΡΠΎΠ± ΡΠ·Π½Π°ΡΡ, ΡΠ΅Π½Π΄Π΅ΡΠΈΡΡΡ Π»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π΄ΡΡΠ³ΠΎΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ React. ΠΠ°ΡΠΊΠΎΠ»ΡΠΊΠΎ Ρ Π·Π½Π°Ρ, ΠΌΡ ΡΡΠ°ΡΠ°Π΅ΠΌΡΡ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ React ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΠΎ, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΡΠΎΠ±Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² React ΠΌΠΎΠ³Π»ΠΈ Π±Π΅Π· ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅.
Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ ΠΈ ΡΠΏΠΎΠΌΡΠ½ΡΡΡ ΡΡΠΎΡ ΡΠ»ΡΡΠ°ΠΉ, Π΅ΡΠ»ΠΈ ΡΡΠΎ Π½Π΅ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π·Π°ΠΏΡΡΡΠ²Π°Π΅Ρ.
ΠΠ°, Ρ ΡΡΠ°Π²Π½ΠΈΠ» React1 === React2
, ΠΈ ΡΡΠΎ Π±ΡΠ»ΠΎ false
(React1 ΠΈΠ· index.js, Π° React2 ΠΈΠ· ΡΠ°ΠΉΠ»Π° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Ρ
ΡΠΊΠ°). ΠΠΎΠ³Π΄Π° ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ, Ρ
ΡΠΊΠΈ ΡΠ΅ΡΠΏΡΡ Π½Π΅ΡΠ΄Π°ΡΡ Ρ ΠΎΠ±ΡΠΈΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ Π²ΡΡΠ΅.
ΠΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π° Π΄Π»Ρ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΠΎΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½Π½ΠΎΡΡΠΈ ΠΎΠ± ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄Π»Ρ ΡΠ»ΡΡΡΠ΅Π½ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅, ΡΡΠΎΠ±Ρ ΠΏΠΎΠΌΠΎΡΡ Π»ΡΠ΄ΡΠΌ, ΡΡΠΎΠ»ΠΊΠ½ΡΠ²ΡΠΈΠΌΡΡ Ρ ΡΡΠΈΠΌ. Π₯ΠΎΡΡ, Π½Π°Π²Π΅ΡΠ½ΠΎΠ΅, ΡΡΠΎ ΠΎΡΠ΅Π½Ρ ΠΊΡΠ°ΠΉ.
ΠΠ°, Ρ ΠΏΡΡΠ°Π»ΡΡ npm ΡΠ²ΡΠ·Π°ΡΡ ΠΏΠ°ΠΊΠ΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΡΠΎΠ·Π΄Π°Ρ. ΠΠ½ Π²ΡΠ΄Π°Π΅Ρ ΡΡ ΠΆΠ΅ ΠΎΡΠΈΠ±ΠΊΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠ°ΠΊΠ΅Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Ρ ΡΠΊΠΈ, Π½ΠΎ ΡΠΎ ΡΠ²ΠΎΠΈΠΌ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΌ React. ΠΠ½Π΅ ΠΏΡΠΈΡΠ»ΠΎΡΡ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΠΉ ΠΏΠ°ΠΊΠ΅Ρ Π² NPM, Π° Π·Π°ΡΠ΅ΠΌ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π½Π°ΠΏΡΡΠΌΡΡ ΠΈΠ· NPM. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΎΡΠΈΠ±ΠΊΠ° ΠΈΡΡΠ΅Π·Π»Π°, Π½ΠΎ Ρ Π½Π°Π΄Π΅ΡΡΡ, ΡΡΠΎ ΡΡΠΎ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ ΠΏΠ°ΠΊΠ΅ΡΠ° Π±Π΅Π· Π΅Π³ΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ β ΡΡΠΎ ΠΏΠ»ΠΎΡ ΠΎ, ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ.
ΠΠΎΠ½ΠΎΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ Lerna ΡΠ°ΠΊΠΆΠ΅ ΡΡΡΠ°Π΄Π°ΡΡ ΠΎΡ ΡΡΠΎΠ³ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ Ρ ΡΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠ°ΠΊΠ΅ΡΠ΅ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄ΡΡΠ³ΠΈΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΠ²ΠΎΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΠΊΠΎΠΏΠΈΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ.
ΠΠ° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ (Ρ
Π°ΠΊΠ΅ΡΡΠΊΠΈΠΉ) ΠΎΠ±Ρ
ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠΉ npm-link-shared
ΠΈ ΡΠΊΡΠΈΠΏΡ prestart
npm, ΡΡΠΎΠ±Ρ ΠΏΠΎ ΡΡΡΠ΅ΡΡΠ²Ρ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ react
ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ° ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΡΡΠ»ΠΊΠΎΠΉ Π½Π° Π΄ΡΡΠ³ΠΎΠΉ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΠΎΡ ΡΠ°ΠΌΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ.
"prestart": "npm-link-shared ./node_modules/<other package>/node_modules . react"
Π£ ΠΌΠ΅Π½Ρ Π±ΡΠ»Π° ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΈ Ρ ΡΠ΅ΡΠΈΠ» Π΅Π΅, Π΄ΠΎΠ±Π°Π²ΠΈΠ²:
alias: {
react: path.resolve('./node_modules/react')
}
to ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ resolve
Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΌΠΎΠ΅Π³ΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ Π±ΡΠ»Π° ΠΌΠΎΡ ΠΎΡΠΈΠ±ΠΊΠ°, ΠΊΠΎΠ³Π΄Π° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» Π΄Π²Π΅ ΠΊΠΎΠΏΠΈΠΈ React, Π½ΠΎ Ρ ΡΠΎΠ³Π»Π°ΡΠ΅Π½, ΡΡΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π·Π΄ΠΎΡΠΎΠ²ΠΎ, Π΅ΡΠ»ΠΈ Π±Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ Π±ΡΠ»ΠΎ Π»ΡΡΡΠ΅. Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΡ ΠΎΠΆΠ΅ Π½Π°: https://github.com/facebook/react/issues/2402
@mpeyper ΠΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ. Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ
@apieceofbart ΠΡΠΎ ΡΡΠ°Π±ΠΎΡΠ°Π»ΠΎ Π΄Π»Ρ ΠΌΠ΅Π½Ρ. Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅. π
ΠΠ°ΡΠΊΠΎΠ»ΡΠΊΠΎ Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ, ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ, ΠΊΠΎΠ³Π΄Π° Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡΠ΅ Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠΏΠΈΠΉ React.
Π―Π²Π»ΡΠ΅ΡΡΡ Π»ΠΈ ΡΡΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, Π΅ΡΠ»ΠΈ Π΄Π²Π° ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΠΏΠ°ΠΊΠ΅ΡΠ° ΡΠΎ ΡΠ²ΠΎΠΈΠΌΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΌΠΈ ΠΊΠΎΠΏΠΈΡΠΌΠΈ React Π·Π°Π³ΡΡΠΆΠ°ΡΡ ΡΠ²ΠΎΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ React Π½Π° ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ dom, ΠΊΠ°ΠΊ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π·Π΄Π΅ΡΡ: https://medium.jonasbandi.net/hosting-multiple-react-applications-on- ΡΠΎΡ ΠΆΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ-c887df1a1fcd
Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΡΠΌ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠΌ Β«ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈΒ», ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΌ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΠΌΠ΅ΡΠ°-ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ΅ single-spa (https://github.com/CanopyTax/single-spa).
Π£ ΠΌΠ΅Π½Ρ ΡΠ°ΠΊΠΆΠ΅ Π΅ΡΡΡ ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π΄Π°ΠΆΠ΅ Ρ ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊΠΈΠΌΠΈ ΠΆΠ΅ Π²Π΅ΡΡΠΈΡΠΌΠΈ ΡΠ΅Π°ΠΊΡΠΈΠΈ, ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Ρ
ΡΠΊΠΎΠ² Π΄Π»Ρ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ npm-link
. ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΆΠ΅ Π±Π΅ΡΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ hooks can only be called inside the body of a function component
. Π Π΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΠ° @apieceofbart ΡΠ΅ΡΠΈΠ»ΠΎ ΡΡΠΎ Π΄Π»Ρ ΠΌΠ΅Π½Ρ. ΠΠΎΠ»ΡΡΠΎΠ΅ ΡΠΏΠ°ΡΠΈΠ±ΠΎ!
Π’Π° ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π·Π΄Π΅ΡΡ, ΠΊΠΎΠ³Π΄Π° Ρ npm link
ΠΏΠ°ΠΊΠ΅Ρ Π΄Π»Ρ ΠΌΠΎΠ΅Π³ΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π― Π½Π΅ ΠΌΠΎΠ³ Π·Π°ΡΡΠ°Π²ΠΈΡΡ babel-plugin-module-resolver
ΡΠ°Π±ΠΎΡΠ°ΡΡ.
Π Π½Π΅ΠΌ Π³ΠΎΠ²ΠΎΡΠΈΡΡΡ:
Could not find module './node_module/react'
ΠΡΠΎ ΡΠ°Π·Π΄ΡΠ°ΠΆΠ°Π΅Ρ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΌΠ½Π΅ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄ Π΅Π³ΠΎ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠ΅ΠΉ.
Π― ΠΈΡΠΏΡΠ°Π²ΠΈΠ» ΡΠ²ΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΡΠ΄Π°Π»ΠΈΠ² ΠΊΡΡΡΠΎΡ Π² "react": "^16.7.0-alpha.2"
ΠΠΎΡ ΠΏΠΎΠ»Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ: https://github.com/facebook/react/issues/14454#issuecomment -449585005
Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Yarn ΠΈ ΠΈΡΠΏΡΠ°Π²ΠΈΠ» ΡΡΠΎ, Π·Π°Π΄Π°Π² ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π² ΠΌΠΎΠ΅ΠΌ package.json
:
"resolutions": {
"**/react": "16.7.0-alpha.2",
"**/react-dom": "16.7.0-alpha.2"
},
Π’ΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅!!
ΠΡΠΎΡΡΠΎ Ρ ΠΎΡΠ΅Π» ΠΎΡΡΠ°Π²ΠΈΡΡ Π·Π΄Π΅ΡΡ Π·Π°ΠΌΠ΅ΡΠΊΡ Π΄Π»Ρ ΡΠ΅Ρ , Ρ ΠΊΠΎΠ³ΠΎ ΠΌΠΎΠ³Π»Π° Π±ΡΡΡ ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Ρ ΠΌΠ΅Π½Ρ.
ΠΡ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ React ΠΈ Rails Ρ Π³Π΅ΠΌΠΎΠΌ react-rails
ΠΈ ΠΎΡΡΠΈΡΠΎΠ²ΡΠ²Π°Π΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π² ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡΡ
Rails. Π― ΠΏΠΎΠ»ΡΡΠ°Π» ΡΡΡ ΠΎΡΠΈΠ±ΠΊΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° Π·Π°Π³ΡΡΠΆΠ°Π»Π°ΡΡ Π½ΠΎΠ²Π°Ρ Π²Π΅ΡΡΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Turbolinks Π±ΡΠ°Π» Π½ΠΎΠ²ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ JS ΠΈΠ· <head>
, ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°Π³ΡΡΠΆΠ°Π» Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ React. Π Π΅ΡΠ΅Π½ΠΈΠ΅ Π·Π°ΠΊΠ»ΡΡΠ°Π»ΠΎΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ Turbolinks Π²ΡΠΏΠΎΠ»Π½ΡΠ» ΠΏΠΎΠ»Π½ΡΡ ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΊΡ ΡΡΡΠ°Π½ΠΈΡΡ ΠΏΡΠΈ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΠ°ΠΊΠ΅ΡΠ°: https://github.com/turbolinks/turbolinks#reloading -when-assets-change
ΠΡΠΎ, ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΡΠ΅ΡΠΈΠ»ΠΎ ΡΡΠΎ Π΄Π»Ρ Π½Π°Ρ.
Π― ΠΎΡΠ΅Π½Ρ ΡΠ°Π΄ Π½Π°ΠΊΠΎΠ½Π΅Ρ Π·Π°ΠΏΡΡΡΠΈΡΡ Hooks Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ, ΠΈ ΠΌΡ Π²ΡΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠΎΠ±Π»Π°Π³ΠΎΠ΄Π°ΡΠΈΡΡ Π²ΡΠ΅Ρ , ΠΊΡΠΎ ΡΠ΄Π΅Π»Π°Π» ΡΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΌ. Π‘ Π½ΠΈΠΌΠΈ ΠΎΡΠ΅Π½Ρ Π²Π΅ΡΠ΅Π»ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ, ΠΈ ΠΎΠ½ΠΈ ΡΠ΄Π΅Π»Π°Π»ΠΈ ΠΌΠΎΠΉ ΠΊΠΎΠ΄ ΠΊΠΎΡΠΎΡΠ΅ ΠΈ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΡΠΌ.
ΠΠ°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ, ΡΡΠΎ ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ Π°ΠΊΡΡΠ°Π»ΡΠ½Π° Π² Π²ΡΠΏΡΡΠ΅Π½Π½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ Ρ ΡΠ΅ΠΌ ΠΆΠ΅ Π±Π΅ΡΠΏΠΎΠ»Π΅Π·Π½ΡΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ Β«Π₯ΡΠΊΠΈ ΠΌΠΎΠ³ΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π²Π½ΡΡΡΠΈ ΡΠ΅Π»Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°Β».
ΠΡΠΎ ΡΠΎ, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ? Π― ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ, ΡΡΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠ°ΡΡ Π²ΡΠ΅ Π±ΠΎΠ»Π΅Π΅ ΠΈ Π±ΠΎΠ»Π΅Π΅ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΡΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΡΠ΅ Π±ΠΎΠ»ΡΡΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² Π½Π°ΡΠΈΠ½Π°ΡΡ Π²Π½Π΅Π΄ΡΡΡΡ Π½ΠΎΠ²ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΈ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΡΠΊΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ Π±ΠΎΠ»ΡΡΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π²ΠΌΠ΅ΡΡΠΎ ΠΏΡΡΠΌΠΎΠ³ΠΎ Β«ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡΒ».
ΠΡΠ΅ ΡΠ°Π· ΡΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° Π²ΡΡ ΡΡΠΆΠ΅Π»ΡΡ ΡΠ°Π±ΠΎΡΡ ΠΈ ΠΏΠΎΠ·Π΄ΡΠ°Π²Π»ΡΡ Ρ ΡΠ΅Π»ΠΈΠ·ΠΎΠΌ! ΠΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΡΡΡΡΠ°ΡΡΠΈΠΉ Π½Π°Π±ΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΉ.
Π Π΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ : Π½ΡΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΏΡΠΈΡΠΌΠΎΡΡΠ΅ΡΡΡΡ ΠΊ ΠΎΡΠΊΡΡΡΡΠΌ PR, ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ Π½Π°ΡΠ΅Π» # 14690, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΅ΡΠ°Π΅Ρ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ @threepointone!
@taylorham Π‘ΡΡΠ»ΠΊΠ° Π² ΠΊΠΎΠΌΠΌΠΈΡΠ΅ Π΅ΡΠ΅ Π½ΠΈ Π½Π° ΡΡΠΎ Π½Π΅ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ. Π― ΠΏΠΎΠ΄ΠΎΠΆΠ΄Ρ, Π½ΠΎ ΡΡΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ Ρ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ Ρ ΡΠ΅Ρ
ΠΏΠΎΡ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» Ρ
ΡΠΊΠΈ Π² ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠΌ ΠΏΠ°ΠΊΠ΅ΡΠ΅ _(Π½Π°ΡΠΈΠ½Π°Ρ Ρ npm link
)_, ΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π½ΠΈΠΌ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ Π±Π΅Π· ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ.
ΠΠ·ΡΡΠΈΠ² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, Ρ ΡΠ΅ΡΠΈΠ», ΡΡΠΎ ΡΡΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ react-hot-loader , ΠΊΠΎΡΠΎΡΡΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π» ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π² ΠΊΠ»Π°ΡΡΡ, Π½ΠΎ Π΄Π°ΠΆΠ΅ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π²ΡΠΏΡΡΡΠΈΠ»ΠΈ Π²Π΅ΡΡΠΈΡ Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ Hook , ΠΎΠ½Π° ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ ΡΠ΅ΡΠΏΠΈΡ Π½Π΅ΡΠ΄Π°ΡΡ.
Π― ΠΏΡΠΎΠ±ΠΎΠ²Π°Π» ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π·Π½ΡΡ
Ρ
Π°ΠΊΠΎΠ², Π½ΠΎ Π½Π΅ ΠΏΠΎΠ²Π΅Π·Π»ΠΎ. ΠΠ΅ Π·Π½Π°Ρ, ΠΏΠΎΡΠ΅ΠΌΡ Π΄ΠΎ ΡΠΈΡ
ΠΏΠΎΡ Π²ΡΠ΅Ρ
Π½Π΅ ΠΏΠΎΡΠ°Π·ΠΈΠ»Π° ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° π§
@dotlouis ΠΠ°, ΠΏΠΎΠΊΠ° ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅, ΠΈ ΡΠ°ΠΌΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π½Π΅ΡΠ΄ΠΎΠ±ΡΡΠ²Π°.
ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅, ΡΡΠΎ ΡΡΠ°Π±ΠΎΡΠ°Π»ΠΎ Π΄Π»Ρ ΠΌΠ΅Π½Ρ, β ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ Π»ΡΠ±ΠΎΠ΅ ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌΠΎΠ΅ ΠΌΠ½ΠΎΠΉ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Π²ΠΈΡΠ΅Π»ΠΎ ΠΎΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ React Ρ ΠΏΠΎΠΌΠΎΡΡΡ "react": "link:../my-library/node_modules/react"
.
[Ρ
ΠΎΡΠΎΡΠΎ] Π΄Π»Ρ ΠΌΠ΅Π½Ρ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΊΠ°ΡΠ°Π»ΠΎΡΡ package.json ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΈΡ
ΠΏΡΠΈΡΠΈΠ½ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ ΡΠ΅Π°ΠΊΡΠΈΠΈ: Ρ ΠΌΠ΅Π½Ρ Π±ΡΠ» Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠΉ themeProvider ΠΏΠΎΠ²Π΅ΡΡ
ΠΌΠΎΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΈΡΡ
ΠΎΠ΄Ρ ΠΈΠ· ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°. ΠΠ°ΠΌΠ΅Π½Π° Π΅Π³ΠΎ Π½Π° Β«useContext HookΒ» (ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΡΠ²Π°Π½ΠΈΠΈ Π΅Π³ΠΎ ΠΊΠ°ΠΊ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠ°) ΠΊΠ°Π·Π°Π»Π°ΡΡ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ.
ΠΠΎΠΆΠ΅Ρ Π±ΡΡΡ, Π΅ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΊΠΎΠ³Π΄Π°
<GoodOldContext iam={a class component}>
<BrandNewHook>
errors : Hooks can only be called inside the body of a function component #35
</BrandnewHook>
</GooOldContext>
export withGoodOldContext.consumer(here component)
Π― ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π΅ΡΡΡ ΠΏΠ°ΠΏΠΊΠ° example
, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ create-react-app
.
ΠΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ Π² package.json
ΡΠ΅ΡΠΈΠ»ΠΎ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π΄Π»Ρ ΠΌΠ΅Π½Ρ:
{
...
"dependencies": {
"my-component": "link:..",
"react": "link:../node_modules/react",
"react-dom": "link:../node_modules/react-dom",
"react-scripts": "2.1.3"
},
...
}
@taylorham @DylanVann Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° Π²Π°Ρ Π²ΠΊΠ»Π°Π΄, ΡΠ΅Π±ΡΡΠ°. Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΡΡΠΎ Π²ΡΠ΅ Π΅ΡΠ΅ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π΄Π»Ρ ΠΌΠ΅Π½Ρ.
Π Ρ Π½Π΅ ΡΠΌΠΎΠ³ Π½Π°ΠΉΡΠΈ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΎΠ± ΡΡΠΎΠΌ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π΅ link:
, ΠΊΠΎΡΠΎΡΡΠΉ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ.
ΠΠΎ ΡΡΡΠΈ, Π² Π½Π΅ΠΌ Π³ΠΎΠ²ΠΎΡΠΈΡΡΡ, ΡΡΠΎ Β«ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅-ΡΠΏΡΠΈΠ½Π³Β» (Π΅ΡΠ΅ ΠΎΠ΄Π½ΠΎ ΠΎΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ΅Π°ΠΊΡΠΈΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ) Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π½Π°ΠΉΡΠΈ react-dom
. ΠΠ΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ Π²Ρ ΡΠΊΠ°Π·Π°ΡΡ ΠΌΠ½Π΅ ΠΊΠ°ΠΊΡΡ-Π½ΠΈΠ±ΡΠ΄Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΎ "react": "link:../some/path"
, ΠΏΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°?
Π― ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ²ΡΠ·Π°Π½Π½ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°, ΠΈ ΠΌΠ½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ ΡΠ΅ΡΠΈΡΡ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.
ΠΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅Π°ΠΊΡΠΈΡ renderToString ΠΈΠ· ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° (ΡΠ²ΡΠ·Π°Π½Π½ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ).
Π― ΡΠΎΠ·Π΄Π°Π» ΡΡΠ½ΠΊΡΠΈΡ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π° Π² ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠΌ ΠΏΠ°ΠΊΠ΅ΡΠ΅.
ΠΡΠΎΡΡΠΎ Π΄Π»Ρ Π»ΡΡΡΠ΅Π³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° - https://github.com/facebook/react/issues/14257
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ @theKashey. @gaearon , ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΈΡΠ°Π΅Ρ, ΡΡΠΎ ΡΡΠΎ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. Π― ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ, ΡΡΠΎ React Π½Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π·Π°Π³ΡΡΠΆΠ°ΡΡ Π΄Π²Π°ΠΆΠ΄Ρ, Π½ΠΎ ΠΊΠ°ΠΊ ΡΠΎΠ³Π΄Π° ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎ ΡΠ²ΡΠ·Π°Π½Π½ΡΠΌ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΌ ΠΏΠ°ΠΊΠ΅ΡΠΎΠΌ?
Π£ ΠΌΠ΅Π½Ρ ΡΠ°ΠΊΠΆΠ΅ Π±ΡΠ»ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΌΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ ΡΡΡΠ»ΠΊΠ°ΠΌΠΈ Π½Π° ΡΠ°Π±ΠΎΡΠΈΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° Lerna. ΠΡΠΎ Π±ΡΠ» ΡΡΡΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π», ΡΡΠΎΠ±Ρ Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ. ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΠ΅ npm install
ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ.
"dependencies": {
"react-dom": "file:../common/node_modules/react-dom",
"react": "file:../common/node_modules/react"
}
ΠΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΡΠ΅ΡΠΈΡΡ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΈ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΡΡΠΆΠΈ ΠΎΠ±ΡΡΠ½ΠΎ Π½Π΅ ΠΏΠΎΠΌΠΎΠ³Π°ΡΡ - ΡΡΠΎ Π±ΠΎΠ»ΡΡΠ΅ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ Β«ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠΌ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡΒ».
aliases
- ΠΏΡΠΎΡΡΠΎ "ΠΆΠ΅ΡΡΠΊΠΈΠΉ" ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌ, Π²ΡΠ΅ ΡΡΠΊΠΈ, ΠΊΠ°ΠΊ react
, Π² ΠΎΠ΄ΠΈΠ½ ΡΠ°ΠΉΠ» resolve: {
extensions: ['.ts', '.tsx', '.js', '.jsx'],
alias: {
react: path.resolve(path.join(__dirname, './node_modules/react')),
}
import {setAliases} from 'require-control';
setAliases({
'react': path.resolve(path.join(__dirname, './node_modules/react'))
});
moduleNameMapper
"jest": {
"moduleNameMapper": {
"^react$": "<rootDir>/node_modules/$1",
},
@theKashey ΡΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° Π²Π°ΡΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ», Π΅ΡΠ»ΠΈ ΡΡΠ΅ΡΡΡ, ΠΊΠ°ΠΊ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΡΠ»Ρ (Π²Π½ΠΈΠ·Ρ, Π·Π°ΡΠ΅ΠΌ Π²Π²Π΅ΡΡ
ΠΏΠΎ Π΄Π΅ΡΠ΅Π²Ρ), Π½ΠΎ Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Ρ Π½Π΅ Π½Π°Ρ
ΠΎΠΆΡ ΡΡΠΎ ΠΎΡΠ΅Π½Ρ ΠΏΡΠ°ΠΊΡΠΈΡΠ½ΡΠΌ. ΠΠΎΠ³Π΄Π° Ρ npm link
ΠΏΠ°ΠΊΠ΅Ρ, Ρ ΠΎΠΆΠΈΠ΄Π°Ρ, ΡΡΠΎ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π±Π΅Π· ΡΠ²Π½ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ. ΠΡΠΎ Π΄Π΅Π»Π°Π΅Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ ΠΏΠ°ΠΊΠ΅ΡΠ° Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Π±ΠΎΠ»Π΅Π·Π½Π΅Π½Π½ΠΎΠΉ.
ΠΡΠΎ ΠΊΡΠ°Π΅ΡΠ³ΠΎΠ»ΡΠ½ΡΠΉ ΠΊΠ°ΠΌΠ΅Π½Ρ, ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ node_modules
, Π²ΠΎΡ ΠΏΠΎΡΠ΅ΠΌΡ Ρ Π²Π°Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π΄Π²Π΅ Π²Π΅ΡΡΠΈΠΈ Button
Π² Π΄Π²ΡΡ
ΡΠ°Π·Π½ΡΡ
ΠΎΡΠ½ΠΎΠ²Π½ΡΡ
Π²Π΅ΡΡΠΈΡΡ
, ΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ Π»Π΅Π³ΠΊΠΎ Π½Π°ΠΉΠ΄ΡΡ Β«ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉΒ» Π²Π΅ΡΡΠΈΡ ΠΏΠ°ΠΊΠ΅ΡΠ°.
ΠΠΎΡ ΡΠ°ΠΊ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ.
ΠΠ½ΡΡΡΠ΅Π½Π½ΠΎΡΡΠΈ Node.js
Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΡ β ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΠΎΡΠΊΡΡΡΡ ΡΠ°ΠΉΠ», Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π²ΡΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠ΅ ΠΏΡΠ΅ΡΠΈΠΊΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, node_modules
) ΠΈΠ»ΠΈ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, js
, ts
, json
).
yarn pnp
ΡΠ΄Π΅Π»Π°Π΅Ρ ΡΡΠΎ ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΡΠ΅ΡΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. yarn workspaces
, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ _ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°ΡΡ_ ΠΎΠ±ΡΠΈΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ Π½Π°Π²Π΅ΡΡ
- ΡΠ°ΠΊΠΆΠ΅ ΡΠ΅ΡΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Β«Π²ΠΎΠ»ΡΠ΅Π±Π½ΠΎΠΉΒ» ΠΏΠΎΠΌΠΎΡΠΈ.
npm workspaces
? ΠΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΏΡΡΠΌΠΎ ΡΠ΅ΠΉΡΠ°Ρ.
ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Ρ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠΈΠ» ΡΠ²ΠΎΠΉ ΠΏΡΠΎΠ΅ΠΊΡ Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΠΈΡ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ². ΠΠ½ ΡΠ΅ΡΠ°Π΅Ρ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π±Π΅Π· ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠΉ, ΠΈ Π² Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠΎΠ΄ΡΠ΅ΠΌ/ΡΡΡΡΠΊΡΡΡΠ° Π²ΡΠ³ΠΎΠ΄Π½Ρ.
ΠΡΠΎ Π±ΡΠ» Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ΅Π·. Π― ΠΏΡΠΎΠ±ΠΎΠ²Π°Π» ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ webpack resolve.alias, Π½ΠΎ ΠΎΠ½ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π», ΠΏΡΠΎΠ±ΠΎΠ²Π°Π» ΠΌΠ½ΠΎΠ³ΠΎ Π½Π°ΡΡΡΠΎΠ΅ΠΊ, Π½ΠΎ, ΠΊ ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΠΌΠ½Π΅ ΡΠ°ΠΊ ΠΈ Π½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ Π·Π°ΡΡΠ°Π²ΠΈΡΡ Π΅Π³ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ, Π½ΠΎ Π²ΠΎΡ ΠΊΠ°ΠΊ ΠΌΠ½Π΅, Π½Π°ΠΊΠΎΠ½Π΅Ρ, ΡΠ΄Π°Π»ΠΎΡΡ Π·Π°ΡΡΠ°Π²ΠΈΡΡ Π΅Π³ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ:
ΠΠΎΡ ΠΌΠΎΡ ΡΡΡΡΠΊΡΡΡΠ° ΠΏΠ°ΠΏΠΎΠΊ:
ΠΡΠΎΠ΅ΠΊΡ
|
+-- node_modules
|
+-- ΠΏΠΎΡΡΡΠΎΠΈΡΡ
| |
| +-- index.js
|
+-- ΠΏΡΠΈΠΌΠ΅Ρ (ΡΠΎΠ·Π΄Π°ΡΡ-ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅)
| |
| +-- package.json
ΠΠ½Π΅ ΠΏΡΠΈΡΠ»ΠΎΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠ²ΠΎΠΉ package.json Π²Π½ΡΡΡΠΈ ΠΏΠ°ΠΏΠΊΠΈ Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ°ΠΌΠΈ, ΠΏΠΎ ΡΡΡΠΈ Π²ΡΡΠ°ΡΠΈΠ² ΡΠ΅Π°ΠΊΡΠΈΡ ΠΈΠ· Β«ΠΎΡΠ½ΠΎΠ²Π½ΡΡ Β» ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ node_modules ΠΏΡΠΎΠ΅ΠΊΡΠ° Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ @jmlivingston , Π²ΠΎΡ ΠΊΠ°ΠΊ ΡΡΠΎ Π·Π°ΠΊΠΎΠ½ΡΠΈΠ»ΠΎΡΡ:
"dependencies": {
"react": "file:../node_modules/react",
"react-dom": "file:../node_modules/react-dom",
"react-scripts": "2.1.5"
},
Π’Π΅ΠΏΠ΅ΡΡ, ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ, Ρ Π·Π°ΠΏΡΡΡΠΈΠ» npm install
, Π° Π·Π°ΡΠ΅ΠΌ Π·Π°ΠΏΡΡΡΠΈΠ» npm link
, ΠΈ ΡΡΠΎ ΠΏΠΎΠΌΠΎΠ³Π»ΠΎ.
ΠΠ°Π΄Π΅ΡΡΡ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΌΠΎΡΡ ΠΊΠΎΠΌΡ-ΡΠΎ Π΅ΡΠ΅ ΠΈ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡΡ Π²ΡΠ΅ΠΌΡ.
ΠΡΠ°ΠΊ, ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ? Π― ΠΏΡΠΎΠ±ΠΎΠ²Π°Π» ΡΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΉ Π·Π΄Π΅ΡΡ, ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠΎΠ³, ΠΈ Π½Π΅ ΠΏΠΎΠ²Π΅Π·Π»ΠΎ. Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ create-ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΎΠΏΠΈΡΠ½ΡΠΉ ΡΠ΅ΠΊΡΡ. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ React/React-dom 16.8.3. ΠΡΠΎ Π½ΠΎΠ²ΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΡΠΎΠ·Π΄Π°Π» 2 Π΄Π½Ρ Π½Π°Π·Π°Π΄, ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎΠΉ. Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ useSpring() ΠΈ Π°Π½ΠΈΠΌΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ.div. Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ
@guru-florida, ΡΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡ ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΡΠΉ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡ?
Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠΎΡ ΠΆΠ΅ ΡΡΠ΅ΠΊ, ΡΡΠΎ ΠΈ Π²Ρ (ΠΌΠ°ΡΠΈΠ½ΠΎΠΏΠΈΡΡ ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ create-ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ), ΠΈ Ρ ΠΌΠ΅Π½Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ Π°ΡΡΠΈΠ±ΡΡΠΎΠΌ render
. ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΅Π³ΠΎ Π½Π° component
ΠΏΠΎΠΌΠΎΠ³Π»ΠΎ.
ΠΠΎ:
<Route path="/signup" render={SignUp} />
ΠΠΎΡΠ»Π΅:
<Route path="/signup" component={SignUp} />
ΠΠ°Π΄Π΅ΡΡΡ, ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ..!
@mikeyyyyyy ΠΠ΅Ρ, Π·Π΄Π΅ΡΡ React Router Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ. Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° ΡΠΎΠ²Π΅Ρ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Ρ Π±ΡΠ» Π² ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΏΡΡΠ°Π»ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Spring, ΠΈ Ρ ΠΌΠ΅Π½Ρ Π±ΡΠ»Π° ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°.
Π£ ΠΌΠ΅Π½Ρ Π±ΡΠ»Π° ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠΎ ΡΡΡΠ»ΠΊΠΎΠΉ npm (Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΏΠΎΡΡΠ»ΠΊΠΈ), npm link .../whatever/node_modules/react
, ΠΏΠΎΡ
ΠΎΠΆΠ΅, Π½Π΅ ΡΠ΅ΡΠ°Π΅Ρ Π΅Π΅, Π½ΠΎ ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌΠΈ Π±Π΅Π· ΠΊΡΡΡΠΊΠΎΠ²
@tj ΠΡΠΌΠ°Ρ, Ρ ΡΠ΅Π±Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ssr. ΠΡΡΡΡΡΠΉ ΠΎΠ±Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡΡΡ - ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ΅Π°ΠΊΡΠΈΠΈ ΠΈΠ»ΠΈ Π²ΡΡ ΡΠ΅Π°ΠΊΡΠΈΡ ΠΈΠ· ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΈ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ Π΅Π΅ Π² ΠΏΠ°ΠΊΠ΅Ρ Π²Π°ΡΠ΅Π³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ°.
@seeden Π°Π°Π° , Ρ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ SSR, ΠΏΡΠΎΡΡΠΎ SPA Ρ ΠΏΠΎΡΡΠ»ΠΊΠΎΠΉ. Π£ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ pkg ui
Π΄Π»Ρ ΠΌΠΎΠΈΡ
ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ
Π²Π΅ΡΠ΅ΠΉ ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π½Π°Π΄ ΠΊΠΎΡΠΎΡΡΠΌ Ρ ΡΠ°Π±ΠΎΡΠ°Ρ, ΠΎΠ±Π° ΠΈΠΌΠ΅ΡΡ ΠΎΠ΄Π½Ρ ΠΈ ΡΡ ΠΆΠ΅ Π²Π΅ΡΡΠΈΡ react
, ΠΊΠ°ΠΆΠ΅ΡΡΡ ΡΡΡΠ°Π½Π½ΡΠΌ, ΡΡΠΎ Π΅ΡΡΡ Π΄ΡΠ±Π»ΠΈΠΊΠ°Ρ, Π½ΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΡΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Parcel
@tj ΠΎ, Ρ Π²ΠΈΠΆΡ. Π’ΠΎΠ³Π΄Π° ΡΠ΄Π°ΡΠΈ Π² ΡΡΠΎΠΌ ΠΎΡΠ΅Π½Ρ ΡΡΡΠ°Π½Π½ΠΎΠΌ Π²ΠΎΠΏΡΠΎΡΠ΅. Π― ΠΏΡΠΎΠ²Π΅Π» ΠΎΠ΄Π½Ρ Π½Π΅Π΄Π΅Π»Ρ Ρ ΡΡΠΈΠΌ
ΠΡΠ°ΠΊ, ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ?
ΠΠ΄Π΅ΡΡ Π½Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΊΠ°ΠΊ ΡΠ°ΠΊΠΎΠ²ΠΎΠΉ. ΠΠ°ΠΊ ΠΎΠ±ΡΡΡΠ½Π΅Π½ΠΎ Π½Π° ΡΡΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΠ΅ , React ΡΡΠ΅Π±ΡΠ΅Ρ, ΡΡΠΎΠ±Ρ Π²ΡΠ·ΠΎΠ²Ρ useState()
Π½Π°Ρ
ΠΎΠ΄ΠΈΠ»ΠΈΡΡ Π½Π° ΡΠΎΠΌ ΠΆΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ΅ react
, ΡΡΠΎ ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ react
, Β«Π²ΠΈΠ΄ΠΈΠΌΡΠΉΒ» ΠΈΠ·Π½ΡΡΡΠΈ react-dom
. ΠΡΠ»ΠΈ ΡΡΠΎ Π½Π΅ ΡΠΎ, ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ Ρ Π²Π°ΠΌΠΈ, ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π²Ρ ΡΠ²ΡΠ·ΡΠ²Π°Π΅ΡΠ΅ Π΄Π²Π΅ ΠΊΠΎΠΏΠΈΠΈ React Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ΅, ΡΡΠΎ ΡΠ°ΠΌΠΎ ΠΏΠΎ ΡΠ΅Π±Π΅ ΠΏΠ»ΠΎΡ
ΠΎ, Π° ΡΠ°ΠΊΠΆΠ΅ Π½Π°ΡΡΡΠ°Π΅Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΡΡΠ³ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄ΠΎ Ρ
ΡΠΊΠΎΠ². Π’Π°ΠΊ ΡΡΠΎ Π²Ρ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ Π·Π°Ρ
ΠΎΡΠΈΡΠ΅ ΡΡΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ. ΠΡΠ° ΡΡΡΠ°Π½ΠΈΡΠ° ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΎΠ±ΡΠΈΠ΅ ΡΠΏΠΎΡΠΎΠ±Ρ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠΈ, ΡΡΠΎΠ±Ρ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΡΡΠΎ.
ΠΡ ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌ ΡΡΠΎ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΎΡΠΊΡΡΡΡΠΌ Π΄Π»Ρ ΠΎΠ±ΠΌΠ΅Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌΠΈ ΠΎΠ±Ρ ΠΎΠ΄Π½ΡΠΌΠΈ ΠΏΡΡΡΠΌΠΈ, ΠΊΠΎΠ³Π΄Π° Π»ΡΠ΄ΠΈ ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡΡ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ. ΠΠΎ ΡΡΠΎ Π½Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠ°ΠΌΠ° ΠΏΠΎ ΡΠ΅Π±Π΅, ΠΊΠΎΡΠΎΡΡΡ ΠΌΠΎΠΆΠ΅Ρ ΡΠ΅ΡΠΈΡΡ ΠΊΡΠΎ ΡΠ³ΠΎΠ΄Π½ΠΎ, ΠΊΡΠΎΠΌΠ΅ Π²Π°Ρ.
Π£ ΠΌΠ΅Π½Ρ Π±ΡΠ»Π° ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠΎ ΡΡΡΠ»ΠΊΠΎΠΉ npm (Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΏΠΎΡΡΠ»ΠΊΠΈ), ΡΡΡΠ»ΠΊΠ° npm .../whatever/node_modules/react, ΠΏΠΎΡ ΠΎΠΆΠ΅, Π½Π΅ ΡΠ΅ΡΠ°Π΅Ρ Π΅Π΅, Π½ΠΎ ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌΠΈ Π±Π΅Π· ΠΊΡΡΡΠΊΠΎΠ²
ΠΠ΅ Π²ΠΎΠ·ΡΠ°ΠΆΠ°Π΅ΡΠ΅ Π»ΠΈ Π²Ρ ΡΠΎΠ·Π΄Π°ΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΠ΅ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΠΎΠ½Π½ΡΠΉ ΠΊΠ΅ΠΉΡ?
@gaearon ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ, Ρ Π½Π΅Π³ΠΎ Π±ΡΠ΄Π΅Ρ Π²ΡΠ΅ΠΌΡ ΠΏΠΎΠΊΠΎΠΏΠ°ΡΡΡΡ Π΅ΡΠ΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ Π½Π΅Π΄Π΅Π»Π΅
Π ΡΡΠ°ΡΡΡΡ, require-control
ΠΈΡΠΏΡΠ°Π²ΠΈΠ»Π° Π½Π°ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠΎ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΎΠΌ yarn link
+ SSR + styled-components 4. Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ @theKashey π
Π― ΠΏΡΠΎΠ±ΠΎΠ²Π°Π» Π·Π΄Π΅ΡΡ Π²ΡΠ΅ ΠΈ Π½Π΅ ΡΠΌΠΎΠ³. ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΡΡΠΎ Π±ΡΠ»ΠΎ ΡΡΠΎ-ΡΠΎ Π΄ΡΡΠ³ΠΎΠ΅, Π½Π΅ Π·Π°Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π·Π΄Π΅ΡΡ. ΠΡΠΎ Π±ΡΠ»ΠΎ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ ΡΡΠ²ΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡΡ ΠΊ ΡΠ΅Π³ΠΈΡΡΡΡ ΠΈΠΌΠΏΠΎΡΡΠ° ΡΠ΅Π°ΠΊΡΠΈΠΈ . Π Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΠ»ΡΡΠ°ΡΡ Ρ Π½Π°Ρ Π±ΡΠ»ΠΎ:
import React from 'react'
Π Π² Π΄ΡΡΠ³ΠΈΡ :
import React from 'React'
Π Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ (unix, osx) ΡΡΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎ Webpack ΡΠΎΠ·Π΄Π°Π΅Ρ Π΄Π²Π΅ ΠΊΠΎΠΏΠΈΠΈ React.
ΠΡΠΎ Π²ΡΠ·Π²Π°Π»ΠΎ ΠΊΡΠ°ΠΉΠ½ΡΡ ΠΏΡΡΠ°Π½ΠΈΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Ρ ΡΡΠ½ΠΎ Π²ΠΈΠ΄Π΅Π», ΡΡΠΎ Ρ Π½Π°Ρ Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Π° ΠΊΠΎΠΏΠΈΡ React; Π½ΠΎ Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΌΡ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π»ΠΈ Π΅Π³ΠΎ.
Π’Π΅ΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΏΠΎ ΡΠ΅Π°ΠΊΡΠΈΠΈ ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½, ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π½ΠΈΠΆΠ½ΠΈΠΉ ΡΠ΅Π³ΠΈΡΡΡ.
ΠΡΠΎ Π·Π²ΡΡΠΈΡ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ Π±ΡΠ΄ΡΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π΄ΠΎΡΡΠΎΠΉΠ½ΠΎ ΡΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΡ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°Ρ ?
ΠΠ»Ρ ΠΌΠ΅Π½Ρ ΠΏΡΠΈΡΠΈΠ½ΠΎΠΉ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² React Π±ΡΠ» Webpack DllPlugin. ΠΠ»Ρ ΠΌΠΎΠ΅Π³ΠΎ ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊΠ° DLL Ρ Π½Π΅ Π²ΠΊΠ»ΡΡΠΈΠ» react
ΠΈ react-dom
Π² ΡΠ²ΠΎΠΉ ΡΠΏΠΈΡΠΎΠΊ Π·Π°ΠΏΠΈΡΠ΅ΠΉ, ΠΎΠ΄Π½Π°ΠΊΠΎ Ρ ΠΌΠ΅Π½Ρ Π±ΡΠ»ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π»ΠΈ react
ΠΈΠ»ΠΈ react-dom
, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΠΎΡ DLL ΡΠΎΠ΄Π΅ΡΠΆΠ°Π»Π° react
ΠΈ react-dom
(Π±ΡΡΡΡΠ°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° json-ΡΠ°ΠΉΠ»Π° ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ ΡΡΠΎ). ΠΡΠ°ΠΊ, ΠΊΠΎΠ³Π΄Π° Ρ Π·Π°ΠΏΡΡΠΊΠ°Π» ΠΊΠΎΠ΄ ΠΈ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π» React Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΎΠ½ Π·Π°Π³ΡΡΠΆΠ°Π» Π΅Π³ΠΎ ΠΈΠ· node_modules
, Π½ΠΎ Π² ΠΊΠΎΠ΄Π΅ ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊΠΎΠ² React ΡΡΠ΅Π±ΠΎΠ²Π°Π»ΡΡ ΠΈΠ· ΠΈΡ
DLL-ΡΠ°ΠΉΠ»Π°.
Π ΡΠ΅Π»ΠΎΠΌ : Π±ΡΠ΄ΡΡΠ΅ ΠΎΡΡΠΎΡΠΎΠΆΠ½Ρ Ρ DLL-ΡΠ°ΠΉΠ»Π°ΠΌΠΈ ΠΈ ΡΠ±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π²Π°ΡΠΈ Π²ΠΊΠ»ΡΡΠ΅Π½Π½ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½Ρ, ΠΈΠ½Π°ΡΠ΅ Π²Ρ Π±ΡΠ΄Π΅ΡΠ΅ Π΄Π²Π°ΠΆΠ΄Ρ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡ .
Π― ΡΠΌΠΎΠ³ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΡΡΠΎ, ΠΎΠ±Π½ΠΎΠ²ΠΈΠ² react-hot-loader
Π΄ΠΎ 4.6.0
ΡΡΠΎ ΡΡΠ°Π±ΠΎΡΠ°Π»ΠΎ Π΄Π»Ρ Π²Π΅ΡΠ΅ΠΉ npm link
Π² Parcel:
"alias": {
"react": "../ui/node_modules/react",
"react-dom": "../ui/node_modules/react-dom"
}
Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½, ΡΡΠΎ ΡΡΠΎ ΡΠΎ, ΡΡΠΎ ΠΎΠ½ ΠΏΠΎΠΏΡΡΠ°Π΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΡΠ±ΠΎΡΠΊΠΈ, ΠΊΠ°ΠΆΠ΅ΡΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Ρ Π°ΠΊΠ΅ΡΡΠΊΠΈΠΌ, Π½ΠΎ ΠΎΠ½ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ
@theKashey OMG, ΡΡΠ²Π°ΠΊ, ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ! Π― ΠΏΡΠΎΠ±ΠΎΠ²Π°Π» ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
ΡΠ΅ΡΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π»ΡΠ΄ΠΈ ΠΏΡΠ΅Π΄Π»Π°Π³Π°ΡΡ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ: ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Ρ package.json
deps, ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ Β«Π΄Π²ΡΡ
ΡΠ΅Π°ΠΊΡΠΈΠΉΒ» Π² ΠΏΡΠΎΠ΅ΠΊΡΠ΅, ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°, Π½Π΅ Π½Π°ΡΡΡΠ°Ρ Π»ΠΈ Ρ Β«ΠΏΡΠ°Π²ΠΈΠ»ΠΎ Ρ
ΡΠΊΠΎΠ²Β» (ΠΊΠΎΡΠΎΡΠΎΠ΅ Ρ Π½Π΅Ρ), Π½ΠΎ Ρ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ Π²Π°Ρ Π²Π°ΡΠΈΠ°Π½Ρ Ρ:
alias: {
react: path.resolve(path.join(__dirname, './node_modules/react')),
'react-dom': path.resolve(path.join(__dirname, './node_modules/react-dom'))
}
ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΡΡ Π½Π°Ρ ΠΏΡΠΎΠ΅ΠΊΡ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΡΠΎΠ²Π΅Π½Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Ρ ΡΠΊΠΈ Π² Π½Π°ΡΠ΅ΠΌ app-as-a-lib .
ΠΡΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ webpack.config.js
npm ls react
Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ
[email protected] D:\code\project
`-- (empty)
Π΄Π»Ρ ΠΌΠ΅Π½Ρ
console.log(window.React1 === window.React2)
Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΈΡΡΠΈΠ½Ρ
Π½Π° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Ρ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΡΠΎ SSR Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ
ΠΠ±Π½ΠΎΠ²Π»ΡΡΡ. ΠΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π±ΡΠ»ΠΎ Π²ΡΠ·Π²Π°Π½ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ SSR React-apollo (https://github.com/apollographql/react-apollo/issues/2541)
ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎ 2.3.1 ΠΈΡΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΡΡΠΎ
ΠΡΠΈΠ²Π΅Ρ, ΡΠ΅Π±ΡΡΠ°, Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΡΠΎΠ»ΠΊΠ½ΡΠ»Π°ΡΡ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, ΠΈ Π½Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°Π»ΠΎΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π΄Π½Π΅ΠΉ, ΡΡΠΎΠ±Ρ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ Ρ Π½Π΅ΠΉ.
Π Π΅ΡΠ΅Π½ΠΈΠ΅ A: ΡΠΊΠ°ΠΆΠΈΡΠ΅ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΏΠ°ΠΊΠ΅ΡΠ° Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ°, ΠΊΠ°ΠΊ ΡΠΊΠ°Π·Π°Π½ΠΎ Π²ΡΡΠ΅.
alias: {
react: path.resolve(path.join(__dirname, './node_modules/react')),
'react-dom': path.resolve(path.join(__dirname, './node_modules/react-dom'))
}
Π Π΅ΡΠ΅Π½ΠΈΠ΅ B: ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ webpack resolve.modules , ΡΡΠΎΠ±Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠΈ node_modules Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ.
ΠΡΠ΅ΠΆΠ΄Π΅ Π²ΡΠ΅Π³ΠΎ, ΡΡΠΎ Π½Π΅ ΠΎΡΠΈΠ±ΠΊΠ° ΡΠ΅Π°ΠΊΡΠΈΠΈ, ΡΡΠΎ Π΄Π°ΠΆΠ΅ Π½Π΅ lerna, Π½ΠΎ ΡΠ΅Π°ΠΊΡΠΈΡ, Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅Ρ ΠΈ npm-link ΠΌΠΎΠ³ΡΡ Π²Π·ΡΡΡ Π½Π° ΡΠ΅Π±Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ±ΡΠ·Π°Π½Π½ΠΎΡΡΠΈ.
-ΠΠ΅ ΠΌΠΎΠ½ΠΎΡΠ΅ΠΏΠΎ:
Π‘ΡΡΡΠΊΡΡΡΠ°
- mono repo root
- packages
- ComponentWithHooks (peerDependency: react@^16.8.1)
- ProductA (dependency: ComponentWithHooks, dependency: react@^16.8.4)
- ProductB (dependency: react@^16.8.1)
ΠΠΎΡΠ»Π΅ Π·Π°Π³ΡΡΠ·ΠΊΠΈ Ρ ΡΠ°Π±ΠΎΡΠΈΠΌΠΈ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π°ΠΌΠΈ ΠΎΠ½ ΡΠ°Π·ΡΠ΅ΡΠΈΡ
- mono repo root
- node_modules
- react(16.8.1)
- packages
- ComponentWithHooks
- node_modules (empty)
- ProductA
- node_modules
- react(16.8.4)
- ProductB
- node_modules (empty)
Π ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ Π²Ρ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π΅ΡΠ΅ ProductA
Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΈΠ»ΠΈ, ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ, ΡΠ΅Π³ΠΎ-ΡΠΎ Π΅ΡΠ΅, ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ 2 ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΡΠ΅Π°ΠΊΡΠΈΠΈ.
ΠΠΎΠ΄ Π² ProductA Π±ΡΠ΄Π΅Ρ ΠΈΡΠΊΠ°ΡΡ ProductA/node_modules/react
.
ΠΠΎ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ComponentWithHooks Π±ΡΠ΄Π΅Ρ ΠΈΡΠΊΠ°ΡΡ mono repo root/node_modules/react
.
ΠΠΎΡΠ΅ΠΌΡ? ΠΠΎΠΌΠ½ΠΈΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΏΠΎΠΈΡΠΊΠ° npm? ΠΡΠ»ΠΈ ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π½Π°ΠΉΡΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ Π² ΡΠ²ΠΎΠ΅ΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅ node_modules, ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΊΠ°ΡΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ node_modules...
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΠ°ΠΊΠΈΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ, ΠΊΠ°ΠΊ webpack, ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ»ΠΈ ΡΡΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ.
ΠΠ΅Ρ Π½ΠΈΡΠ΅Π³ΠΎ ΠΏΠ»ΠΎΡ
ΠΎΠ³ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΌΠΎΠ½ΠΎΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠΌ.
Π ΠΎΠ±ΡΡΠ½ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ ΡΡΠΎΠ³ΠΎ Π½Π΅ Π·Π°ΠΌΠ΅ΡΠΈΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Ρ ΠΈΠ· Π½ΠΈΡ
Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ, ΠΊΠ°ΠΊ ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ ΠΈ ΡΠΎΠΊΡΠ°ΡΠ°ΡΡΡΡ.
Π£ ΠΌΠ΅Π½Ρ ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΡΠ°Π±ΠΎΡΠΈΡ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ² ΠΏΡΡΠΆΠΈ - https://github.com/mwarger/yarn-workspace-hooks-repro
Π£ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ component-library
, Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΠΉ ΠΌΠ°ΡΠΈΠ½ΠΎΠΏΠΈΡΠ½ΡΠΌ ΡΡΠΈΡΡΠΎΠΌ ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½Π½ΡΠΉ ΠΊ ΠΏΠΎΡΡΠ»ΠΊΠ΅. example-demo
β ΡΡΠΎ ΡΠΎ, ΡΡΠΎ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ ΡΡΠΎΡ component-library
, ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ Π½Π΅Π΄Π°Π²Π½ΠΎ ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ CRA. ΠΡΠ΅ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°ΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΡΡΠΆΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ΅ΠΎΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ Π΄ΠΎΡΡΡΠΏΠ½Π° ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Π° Π²Π΅ΡΡΠΈΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ. ΠΠ΄Π½Π°ΠΊΠΎ Π²ΡΠ·ΠΎΠ² React.useEffect
, ΠΊΠΎΡΠΎΡΡΠΉ Ρ Π΄Π΅Π»Π°Ρ Π² index.tsx, Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΌΠ΅Π½Ρ ΠΊ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ΅ Ρ GitHub.
ΠΡΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΠΏΠΎΠΊΠ° Π½Π΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Ρ
ΡΠΊ. Π§ΡΠΎΠ±Ρ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ ΠΎΡΠΈΠ±ΠΊΡ, ΡΠ°ΡΠΊΠΎΠΌΠΌΠ΅Π½ΡΠΈΡΡΠΉΡΠ΅ ΡΡΡΠΎΠΊΠΈ 7β9 Π² component-library/src/index.tsx
ΠΠ°Π΄Π΅ΡΡΡ, Ρ Π΄Π΅Π»Π°Ρ ΡΡΠΎ-ΡΠΎ Π³Π»ΡΠΏΠΎΠ΅, ΡΡΠΎ Ρ ΡΠΏΡΡΡΠΈΠ» ΠΈΠ· Π²ΠΈΠ΄Ρ. ΠΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΡΠΎΠΎΠ±ΡΠΈΡΠ΅, ΠΊΠ°ΠΊΠΈΠ΅ ΡΠ°Π³ΠΈ Ρ ΠΌΠΎΠ³Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠΏΡΡΠ°ΡΡΡΡ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΡΡΠΎ. Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ!
ΠΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅: ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ Π½ΠΈΠΆΠ΅ Π²ΡΠ²ΠΎΠ΄ ΡΡΠ΅Π½Π°ΡΠΈΡ ΠΎΡΠ»Π°Π΄ΠΊΠΈ Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π΄Π»Ρ ΠΌΠ΅Π½Ρ true
. ΠΠΎΡ
ΠΎΠΆΠ΅, Ρ ΠΌΠ΅Π½Ρ Π½Π΅Ρ Π΄Π²ΡΡ
React.
// Add this in node_modules/react-dom/index.js
window.React1 = require('react');
// Add this in your component file
require('react-dom');
window.React2 = require('react');
console.log(window.React1 === window.React2);
Π£ ΠΌΠ΅Π½Ρ ΡΡΠ»ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°ΡΠΎΠ², ΡΠ°ΠΊ ΡΡΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΡΠΎΠΈΡ ΡΠ΄Π΅Π»Π°ΡΡ Π·Π°ΠΌΠ΅ΡΠΊΡ Π·Π΄Π΅ΡΡ.
Π ΠΌΠΎΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Ρ ΠΏΠΎΠΌΠ΅ΡΡΠΈΠ» ΡΡΡΠΎΠΊΡ <script defer src="./dist/bundle.js" />
Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ HTML-ΡΠ°Π±Π»ΠΎΠ½Π°, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΠΎ, Π΅ΡΠ»ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Ρ
ΡΠΊΠΈ React. ΠΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ, ΠΈ Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° window.React1 == window.React2
Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ true
.
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ webpack Π²ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠΈ Π²ΡΡΠ°Π²ΠΈΡ ΡΠ΅Π³ ΡΠΊΡΠΈΠΏΡΠ°, ΡΠ°Π±Π»ΠΎΠ½ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠ΅Π³Π° ΡΠΊΡΠΈΠΏΡΠ°. Π£Π΄Π°Π»ΠΈΡΠ΅ ΡΠ΅Π³ script ΠΈΠ· ΡΠ°Π±Π»ΠΎΠ½Π°, ΡΡΠΎΠ±Ρ React ΡΠ½ΠΎΠ²Π° ΡΠ°Π±ΠΎΡΠ°Π» Ρ Ρ ΡΠΊΠ°ΠΌΠΈ (ΠΊΠ°Π»Π°ΠΌΠ±ΡΡ).
Π ΠΌΠΎΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ React, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π±ΡΠ»ΠΎ npm ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΡ, Π½Π°Π΄ ΠΊΠΎΡΠΎΡΠΎΠΉ Ρ ΡΠ°Π±ΠΎΡΠ°Π». ΠΡΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ, ΠΏΠΎΠΊΠ° Ρ Π½Π΅ ΠΈΡΠΏΡΠ°Π²Π»Ρ ΠΏΠ°ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΡΡ react
ΠΈ react-dom
Π² dev ΠΈ peer deps.
cd node_modules/react && npm link
cd node_modules/react-dom && npm link react
npm link react
ΠΠΎΡΠ΅ΠΌΡ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ? ΠΠ° ΡΡΡΠ°Π½ΠΈΡΠ΅ Ρ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ ΡΠΏΠΎΠΌΠΈΠ½Π°Π΅ΡΡΡ, ΡΡΠΎ Β«Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Ρ ΡΠΊΠΈ ΡΠ°Π±ΠΎΡΠ°Π»ΠΈ, ΠΈΠΌΠΏΠΎΡΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ ΠΈΠ· ΠΊΠΎΠ΄Π° Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ°Π·ΡΠ΅ΡΠ°ΡΡΡΡ Π² ΡΠΎΡ ΠΆΠ΅ ΠΌΠΎΠ΄ΡΠ»Ρ, ΡΡΠΎ ΠΈ ΠΈΠΌΠΏΠΎΡΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ ΠΈΠ· ΠΏΠ°ΠΊΠ΅ΡΠ° react-domΒ».
Π£ ΠΌΠ΅Π½Ρ Π²ΡΠ΅ Π΅ΡΠ΅ Π΅ΡΡΡ ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, Π½Π΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎ, ΡΡΠΎ Ρ ΠΏΡΠΎΠ±ΠΎΠ²Π°Π» Π²ΡΠ΅ Π²ΡΡΠ΅ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΠΎΠ΅. Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ webpack4/babel Ρ ΠΏΠ»Π°Π³ΠΈΠ½Π°ΠΌΠΈ preset-env
ΠΈ preset-react
. ΠΠΎΠΈ Π²Π΅ΡΡΠΈΠΈ react/react-dom ΠΏΡΠΈΠ²ΡΠ·Π°Π½Ρ ΠΊ 16.8.4
Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠΉ ΠΏΡΡΠΆΠΈ (Π³Π΄Π΅ ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° window.React1 === window.React2
ΡΠ²Π΅ΡΡ
Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ true
).
ΠΡΠΎ ΡΠ°ΠΌΡΠΉ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ:
import React, { useState } from "react";
function MyComp() {
const [hello] = useState(0);
return <div>HELLO {hello}</div>;
}
export default MyComp;
Π£ ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ Π΅ΡΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΠΈΠ΄Π΅ΠΈ?
Π ΠΠΠΠΠ’ΠΠ ΠΠΠΠ’Π¬: Π§ΡΠΎΠ±Ρ ΡΡΠΎΡΠ½ΠΈΡΡ, ΠΎΡΠΈΠ±ΠΊΠ° ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ ΠΊΠ°ΠΊ react.development.js:88 Uncaught Invariant Violation: Hooks can only be called inside the body of a function component.
Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ OP.
Π ΠΌΠΎΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ React, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π±ΡΠ»ΠΎ npm ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΡ, Π½Π°Π΄ ΠΊΠΎΡΠΎΡΠΎΠΉ Ρ ΡΠ°Π±ΠΎΡΠ°Π». ΠΡΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ, ΠΏΠΎΠΊΠ° Ρ Π½Π΅ ΠΈΡΠΏΡΠ°Π²Π»Ρ ΠΏΠ°ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΡΡ
react
ΠΈreact-dom
Π² dev ΠΈ peer deps.
- ΠΠ· ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ:
cd node_modules/react && npm link
- ΠΠ· ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ:
cd node_modules/react-dom && npm link react
- ΠΠ· ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ°:
npm link react
ΠΠΎΡΠ΅ΠΌΡ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ? ΠΠ° ΡΡΡΠ°Π½ΠΈΡΠ΅ Ρ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ ΡΠΏΠΎΠΌΠΈΠ½Π°Π΅ΡΡΡ, ΡΡΠΎ Β«Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Ρ ΡΠΊΠΈ ΡΠ°Π±ΠΎΡΠ°Π»ΠΈ, ΠΈΠΌΠΏΠΎΡΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ ΠΈΠ· ΠΊΠΎΠ΄Π° Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ°Π·ΡΠ΅ΡΠ°ΡΡΡΡ Π² ΡΠΎΡ ΠΆΠ΅ ΠΌΠΎΠ΄ΡΠ»Ρ, ΡΡΠΎ ΠΈ ΠΈΠΌΠΏΠΎΡΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ ΠΈΠ· ΠΏΠ°ΠΊΠ΅ΡΠ° react-domΒ».
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ! ΠΡΠΎ ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π΄Π»Ρ ΠΌΠ΅Π½Ρ. (Π΄Π°ΠΆΠ΅ ΠΊΠΎΠ³Π΄Π° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ npm-ΡΡΡΠ»ΠΊΡ ΠΈ ΡΠΌΠ΅ΡΠ°Π½Π½ΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ Ρ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΡΡΠ»ΠΊΠΎΠΉ)
Π― ΠΏΡΠΎΠ±ΠΎΠ²Π°Π» Π²ΡΠ΅, ΡΡΠΎ Π±ΡΠ»ΠΎ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ Π²ΡΡΠ΅, ΠΈ Π²ΡΠ΅ Π΅ΡΠ΅ ΠΈΠΌΠ΅Π» ΠΎΡΠΈΠ±ΠΊΡ.
Π‘ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΏΠΎΠΌΠΎΡΡΡ @inverherive ΠΌΡ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ»ΠΈ, ΡΡΠΎ enzyme-adapter-react-16
ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.
Π ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ ΠΌΡ ΠΎΠ±Π½ΠΎΠ²ΠΈΠ»ΠΈ react-test-renderer
Π΄ΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ Π²Π΅ΡΡΠΈΠΈ (16.8.4), ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½Π° ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅Π΄Π°Π²Π½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠ»Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ Ρ
ΡΠΊΠΎΠ², ΠΌΡ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ»ΠΈ ΡΠ΅ΡΠ΅Π· npm ls react-test-renderer
, ΡΡΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ Π²Π΅ΡΡΠΈΡ enzyme-adapter-react-16
(1.11.2 ) ΠΈΠΌΠ΅Π» Π²Π½ΡΡΡΠ΅Π½Π½ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ [email protected]
, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Ρ
ΡΠΊΠΈ.
βββ¬ [email protected]
β βββ [email protected]
βββ [email protected]
Π§ΡΠΎΠ±Ρ ΡΠ΅ΡΠΈΡΡ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ»Π΅Π΄ΡΡ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡΠΌ @chulanovskyi , ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΏΡΡΠΆΡ, ΠΌΡ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ react-test-renderer
Π² Π½Π°Ρ package.json. ΠΡΠΎ Π·Π°ΡΡΠ°Π²Π»ΡΠ΅Ρ Π²ΡΠ΅ ΡΡΡΠ»ΠΊΠΈ react-test-renderer
ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Β«16.8.4Β».
"resolutions": {
"react-test-renderer": "16.8.4"
},
ΠΡΠΎ Π±ΡΠ»ΠΎ ΠΌΠ΅Π³Π° ΡΠ°Π·ΠΎΡΠ°ΡΠΎΠ²ΡΠ²Π°ΡΡΠΈΠΌ, Π½Π°Π΄Π΅ΡΡΡ, ΡΡΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΌΠΎΡΡ ΠΊΠΎΠΌΡ-ΡΠΎ Π΅ΡΠ΅. Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ @chulanovskyi ΠΈ @theKashey Π·Π° ΠΈΡ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΡΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ, ΠΏΠΎΠΊΠ° Ρ Π½Π΅ ΠΈΡΠΏΡΠ°Π²Π»Ρ ΠΏΠ°ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΡΡ Π² dev ΠΈ peer deps.
@ajcrews (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ ΡΡΠΎ-ΡΠΎ ΠΏΡΠΎΠΏΡΡΡΠΈΠ», Π½ΠΎ) Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ npm link
Π²Π½ΡΡΡΠ΅Π½Π½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°, ΠΈ Π² ΡΡΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ Π΅ΡΡΡ react
Π² peerDependencies
ΠΈ devDependencies
, ΠΈ ΠΌΠ½Π΅ Π²ΡΠ΅ Π΅ΡΠ΅ Π½ΡΠΆΠ½Π° Π²Π°ΡΠ° ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΡΡΡΠ°Π½Π΅Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΊΠΈ. Π₯ΠΎΡΠΎΡΠ°Ρ Π½Π°Ρ
ΠΎΠ΄ΠΊΠ°!
Π― ΡΠΎΠ±ΠΈΡΠ°Π»ΡΡ Π½Π°ΠΏΠΈΡΠ°ΡΡ, Π½ΠΎ Π½Π°ΡΠ΅Π» ΡΠ΅ΡΠ΅Π½ΠΈΠ΅
Π£ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² Ρ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ CRA Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ.
Π package.json ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ CRA ΠΌΠ½Π΅ ΠΏΡΠΈΡΠ»ΠΎΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ react ΠΈ react-dom, ΡΡΠΎΠ±Ρ Β«Π·Π°ΠΈΠΌΡΡΠ²ΠΎΠ²Π°ΡΡΒ» ΠΈΠ· package.json ΠΊΠΎΡΠ½Π΅Π²ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°.
"dependencies": {
"react": "link:../node_modules/react",
"react-dom": "link:../node_modules/reac-dom",
}
ΠΡΠΎ Π±ΡΠ»ΠΎ ΠΌΠ΅Π³Π° ΡΠ°Π·ΠΎΡΠ°ΡΠΎΠ²ΡΠ²Π°ΡΡΠΈΠΌ, Π½Π°Π΄Π΅ΡΡΡ, ΡΡΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΌΠΎΡΡ ΠΊΠΎΠΌΡ-ΡΠΎ Π΅ΡΠ΅. Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ @chulanovskyi ΠΈ @theKashey Π·Π° ΠΈΡ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ.
@ ΠΡΠ΄Π΄ΠΈ-ΠΠ°ΠΌΠΈΠ»ΡΡΠΎΠ½ ΠΡΠ΅Π³Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΡΠΉΡΠ΅ ΡΠ°ΠΉΠ» Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΏΠΎΡΠ»Π΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ. Π― ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ Ρ ΡΠΎΠΉ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, ΠΊΠΎΠ³Π΄Π° yarn
Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π» react-test-renderer
. Π‘ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ΅ΠΉ Π² Π²Π°ΡΠ΅ΠΌ ΡΠ°ΠΉΠ»Π΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΡΡΠΎ:
yarn add -D react-test-renderer
-react-test-renderer@^16.0.0-0, react-test-renderer@^16.1.1:
+react-test-renderer@^16.0.0-0:
version "16.8.4"
resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.8.4.tgz#abee4c2c3bf967a8892a7b37f77370c5570d5329"
integrity sha512-jQ9Tf/ilIGSr55Cz23AZ/7H3ABEdo9oy2zF9nDHZyhLHDSLKuoILxw2ifpBfuuwQvj4LCoqdru9iZf7gwFH28A==
dependencies:
object-assign "^4.1.1"
prop-types "^15.6.2"
react-is "^16.8.4"
scheduler "^0.13.4"
+react-test-renderer@^16.8.5:
+ version "16.8.5"
+ resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.8.5.tgz#4cba7a8aad73f7e8a0bc4379a0fe21632886a563"
+ integrity sha512-/pFpHYQH4f35OqOae/DgOCXJDxBqD3K3akVfDhLgR0qYHoHjnICI/XS9QDwIhbrOFHWL7okVW9kKMaHuKvt2ng==
+ dependencies:
+ object-assign "^4.1.1"
+ prop-types "^15.6.2"
+ react-is "^16.8.5"
+ scheduler "^0.13.5"
yarn check
ΡΠΆΠ΅ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅Π΄ΠΈΡ Π²Π°Ρ
$ yarn check
warning "enzyme-adapter-react-16#react-test-renderer@^16.0.0-0" could be deduped from "16.8.5" to "[email protected]"
Π·Π°ΡΠ΅ΠΌ Π²ΡΡΡΠ½ΡΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ Π΄Π΅Π΄ΡΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ, ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠ² ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΏΠ°ΡΡ:
-react-test-renderer@^16.0.0-0:
- version "16.8.4"
- resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.8.4.tgz#abee4c2c3bf967a8892a7b37f77370c5570d5329"
- integrity sha512-jQ9Tf/ilIGSr55Cz23AZ/7H3ABEdo9oy2zF9nDHZyhLHDSLKuoILxw2ifpBfuuwQvj4LCoqdru9iZf7gwFH28A==
- dependencies:
- object-assign "^4.1.1"
- prop-types "^15.6.2"
- react-is "^16.8.4"
- scheduler "^0.13.4"
-
-react-test-renderer@^16.8.5:
+react-test-renderer@^16.0.0-0, react-test-renderer@^16.8.5:
Π’Π΅ΠΏΠ΅ΡΡ Ρ Π²Π°Ρ Π΅ΡΡΡ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½Π°Ρ Π²Π΅ΡΡΠΈΡ react-test-renderer
Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ
-Π»ΠΈΠ±ΠΎ ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΠΎΠ² resolutions
ΠΈΠ»ΠΈ webpack
.
ΠΠΎ Π»ΡΠ±ΡΠΌ Π²ΠΎΠΏΡΠΎΡΠ°ΠΌ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠΌ ΡΠΎ ΡΠ²ΡΠ·Π°Π½Π½ΡΠΌΠΈ ΠΏΠ°ΠΊΠ΅ΡΠ°ΠΌΠΈ ΠΈ create-react-app
, ΡΠ»Π΅Π΄ΡΠΉΡΠ΅ facebook/create-react-app#6207.
ΠΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΡΠ΅ΡΠΈΡΡ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΈ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΡΡΠΆΠΈ ΠΎΠ±ΡΡΠ½ΠΎ Π½Π΅ ΠΏΠΎΠΌΠΎΠ³Π°ΡΡ - ΡΡΠΎ Π±ΠΎΠ»ΡΡΠ΅ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ Β«ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠΌ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡΒ».
- Π΄Π»Ρ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅
aliases
- ΠΏΡΠΎΡΡΠΎ "ΠΆΠ΅ΡΡΠΊΠΈΠΉ" ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌ, Π²ΡΠ΅ ΡΡΠΊΠΈ, ΠΊΠ°ΠΊreact
, Π² ΠΎΠ΄ΠΈΠ½ ΡΠ°ΠΉΠ»resolve: { extensions: ['.ts', '.tsx', '.js', '.jsx'], alias: { react: path.resolve(path.join(__dirname, './node_modules/react')), }
- Π΄Π»Ρ ΠΏΠΎΡΡΠ»ΠΎΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠ΅ ΠΆΠ΅ ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΡ, Π½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΠ΅ ΠΈΡ Π² package.json - https://parceljs.org/module_resolution.html#aliases
- Π΄Π»Ρ nodejs (Π½Π΅ ΡΡΡΠΊΠ°) Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ΅Π±ΡΠ΅ΠΌΡΠΉ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ
import {setAliases} from 'require-control'; setAliases({ 'react': path.resolve(path.join(__dirname, './node_modules/react')) });
- Π΄Π»Ρ ΡΡΡΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅
moduleNameMapper
"jest": { "moduleNameMapper": { "^react$": "<rootDir>/node_modules/$1", },
ΠΡΠΎ ΡΠ΄Π΅Π»Π°Π»ΠΎ ΡΡΠΎ Π΄Π»Ρ ΠΌΠ΅Π½Ρ.
@ajcrews
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ! Π Π°Π±ΠΎΡΠ°Π΅Ρ Π±Π»Π΅ΡΡΡΡΠ΅ Π½Π° ΠΌΠ΅Π½Ρ!
Π― ΡΠ΄Π΅Π»Π°Π» Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΠ΅ΡΡΠΎΠ²ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ Π½Π°ΡΡΡΠΎΠΉΠΊΠΎΠΉ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ react 16.8.6, electronic-webpack ΠΈ RHL. ΠΡΠΈΠΌΠ΅ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎ, ΡΡΠΎ ΠΊΠΎΠ³Π΄Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΡΡΠ° ΠΎΡΠΈΠ±ΠΊΠ°, Π²Π΅ΡΡ Π±ΡΠ°ΡΠ·Π΅Ρ (Π² ΡΡΠΎΠΉ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅, ΡΠ»Π΅ΠΊΡΡΠΎΠ½) ΠΏΡΠΎΡΡΠΎ Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ΅Π»ΡΡ ΠΊΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ)
https://github.com/PerfectionCSGO/reeee
Π£ΠΆΠ΅ ΡΡΠ΅ΡΠΈΠΉ Π΄Π΅Π½Ρ Π»ΠΎΠΌΠ°Ρ Π³ΠΎΠ»ΠΎΠ²Ρ Π½Π°Π΄ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ. ΠΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΠΎ Ρ Π΄ΡΠΌΠ°Π», ΡΡΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² RHL, Π½ΠΎ Π΅Π³ΠΎ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π½Π΅ ΡΠ΅ΡΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.
npm ls response Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ. Π― ΡΠ±Π΅Π΄ΠΈΠ»ΡΡ, ΡΡΠΎ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π²ΡΡΠ΅ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΌΠΈ Π²Π΅ΡΡΠΈΡΠΌΠΈ + ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ°.
ΠΠΎΠ΄ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π² ΠΏΠ΅ΡΠΎΡΠ½ΠΈΡΠ΅.
Π ΠΏΡΠΎΡΡΠΎΠΌ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ΅/Π²Π΅Π±-ΡΠ°ΠΉΡΠ΅ ΠΊΠΎΠ΄ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π±Π΅Π· ΠΏΡΠΎΠ±Π»Π΅ΠΌ. ΠΠ΄Π½Π°ΠΊΠΎ Ρ ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΡΠΌ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠΎΠΌ ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΡΡΡ.
"dependencies": {
"i18next": "^15.0.9",
"i18next-browser-languagedetector": "^3.0.1",
"react": "^16.8.6",
"react-dom": "npm:@hot-loader/react-dom",
"react-hot-loader": "^4.8.2",
"react-i18next": "^10.6.1",
"source-map-support": "^0.5.11",
"tslint": "^5.15.0"
},
"devDependencies": {
"@babel/core": "^7.4.3",
"@babel/preset-react": "^7.0.0",
"@babel/preset-typescript": "^7.3.3",
"@types/react": "^16.8.12",
"@types/react-dom": "^16.8.3",
"electron": "^4.1.3",
"electron-builder": "20.39.0",
"electron-webpack": "^2.6.2",
"electron-webpack-ts": "^3.1.1",
"typescript": "^3.4.1",
"webpack": "^4.29.6"
}
ΠΠ°Π΄Π΅ΡΡΡ, ΠΊΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΏΠΎΠ΄ΡΠΊΠ°ΠΆΠ΅Ρ...
ΠΠΎΠ³Π΄Π° Ρ Π·Π°ΠΌΠ΅Π½Ρ react-l18next Π½Π° mobx-react-lite ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π½Π°Π±Π»ΡΠ΄Π°ΡΠ΅Π»Ρ, ΡΡΠΎ Π²ΡΠ·ΠΎΠ²Π΅Ρ ΡΠΎΡ ΠΆΠ΅ ΡΡΡΠ΅ΠΊΡ.
Π§ΡΠΎ ΠΊΠ°ΡΠ°Π΅ΡΡΡ ΠΌΠΎΠ΅ΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, Ρ ΡΠ΅ΡΠΈΠ» Π΅Π΅, ΡΠΎΠ»ΠΊΠ½ΡΠ² ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΡΠΉ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅Ρ Π»ΠΎΠΊΡΠ΅ΠΌ ΠΈ Π²ΡΠ±ΡΠ°Π² Π±ΠΎΠ»Π΅Π΅ Β«ΡΠΈΡΡΠΎΠ΅Β» ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠ»Π΅ΠΊΡΡΠΎΠ½ΠΎΠ². Π― ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ, ΡΡΠΎ ΡΡΠΎ Π½Π°Π±ΠΎΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Π² webpack ΠΈΠ»ΠΈ babel, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌ.
Π― ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅. ΠΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΡΡ
Π·Π΄Π΅ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ Π½Π΅ ΠΏΠΎΠΌΠΎΠ³Π»ΠΎ.
ΠΠΎΠΈΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π±ΡΠ»ΠΎ ΡΡΠΎΡΠΎΠ½Π½Π΅Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π·Π°Π³ΡΡΠΆΠ°Π»ΠΎΡΡ ΠΊΠ°ΠΊ Π²ΠΈΠ΄ΠΆΠ΅Ρ Π½Π° Π΄ΡΡΠ³ΠΎΠΌ Π²Π΅Π±-ΡΠ°ΠΉΡΠ΅.
ΠΠΎΠ³Π΄Π° ΡΠ°ΠΉΡ Π²ΠΏΠ΅ΡΠ²ΡΠ΅ Π·Π°Π³ΡΡΠΆΠ°Π»ΡΡ Ρ Π²ΠΈΠ΄ΠΆΠ΅ΡΠΎΠΌ, Π²ΡΠ΅ ΡΠ°Π±ΠΎΡΠ°Π»ΠΎ Ρ
ΠΎΡΠΎΡΠΎ, Π½ΠΎ ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠ΅ΡΠ΅ΡΠ΅Π» Π½Π° Π΄ΡΡΠ³ΡΡ ΡΡΡΠ°Π½ΠΈΡΡ ΠΈ Π²Π΅ΡΠ½ΡΠ»ΡΡ Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ Ρ Π²ΠΈΠ΄ΠΆΠ΅ΡΠΎΠΌ, Ρ ΠΏΠΎΠ»ΡΡΠΈΠ» ΠΎΡΠΈΠ±ΠΊΡ Π»ΠΎΠ²ΡΡΠ΅ΠΊ.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΎΡΠΈΠ±ΠΊΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡ Π½Π΅ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΊΡ ΡΡΡΠ°Π½ΠΈΡΡ.
Π― ΡΠ°ΡΠ°ΠΌΠΈ ΠΏΡΡΠ°Π»ΡΡ ΠΏΠΎΠ½ΡΡΡ, Π² ΡΠ΅ΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°. ΠΠ°ΠΊΠΎΠ½Π΅Ρ, ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π±ΡΠ»Π° Ρ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠΎΠΌ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°Π³ΡΡΠΆΠ°Π΅Ρ ΠΏΠ°ΠΊΠ΅Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡΡΡΠ°Π½ΠΈΡΡ ΠΏΠ°ΠΊΠ΅Ρ ΠΌΠΎΠ³ Π·Π°Π³ΡΡΠΆΠ°ΡΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·, ΡΡΠΎ, ΠΊΠ°ΠΊ Ρ ΠΏΠΎΠ»Π°Π³Π°Ρ, ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΎ ΠΊ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°ΠΌ React Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈ ΡΠΎΠΌ ΠΆΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅ ΠΈΠΌΠ΅Π½.
Π― ΠΈΡΠΏΡΠ°Π²ΠΈΠ» ΡΡΠΎ, ΠΏΡΠΎΠ²Π΅ΡΠΈΠ², Π·Π°Π³ΡΡΠΆΠ΅Π½ Π»ΠΈ ΡΠΆΠ΅ ΡΠΊΡΠΈΠΏΡ.
Π‘Π½Π°ΡΠ°Π»Π° Ρ ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π» ΡΠ²ΠΎΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Π² Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΈΠΌΠ΅Π½, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Β«Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈΒ» Webpack:
output: {
library: 'myLib',
...
}
Π ΠΏΠΎΡΠΎΠΌ Π² ΡΠΊΡΠΈΠΏΡΠ΅ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΈΠ» Π΅ΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΈΠ»ΠΈ Π½Π΅Ρ:
if(!window.myLib){
var bz = document.createElement('script');
bz.type = 'text/javascript';
bz.async = true;
bz.src = 'https://path/to/bundle.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(bz, s);
}
ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠ΅Π½Ρ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ, Π½ΠΎ Ρ Π½Π°Π΄Π΅ΡΡΡ, ΡΡΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΌΠΎΡΡ ΠΊΠΎΠΌΡ-ΡΠΎ Π΅ΡΠ΅.
ΠΡΠ°ΠΊ, Ρ Π½Π°Ρ Π΅ΡΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ React, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ΅Π΅ webpack.
ΠΡ ΠΏΡΡΠ°Π΅ΠΌΡΡ ΡΠΎΠ·Π΄Π°ΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ React, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Ρ
ΡΠΊΠΈ, ΠΌΡ ΠΏΡΠΎΠ±ΠΎΠ²Π°Π»ΠΈ ΠΌΠ΅Π½ΡΡΡ ΡΠ±ΠΎΡΡΠΈΠΊΠΈ (parcel, pure babel, webpack).
ΠΡΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π½Π°ΡΠ΅ΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΌΡ ΠΏΠΎΠΌΠ΅ΡΠΈΠ»ΠΈ react ΠΈ react-dom ΠΊΠ°ΠΊ Π²Π½Π΅ΡΠ½ΠΈΠ΅, ΠΏΠΎΡΡΠΎΠΌΡ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ Π²ΠΊΠ»ΡΡΠ°ΡΡ ΠΈΡ
Π² Π½Π°Ρ Π±Π°Π½Π΄Π».
ΠΡ ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠΎ ΠΆΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Ρ
ΡΠΊΠΎΠ² ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΡΡΠ»ΠΊΠΈ npm.
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΡΡΠ»ΠΊΠΈ Π½Π° ΡΠ΅Π°ΠΊΡΠΈΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, Π½ΠΎ ΡΡΠΎ Π½Π΅ Π»ΡΡΡΠΈΠΉ ΡΠ°Π±ΠΎΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°.
ΠΠ½Π΅ ΡΡΡΠ΄Π½ΠΎ ΠΏΠΎΠ½ΡΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΠΏΡΠΈΡΠΈΠ½Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. Π§ΡΠΎ ΡΠΎΠ·Π΄Π°Π΅Ρ Π΄ΡΠ±Π»ΠΈΠΊΠ°Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° React?
ΠΡΠΈΠ²Π΅Ρ @adriene-orange, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΠΉΡΠΈ ΠΌΠΎΠΉ ΠΏΠΎΡΡ https://github.com/facebook/react/issues/13991#issuecomment -472740798 Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΎΠ±ΡΡΡΠ½Π΅Π½ΠΈΠΉ.
ΠΡΠ»ΡΡΠΈΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ, Π²ΡΠ·Π²Π°Π½Π½ΡΠΉ ΡΡΡΠ»ΠΊΠΎΠΉ npm, ΡΠ²ΡΠ·Π°Π½ Ρ ΡΠ΅ΠΌ, ΡΡΠΎ ΡΠ·Π΅Π» ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΊΠ°ΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ Π² node_modules ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠΉ ΠΏΠ°ΠΏΠΊΠΈ, Π΅ΡΠ»ΠΈ ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π½Π°ΠΉΡΠΈ Π΅Π³ΠΎ Π² Π²Π°ΡΠ΅ΠΌ ΠΏΠ°ΠΊΠ΅ΡΠ΅.
Π‘Π°ΠΌΠΎΠ΅ ΠΏΡΠΎΡΡΠΎΠ΅ ΠΈ Π»ΡΡΡΠ΅Π΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΡ Π½Π°Ρ
ΠΎΠ΄ΠΈΠΌ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ, Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° (ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΈΡ
ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ²) Π²Π°ΡΠ΅Π³ΠΎ Π²Ρ
ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ°, ΡΠ°ΠΌ Π΅ΡΡΡ ΡΡΠΎ-ΡΠΎ Π²ΡΠΎΠ΄Π΅ resolve.modules
, ΡΡΠΎΠ±Ρ Π²ΡΡΡΠ½ΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΏΡΡΠΈ ΠΈ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΠΏΡΡΠ΅ΠΉ, ΠΏΠΎ ΠΊΠΎΡΠΎΡΡΠΌ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅Ρ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΊΠ°ΡΡ ΠΌΠΎΠ΄ΡΠ»ΠΈ. Exp., resolve: { modules: [path.resolve(PACKAGE_ROOT, 'node_modules'), 'node_modules'] }
, Π·Π°ΡΡΠ°Π²ΠΈΡ webpack ΡΠ½Π°ΡΠ°Π»Π° Π½Π°ΠΉΡΠΈ ΠΌΠΎΠ΄ΡΠ»ΠΈ Π² node_module ΠΊΠΎΡΠ½Π΅Π²ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ° Π²Π°ΡΠ΅Π³ΠΎ Π²Ρ
ΠΎΠ΄Π°. ΠΡΠ»ΠΈ Π½Π΅ ΡΠ΄Π°Π΅ΡΡΡ Π½Π°ΠΉΡΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ Π² ΠΊΠΎΡΠ½Π΅, Π½Π°ΠΉΠ΄ΠΈΡΠ΅ Π΅Π³ΠΎ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΉ ΠΏΠ°ΠΏΠΊΠ΅ node_modules...
ΠΡΠ°ΠΊ, Ρ Π½Π°Ρ Π΅ΡΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ React, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ΅Π΅ webpack.
ΠΡ ΠΏΡΡΠ°Π΅ΠΌΡΡ ΡΠΎΠ·Π΄Π°ΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ React, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Ρ ΡΠΊΠΈ, ΠΌΡ ΠΏΡΠΎΠ±ΠΎΠ²Π°Π»ΠΈ ΠΌΠ΅Π½ΡΡΡ ΡΠ±ΠΎΡΡΠΈΠΊΠΈ (parcel, pure babel, webpack).
ΠΡΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π½Π°ΡΠ΅ΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΌΡ ΠΏΠΎΠΌΠ΅ΡΠΈΠ»ΠΈ react ΠΈ react-dom ΠΊΠ°ΠΊ Π²Π½Π΅ΡΠ½ΠΈΠ΅, ΠΏΠΎΡΡΠΎΠΌΡ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ Π²ΠΊΠ»ΡΡΠ°ΡΡ ΠΈΡ Π² Π½Π°Ρ Π±Π°Π½Π΄Π».
ΠΡ ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠΎ ΠΆΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Ρ ΡΠΊΠΎΠ² ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΡΡΠ»ΠΊΠΈ npm.Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΡΡΠ»ΠΊΠΈ Π½Π° ΡΠ΅Π°ΠΊΡΠΈΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, Π½ΠΎ ΡΡΠΎ Π½Π΅ Π»ΡΡΡΠΈΠΉ ΡΠ°Π±ΠΎΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°.
ΠΠ½Π΅ ΡΡΡΠ΄Π½ΠΎ ΠΏΠΎΠ½ΡΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΠΏΡΠΈΡΠΈΠ½Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. Π§ΡΠΎ ΡΠΎΠ·Π΄Π°Π΅Ρ Π΄ΡΠ±Π»ΠΈΠΊΠ°Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° React?
ΠΡΠΈΠ²Π΅Ρ, Ρ ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΡΡ ΠΎΡΠΈΠ±ΠΊΡ
ΠΠ°ΡΡΡΠ΅Π½ΠΈΠ΅ ΠΈΠ½Π²Π°ΡΠΈΠ°Π½ΡΠ°: Π½Π΅Π²Π΅ΡΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² Π»ΠΎΠ²ΡΡΠΊΠΈ. Π₯ΡΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π²Π½ΡΡΡΠΈ ΡΠ΅Π»Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΡΠΈ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΡΠ»Π΅Π΄ΡΡΡΠΈΡ
ΠΏΡΠΈΡΠΈΠ½:
1. Π£ Π²Π°Ρ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π½Π΅ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ Π²Π΅ΡΡΠΈΠΈ React ΠΈ ΡΠ΅Π½Π΄Π΅ΡΠ΅ΡΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, React DOM).
2. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ Π½Π°ΡΡΡΠ°Π΅ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° Ρ
ΡΠΊΠΎΠ²
3. Π£ Π²Π°Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ React Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.
Π‘ΠΌ. https://fb.me/react-invalid-hook-call ΡΠΎΠ²Π΅ΡΡ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΡΠ»Π°ΠΆΠΈΠ²Π°ΡΡ ΠΈ ΡΡΡΡΠ°Π½ΡΡΡ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.
5 |
6 | const useApiHelper = (url, reducer) => {
> 7 | const [state, dispatch] = useReducer(reducer, {});
| ^
8 |
9 | useEffect(() => {
10 | fetch(url).then(res => res.json())
ΠΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠ΄Π° https://stackblitz.com/edit/react-mbze9q
ΠΠΎΠ³Π΄Π° Ρ ΠΏΡΡΠ°ΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π²Π½ΡΡΡΠΈ ΡΠ΅ΡΡΠΎΠ²ΡΡ ΡΠ»ΡΡΠ°Π΅Π², Ρ ΠΏΠΎΠ»ΡΡΠ°Ρ ΠΎΡΠΈΠ±ΠΊΡ Π²ΡΡΠ΅
@abhishekguru ΠΡ Π²ΡΠ·ΡΠ²Π°Π΅ΡΠ΅ Ρ ΡΠΊ Π²Π½Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Π·Π΄Π΅ΡΡ, Π² ΡΠ²ΠΎΠ΅ΠΌ ΡΠ΅ΡΡΠ΅:
test('API test', async () => {
const newState = useAPIHelper( // <- Called outside of a component
'https://jsonplaceholder.typicode.com/posts',
reducer
)
console.log(newState, 'new');
// expect(newState[samUrl].loading).toEqual(true);
});
ΠΠ°ΠΊ ΡΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΎΡΠΈΠ±ΠΊΠ΅, Ρ ΡΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ· Π΄ΡΡΠ³ΠΎΠ³ΠΎ Ρ ΡΠΊΠ° ΠΈΠ»ΠΈ ΠΈΠ· ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°. Π Π²Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΎΠ·Π΄Π°ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π΄Π»Ρ ΡΠ²ΠΎΠ΅Π³ΠΎ ΡΠ΅ΡΡΠ° ΠΈ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡΡ ΡΡΠΎΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Ρ ΡΠΊ, Π΅ΡΠ»ΠΈ Ρ ΠΎΡΠΈΡΠ΅.
ΠΠ΅ΡΡΠΎΠ²Π΅ΡΡΠ½Π°Ρ Π²ΠΈΠ»ΠΊΠ°
@abhishekguru , Π΅ΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅ΡΡΡ ΠΎΠ±ΡΠΈΠΉ Ρ
ΡΠΊ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ ΠΌΠ΅ΠΆΠ΄Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌΠΈ, ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ react-hooks-testing-library
.
import { renderHook } from 'react-hooks-testing-library'
test('API test', async () => {
const { result } = renderHook(() => useAPIHelper( // <- now called within a component
'https://jsonplaceholder.typicode.com/posts',
reducer
))
console.log(result.current, 'new');
// expect(result.current[samUrl].loading).toEqual(true);
});
Π― Ρ
ΠΎΡΠ΅Π» Π²ΠΌΠ΅ΡΠ°ΡΡΡΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Ρ Π½Π°Ρ Π±ΡΠ»ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠΎΠ»ΡΠΊΠΎ Ρ SSR. ΠΡ ΠΎΡΠΈΡΠ°Π΅ΠΌ ΡΠ·Π΅Π» require.cache
ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡΠ°ΠΉΠ»Π°. ΠΡΠΎ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ Π΄Π°Π΅Ρ Π³ΠΎΡΡΡΡΡ ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΊΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅. ΠΡΠΈΡΡΠΊΠ° ΡΠ·Π»Π° require.cache
Π²ΡΠ·ΠΎΠ²Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΠΌΠ΅ΡΡ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΡ ΠΊΠΎΠΏΠΈΡ. ΠΠΎΡ Π½Π°ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅:
Object.keys(require.cache)
.filter(key => !isSingleton(key)) // This is needed here because react cannot be deleted without causing errors
.forEach(key => {
delete require.cache[key]
})
ΠΠ°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ isSingleton
ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΏΠΈΡΠΎΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΠΌΠ΅ΡΡ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΡ ΠΊΠΎΠΏΠΈΡ. Π₯ΠΎΡΠΎΡΠΈΠΌ ΡΠΌΠΏΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΏΡΠ°Π²ΠΈΠ»ΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π»ΡΠ±ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π² peerDependencies
https://yarnpkg.com/lang/en/docs/dependency-types/#toc -peerdependencies
Π’ΠΎΠΆΠ΅ Π±ΡΠ»Π° ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΈ Ρ ΠΌΠ΅Π½Ρ
window.React1 = require('react');
require('react-dom');
window.React2 = require('react');
console.log(window.React1 === window.React2); // true
ΡΠ°ΠΊΠΆΠ΅ Π²Π΅ΡΠ½ΡΠ» true
, ΠΏΠ΅ΡΠ΅ΠΏΡΠΎΠ±ΠΎΠ²Π°Π» Π²ΡΠ΅ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ Π²Π°ΡΠΈΠ°Π½ΡΡ, Π½ΠΎ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ. ΠΠ°ΠΊΠΎΠ½Π΅Ρ Π²ΡΡΡΠ½ΠΈΠ»ΠΎΡΡ, ΡΡΠΎ:
Webpack Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΡΠ΅Π³ script Ρ bundle.js
Π² index.html
. ΠΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡΡΠ°Π»Π°ΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Ρ ΡΠ²Π½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΠ» bundle.js
Π² index.html
, ΡΡΠΎ ΡΠ°Π½ΡΡΠ΅ ΡΠ°Π±ΠΎΡΠ°Π»ΠΎ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ Π΄ΠΎ Ρ
ΡΠΊΠΎΠ².
ΠΠ»Ρ ΠΌΠ΅Π½Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΏΠΎΡΠ»Π΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ babel 7, Π½Π΅ Π±ΡΠ»ΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ
Π²Π΅ΡΡΠΈΠΉ Ρ ΡΠ΅Π°ΠΊΡΠΈΠ΅ΠΉ npm ls. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅
Β«React-hot-loader/babelΒ» ΠΈΠ· .babelrc Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΡΡΡΡΠ°Π½ΠΈΠ» ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.
Π― ΠΏΡΠΎΠ±ΠΎΠ²Π°Π» Π²ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π²ΡΡΠ΅, Π½ΠΎ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΠ» ΠΎΡΠΈΠ±ΠΊΡ.
Π ΠΊΠΎΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠΎΠ² Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ», ΡΡΠΎ ΡΡΠΎ Π±ΡΠ»ΠΎ Π²ΡΠ·Π²Π°Π½ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠΎΠΌ why-did-you-update
, ΠΈ Π΄Π»Ρ Π½Π΅Π³ΠΎ Π΅ΡΡΡ ΡΠ²ΡΠ·Π°Π½Π½Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° . ΠΡΠΎΡΡΠΎ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ° Π΄Π»Ρ ΡΠ΅Ρ
, ΠΊΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΡΠ΅Ρ React.
Π― ΡΠΌΠΎΠ³ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΡΡΠΎ Π² ΡΡΠ΅Π½Π°ΡΠΈΠΈ react-native
+ Yarn Workspaces
.
Π ΠΊΠΎΡΠ½Π΅ package.json
{
"private": true,
"workspaces": {
"packages": [
"packages/*"
],
"nohoist": [
"**/react-native",
"**/react-native/!(react)/**"
]
}
}
ΠΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Π΅Ρ ΠΏΠΎΠ΄Π½ΡΡΠΈΠ΅ ΠΊΠΎΠ΄Π° react-native
(ΡΡΠΎ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π»Ρ Π½Π°ΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ), Π² ΡΠΎ ΠΆΠ΅ Π²ΡΠ΅ΠΌΡ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Ρ react
, ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π²ΡΠ΅ ΠΎΠ±ΡΠΈΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΠΎΡΠ²Π΅Ρ.
Π metro.config.js
module.exports = {
watchFolders: [
path.resolve(__dirname, '../', 'shared-module'),
// ...more modules
path.resolve(__dirname, '../', '../') // to make sure the root `react` is also part of the haste module map
]
}
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΌΠ΅ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΏΠ°ΠΊΠΎΠ²ΡΠΈΠΊΡ Π·Π½Π°ΡΡ, Π³Π΄Π΅ ΡΡΠΎ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ.
Π― Π½Π°ΡΠ΅Π» ΡΠΏΠΎΡΠΎΠ± ΡΠ΅ΡΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π΄Π»Ρ Π»ΡΠ΄Π΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΏΠ°ΠΊΠ΅Ρ npm, ΠΈ ΠΎΠ½ΠΈ ΠΏΡΡΠ°ΡΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ, Π·Π°Π³ΡΡΠΆΠ°Ρ ΡΠ²ΠΎΠΉ ΠΏΠ°ΠΊΠ΅Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΡΠ»ΠΊΠΈ npm Π² ΠΊΠ°ΠΊΠΎΠΌ-ΡΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.
Π― ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠΈΠ»ΡΡ Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°) Π½Π° Storybook . ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ±ΠΎΡΠ½ΠΈΠΊΠ° ΡΠ°ΡΡΠΊΠ°Π·ΠΎΠ² Π² ΠΏΡΠΎΠ΅ΠΊΡΠ΅ ΠΎΠ½ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π·Π°Π³ΡΡΠΆΠ°ΡΡ React Π΄Π²Π°ΠΆΠ΄Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΎΡ ΠΆΠ΅, ΡΡΠΎ ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ. ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ npm link Ρ ΠΌΠ΅Π½Ρ Π±ΡΠ»ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ Ρ ΡΠΊΠ°ΠΌΠΈ ΠΈ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ Π·Π°Π³ΡΡΠ·ΠΊΠΎΠΉ React, ΡΠ°ΠΊΠΆΠ΅ Ρ Π½Π΅ ΡΠΌΠΎΠ³ Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ ΠΈΠ· Π²ΡΡΠ΅ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ. ΠΡΠ°ΠΊ, Storybook ΡΠ΅ΡΠΈΠ» ΠΌΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΈ ΡΠ΅ΠΏΠ΅ΡΡ Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΡΠΏΠΎΡΠΎΠ± ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΡΠ΅Π½Π°ΡΠΈΡΡ ΠΈ Π² ΡΠΎ ΠΆΠ΅ Π²ΡΠ΅ΠΌΡ ΡΠΎΠ·Π΄Π°ΡΡ Π΄Π»Ρ Π½Π΅Π³ΠΎ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ.
ΠΠΎΠ΄Π΅Π»ΠΈΠ²ΡΠΈΡΡ ΡΠ²ΠΎΠΈΠΌ ΠΎΠΏΡΡΠΎΠΌ Ρ ΡΡΠΈΠΌ, Ρ ΡΠ΅ΡΠΈΠ» ΡΡΠΎ Π΄Π»Ρ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π²Π½Π΅ΡΠ½ΠΈΠ΅ Π²Π΅Π± -ΠΏΠ°ΠΊΠ΅ΡΡ Π΄Π»Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ², ΡΡΠΎΠ±Ρ ΠΈΡΠΊΠ»ΡΡΠΈΡΡ react
ΠΈ react-dom
ΠΈΠ· ΡΠ±ΠΎΡΠΊΠΈ.
ΠΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π°ΡΠΈΠ½Π°Π΅ΠΌ Ρ React. Π ΠΌΠΎΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ Π½Π°ΡΠΈΠ½Π°Π΅ΠΌ Ρ ΠΌΠΎΠ½ΠΎΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Lerna Ρ ΠΏΠ°ΠΊΠ΅ΡΠΎΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² Neutrino ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠΌ ΠΏΠ°ΠΊΠ΅ΡΠΎΠΌ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Neutrino. ΠΠ΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΏΡΠΎΠ΄ΡΠΊΡ ΡΠ±ΠΎΡΠΊΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ
ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ². ΠΠΎΡΠ»Π΅ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ
ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ² ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ true
Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° React Ρ Π½Π°ΡΠ΅Π» ΡΠΏΠΎΡΠΎΠ± Π²ΠΎΠΎΠ±ΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠΈΡΡ react
ΠΈ react-dom
ΠΈΠ· ΡΠ±ΠΎΡΠΊΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ².
ΠΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ ΠΎΠ±ΡΡΠ½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΎΠ½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄Π»Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ°, ΠΏΠΎΡΡΠΎΠΌΡ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² Ρ Π΄ΠΎΠ±Π°Π²ΠΈΠ» Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ°:
"externals": {
"react": "react",
"react-dom": "react-dom"
}
ΠΠ½Π΅ Π½Π΅ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠΉ ΡΠ΅Π³ script Π² ΠΏΠ°ΠΊΠ΅Ρ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΄Π»Ρ react
ΠΈ react-dom
. Π― ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ, ΡΡΠΎ Webpack ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΈΡ
Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² Π² ΡΠ²ΠΎΠ΅ΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ require
ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
Π΄ΡΡΠ³ΠΎΠΉ ΠΏΡΠΈΡΠΈΠ½ΠΎΠΉ ΡΡΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½Π°Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° React Router Route
,
ΠΡΠΎ Π½Π΅ ΡΠ΄Π°Π΅ΡΡΡ :
<Route render={MyHookedComponent}/>
, Π½ΠΎ ΡΡΠΎ ΡΠ΄Π°Π΅ΡΡΡ :
<Route component={MyHookedComponent}/>
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ. Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ component
, Π° Π½Π΅ render
. ΠΡΠΎ Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠΏΡΡΡΠΈΡΡ ΠΎΡΠΈΠ±ΠΊΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ render
ΠΎΠ±ΡΡΠ½ΠΎ ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌΠΈ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΊΠ»Π°ΡΡΠΎΠ².
Π― ΡΠ°Π±ΠΎΡΠ°Π» Π½Π°Π΄ biolerplate ΠΈ Ρ
ΠΎΡΡ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π² npm, ΠΈ ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°Π» Ρ ΠΏΠΎΠΌΠΎΡΡΡ npm link . ΠΠ½ ΡΠ°Π±ΠΎΡΠ°Π» ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ, Π½ΠΎ ΡΠ΅ΡΠ΅Π· Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π½Π°ΡΠ°Π» Π²ΡΠ΄Π°Π²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ Invalid Hook call warning
.
Π― ΠΏΡΡΠ°Π»ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΡΠ»ΠΊΡ npm ../myapp/node_modules/react, Π½ΠΎ ΡΡΠΎ Π½Π΅ ΡΠ΅ΡΠ°Π΅Ρ ΠΌΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ,
Π ΡΡΠ°Π²Π½ΠΈΠ» React1 === React2
ΠΏΡΠ°Π²Π΄Π° ΠΊΠ°ΠΊ ΠΈ npm ls react
ΡΠΎΠΆΠ΅ ΡΠ΄Π΅Π»Π°Π», ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°ΠΊΠ΅Ρ.
Π Ρ ΡΠ°ΠΊΠΆΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅Ρ, Ρ ΠΏΡΠΎΡΡΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ»ΠΎΠΉ Π²Π½Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ create-react-app, ΠΏΠΎΡΡΠΎΠΌΡ Ρ Π½Π΅ ΠΌΠΎΠ³Ρ Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΡΠ²ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
ΠΠ°ΡΡΡΡΠ» Ρ Π½ΠΈΠΌ Π·Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ 3 Π΄Π½Ρ._
Π’ΠΎ ΠΆΠ΅, ΡΡΠΎ @hnagarkoti .
Π― ΠΏΠΎΠ»ΡΡΠΈΠ» ΡΡΠΎ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π° Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΡΠ΅ΡΠ²Π΅ΡΠ° (SSR), ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» Π±ΠΎΠ»Π΅Π΅ ΡΡΠ°ΡΡΡ Π²Π΅ΡΡΠΈΡ react-apollo
, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΠΎΡΡΠΎ Ρ
ΠΎΡΠ΅Π» ΠΎΡΡΠ°Π²ΠΈΡΡ ΡΡΡ ΡΡΡΠ»ΠΊΡ Π·Π΄Π΅ΡΡ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠΌΠΎΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ Π±Π΅Π΄ΠΎΠ»Π°Π³Π΅, ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΠΎΠ»ΠΊΠ½Π΅ΡΡΡ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ:
https://github.com/apollographql/react-apollo/issues/2541
ΠΠΎΡΠΎΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ, getDataFromTree
Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Ρ
ΡΠΊΠΈ ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄ΠΎ Π²Π΅ΡΡΠΈΠΈ [email protected]
.
Π£ ΠΌΠ΅Π½Ρ Π±ΡΠ»Π° ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΈ Ρ ΡΠ΅ΡΠΈΠ» Π΅Π΅, Π΄ΠΎΠ±Π°Π²ΠΈΠ²:
alias: { react: path.resolve('./node_modules/react') }
to ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ
resolve
Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΌΠΎΠ΅Π³ΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ Π±ΡΠ»Π° ΠΌΠΎΡ ΠΎΡΠΈΠ±ΠΊΠ°, ΠΊΠΎΠ³Π΄Π° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» Π΄Π²Π΅ ΠΊΠΎΠΏΠΈΠΈ React, Π½ΠΎ Ρ ΡΠΎΠ³Π»Π°ΡΠ΅Π½, ΡΡΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π·Π΄ΠΎΡΠΎΠ²ΠΎ, Π΅ΡΠ»ΠΈ Π±Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ Π±ΡΠ»ΠΎ Π»ΡΡΡΠ΅. Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΡ ΠΎΠΆΠ΅ Π½Π°: # 2402
ΠΡΠ±ΡΠ΅ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ create-ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ?
^ Π₯ΠΎΡΠΎΡΠΎ, ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Ρ Π²ΡΠ±ΡΠ°Π», ΡΡΠΎΠ±Ρ ΡΠ΅ΡΠΈΡΡ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π΄Π»Ρ create-react-app, ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ react-app-rewired ΠΈ custom-cra.
ΠΠΎΡ ΠΌΠΎΠΉ config-overrides.js:
const {
override,
addWebpackAlias,
} = require("customize-cra");
const path = require('path');
module.exports = override(
addWebpackAlias({
react: path.resolve('./node_modules/react')
})
)
ΠΡΠΈΠΌΠ΅Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ°: https://github.com/dwjohnston/material-ui-hooks-issue/tree/master
Π Π½Π°ΡΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ Ρ Π½Π°Ρ Π΅ΡΡΡ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΠΉ Π½Π°Π²ΠΈΠ³Π°ΡΠΈΠΎΠ½Π½ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ, ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠΉ Ρ Π΄Π΅ΡΡΡΠΊΠ°ΠΌΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π²ΡΠ΅ ΡΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΡΡ ΠΎΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ 15.0.0 Π΄ΠΎ ΡΠ΅Π°ΠΊΡΠΈΠΈ 16.8.0, ΡΡΠΎΠ±Ρ Π²ΠΊΠ»ΡΡΠΈΡΡ Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡ, ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΡ Π²ΡΡΠ΅ Ρ ΡΠΊΠΎΠ², ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ²ΡΠ·Π°ΡΡ Π΅Π΅ Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ ΡΠ΅Π°ΠΊΡΠΈΠ΅ΠΉ
Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π½Π°Π»ΠΈΡΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² ΡΠ΅Π°ΠΊΡΠΈΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ Π΄Π»Ρ Π½Π°Ρ ΡΡΠ½Π΄Π°ΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΡΠΌ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, Ρ Ρ ΠΎΡΠ΅Π» Π±Ρ Π·Π½Π°ΡΡ, Π³ΠΎΡΠΎΠ²Π° Π»ΠΈ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅ΡΠΈΡΡ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ?
@dwjohnston ΠΌΠΎΠΉ ΠΎΠ±Ρ
ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡΡΡ Π΄Π»Ρ create-react-app
ΡΠΎΡΡΠΎΡΠ» Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ. create-react-app
Π²Π½ΡΡΡΠ΅Π½Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ webpack, webpack-dev-server ΠΈ babel-loader, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ webpack ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Π±ΡΠ»ΠΎ Π½Π΅ ΡΠ°ΠΊ ΡΠΆ ΠΈ ΠΏΠ»ΠΎΡ
ΠΎ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΡΠΆΠ΅ Π½Π΅ΡΠ²Π½ΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ, Π½ΠΎ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎ Π½Π°ΠΊΠ»Π°Π΄Π½ΡΡ
ΡΠ°ΡΡ
ΠΎΠ΄ΠΎΠ². ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ.
Π£ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ create-react-app
: https://github.com/facebook/create-react-app/issues/6953 , ΡΡΠΎΠ±Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° alias
ΠΈΠ»ΠΈ ΡΡΠΎ-ΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅.
π ΠΡΠ»ΠΈ ΠΊΡΠΎ-ΡΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ create-react-app
ΠΈ ΠΈΡΠΏΡΡΡΠ²Π°Π΅Ρ ΡΡΡ Π±ΠΎΠ»Ρ, Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ Π²Ρ ΠΏΠΎΡΡΠ°Π²ΠΈΡΡ Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΏΠ°Π»Π΅Ρ Π²Π²Π΅ΡΡ
ΠΏΠΎ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ΅?
@ricokahler - Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ, ΡΡΠΎ ΡΠΊΠ°Π·Π°Π»ΠΈ Π½Π° ΡΡΠΎ. Π― ΡΠ°Π΄ Π²ΠΈΠ΄Π΅ΡΡ, ΡΡΠΎ Ρ Π½Π΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ - Ρ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ Ρ Π½Π΅ΠΉ ΠΈ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅.
ΠΡΡΡ Π»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠ΅ Π²Π°ΠΌ ΡΠ΅ΡΡΡΡΡ, Π½Π° ΠΊΠΎΡΠΎΡΡΡ ΠΎΠ±ΡΡΠΆΠ΄Π°Π΅ΡΡΡ ΡΡΠΎΡ Π²ΠΎΠΏΡΠΎΡ?
ΠΡΠ»ΠΈ Π²Ρ Π² ΠΌΠΎΠ΅ΠΉ Π»ΠΎΠ΄ΠΊΠ΅, Π²Ρ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΏΠ°ΠΊΠ΅Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΡΠ΅Π°ΠΊΡΠΈΠΈ ΠΈΠ· Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°, ΠΈ ΡΠ΅ΠΏΠ΅ΡΡ ΠΎΠ½ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠΎΠ±ΠΈΡΠ°Π΅Ρ ΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π΅Π³ΠΎ Π²ΠΌΠ΅ΡΡΠ΅ ΡΠΎ ΡΠ²ΠΎΠ΅ΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠ΅ΠΉ node_modules (ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΡΠ»ΠΊΠ° npm), ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 2 ΠΊΠΎΠΏΠΈΠΈ ΠΈΠ»ΠΈ React now.
Π― ΡΠ°Π±ΠΎΡΠ°Π» Π½Π°Π΄ ΡΡΠΈΠΌ, ΡΠ΄Π°Π»ΠΈΠ² node_modules/
"prestart": "rimraf ./node_modules/<my_package>/node_modules"
Π― ΡΠ°ΠΊΠΆΠ΅ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ Ρ ΡΡΠΈΠΌ, ΠΊΠΎΠ³Π΄Π° Π΄Π΅Π»Π°Π» SSR.
ΠΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ Lerna Π΄Π»Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²Π°ΡΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ React, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Β«react/react-dom/react-routerΒ» Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ peerDependencies Π² Π²Π°ΡΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅, Π½ΠΎ Π²Ρ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΠΈΡ
Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ devDependencies. (ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ Π΅Π³ΠΎ Π΄ΡΠ±Π»ΠΈΡΡΡΡΠΈΠΌ)
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ node --preserve-symlinks
, ΡΡΠΎΠ±Ρ ΠΎΠ½ ΠΌΠΎΠ³ ΠΈΡΠΊΠ°ΡΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΡΠ΅ΠΏΠΎ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ peerDependencies.
ΠΠ»Ρ ΡΡΡΠΊΠΈ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΡΡΡ ΠΊ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠΌΡ ΡΠ΅ΠΏΠΎ Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Β«jest.moduleDirectoriesΒ», ΡΡΠΎΠ±Ρ Jest ΠΌΠΎΠ³ ΠΈΡ
ΡΠ°Π·ΡΠ΅ΡΠΈΡΡ.
@apieceofbart Ρ ΠΌΠ΅Π½Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΡΠΏΠ°ΡΠΈΠ±ΠΎ!
Π― ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ Ρ ΡΡΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ ΠΏΡΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠ΅ Π²Π½Π΅ΡΠ½ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² React, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Ρ ΠΌΠΎΠ΄ΡΠ»ΡΠΌΠΈ JS. ΠΠ½ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π²Π½Π΅ ΠΏΡΠΎΠ΅ΠΊΡΠ°, Π·Π°Π³ΡΡΠΆΠ°ΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΈΠΌΠΏΠΎΡΡΠ° () (Π½Ρ, jsonp Π΄Π»Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ). Π§ΡΠΎΠ±Ρ ΠΎΠ±ΠΎΠΉΡΠΈ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ/Π²Π½Π΅Π΄ΡΡΠ΅ΠΌ React ΠΊΠ°ΠΊ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ Π² ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ. ΠΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, Π½ΠΎ ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅Π³ΠΎ Π΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ React. ΠΡ ΠΏΡΡΠ°Π΅ΠΌΡΡ ΡΠ΄Π°Π»ΠΈΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ.
ΠΠ°ΠΊ ΡΠΆΠ΅ ΡΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡ, ΡΡΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΠΈΡΠΊΠ»ΡΡΠ°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ React Π΄Π»Ρ Π»ΡΠ±ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° ΠΌΠΈΠΊΡΠΎΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°. ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΏΠΎΠ±ΠΎΡΠ½ΡΠΉ ΡΡΡΠ΅ΠΊΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π² ΡΡΠ΅Π΄Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ JS ΠΏΡΠΈ ΠΈΠΌΠΏΠΎΡΡΠ΅ React Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ.
Π― ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ, ΡΡΠΎ Π΄Π»Ρ ΠΏΡΠΎΡΡΡΡ ΡΠ»ΡΡΠ°Π΅Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠΎΡ ΠΏΠΎΠ±ΠΎΡΠ½ΡΠΉ ΡΡΡΠ΅ΠΊΡ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ React Β«ΠΏΡΠΎΡΠ΅ Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈΒ». ΠΠΎ ΠΊΠΎΠ³Π΄Π° Π²Π΅Π±-ΡΡΡΠ°Π½ΠΈΡΠ° ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π² ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠ°Π³ΠΎΠ² ΠΏΠ°ΠΊΠ΅ΡΠ°, ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π½Π°ΡΡΡΠΎΠΈΡΡ React (Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΡΠΎΡ ΠΏΠΎΠ±ΠΎΡΠ½ΡΠΉ ΡΡΡΠ΅ΠΊΡ ΡΠ²Π½ΠΎ), Π° Π΄ΡΡΠ³ΠΈΠ΅ ΠΌΠΎΠ³ΡΡ ΠΏΡΠΎΡΡΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ.
Π£ ΠΌΠ΅Π½Ρ Π²ΡΠ΅ Π΅ΡΠ΅ Π΅ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ react-bootstrap: # https://github.com/react-bootstrap/react-bootstrap/issues/3965
ΠΠ»Ρ ΡΠ΅Ρ , ΠΊΡΠΎ Π·Π°ΡΡΡΡΠ», ΠΏΡΡΠ°ΡΡΡ ΡΠΎΠ·Π΄Π°ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Π΄Π»Ρ React, ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ https://github.com/whitecolor/yalc , ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π»ΡΡΡΠ΅, ΡΠ΅ΠΌ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΡΡΠ»ΠΊΠΈ.
@mpeyper ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΠΎΡΠΎΡΠΎ. Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ
@apieceofbart ΠΡΠΎ ΡΡΠ°Π±ΠΎΡΠ°Π»ΠΎ Π΄Π»Ρ ΠΌΠ΅Π½Ρ. Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅. π
ΠΠ»Ρ ΠΌΠ΅Π½Ρ ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π°, ΠΊΠΎΠ³Π΄Π° Ρ ΠΏΠ΅ΡΠ΅ΡΠ΅Π» Π² ΠΊΠ°ΡΠ°Π»ΠΎΠ³ ΡΠ²ΠΎΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π² PowerShell ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» ΠΈΠΌΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° Π² ΠΏΡΡΠΈ Ρ Π·Π°Π³Π»Π°Π²Π½ΠΎΠΉ Π±ΡΠΊΠ²Ρ. Π― ΡΠΎΠ·Π΄Π°Π» ΠΏΡΠΎΠ΅ΠΊΡ Π² users/β¦/β¦ Π²ΠΌΠ΅ΡΡΠΎ Users/β¦/β¦
ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π±ΡΠ»Π° ΡΠ΅ΡΠ΅Π½Π°, ΠΊΠΎΠ³Π΄Π° Ρ ΠΈΡΠΏΡΠ°Π²ΠΈΠ» ΠΎΡΠΈΠ±ΠΊΠΈ ΠΊΠ°ΠΏΠΈΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ Π²ΠΎΡΡΠΎΠ·Π΄Π°Π» ΠΏΡΠΎΠ΅ΠΊΡ.
ΠΠ»Ρ ΠΌΠ΅Π½Ρ Π΄Π΅Π»Π°ΡΡ:
"react": "file:../my-library/node_modules/react",
"react-dom": "file:../my-library/node_modules/react-dom",
ΠΡΠΏΡΠ°Π²Π»Π΅Π½Π° ββΠ±ΠΎΠ»ΡΡΠ°Ρ ΡΠ°ΡΡΡ ΡΡΠΎΠ³ΠΎ, Π½ΠΎ ΡΡΠΎΠ³ΠΎ Π±ΡΠ»ΠΎ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ, Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π» ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΎΡΠΈΠ±ΠΊΡ hooks can only be called inside the body of a function component
.
ΠΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ, ΡΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»ΠΎ ΠΈΠ·-Π·Π° ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΌΠΎΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π»ΠΈΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
export default Radium(withTranslation()(MyComponent))
:ΠΠΊΡ:
ΠΠ΄Π΅ withTranslation
β HOC ΠΈΠ· react-i18next, Π° Radium
β HOC ΠΈΠ· Radium.
Π ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡ ΡΠ°ΠΊ:
export default withTranslation()(Radium(MyComponent))
:heavy_check_mark:
ΠΡΠ΅ ΠΈΡΠΏΡΠ°Π²ΠΈΠ».
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ react-i18next Π±ΡΠ» Π² Π²Π΅ΡΡΠΈΠΈ 10, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ React Hooks.
@mikeaustin Π£ Π½Π°Ρ ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°. Π£ Π²Π°Ρ Π΅ΡΡΡ ΠΏΡΠΈΠΌΠ΅Ρ Β«ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ/Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ React ΠΊΠ°ΠΊ ΡΠ²ΠΎΠΉΡΡΠ²Π° Π² ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΌΠΎΠ΄ΡΠ»ΡΒ»?
ΠΡΠ΅ Π΅ΡΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΏΠ΅ΡΠ΅ΠΏΡΠΎΠ±ΠΎΠ²Π°Π» Π²ΡΠ΅ ΡΠ°Π³ΠΈ:
ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ Π²Π΅ΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΠΏΠΎΠ²Π»ΠΈΡΡΡ:
$ npm ls react-dom
/xxx
βββ [email protected]
$ npm ls react
/xxx
βββ [email protected]
ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΉ ΠΏΠ°ΠΊΠ΅Ρ.json
{
...
"workspaces": [
"packages/*",
],
"devDependencies": {
...
},
"dependencies": {
"react": "16.8.6",
"react-dom": "16.8.6"
},
"resolutions": {
"react": "16.8.6",
"react-dom": "16.8.6",
"**/react": "16.8.6",
"**/react-dom": "16.8.6"
}
}
@JeremyGrieshop Π£ ΠΌΠ΅Π½Ρ Π±ΡΠ»Π° ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΈ ΡΡΠΎ ΡΡΠ°Π±ΠΎΡΠ°Π»ΠΎ Π΄Π»Ρ ΠΌΠ΅Π½Ρ, ΡΠΏΠ°ΡΠΈΠ±ΠΎ.
ΠΠΎΠ±Π°Π²ΡΡΠ΅ Β«prestartΒ» Π² Π²Π°Ρ package.json, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:
"scripts": {
"prestart": "rimraf ./node_modules/<my package>/node_modules",
"start": "react-scripts start",
"build": "react-scripts build",
},
Π£ ΠΌΠ΅Π½Ρ Π±ΡΠ»Π° ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΈ ΡΡΠΎ Π±ΡΠ»ΠΎ Π½Π΅ ΠΈΠ·-Π·Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
Π²Π΅ΡΡΠΈΠΉ ΡΠ΅Π°ΠΊΡΠΈΠΈ / ΡΠ΅Π°ΠΊΡΠΈΠΈ-Π΄ΠΎΠΌΠ°.
Π ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ
ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°Ρ
, ΠΊΠΎΡΠΎΡΡΠ΅ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ, ΠΊΠ΅Ρ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΎΡΠΈΡΠ°Π»ΡΡ (Π΄Π»Ρ ΡΠ΅Π»Π΅ΠΉ, Π²ΡΡ
ΠΎΠ΄ΡΡΠΈΡ
Π·Π° ΡΠ°ΠΌΠΊΠΈ ΡΡΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΡ), Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
Object.keys(require.cache).forEach((key) => {
delete require.cache[key];
});
ΠΡΠ°ΠΊ, ΠΊ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ Π»ΡΠ΄Π΅ΠΉ, Π΅ΡΠ»ΠΈ Π²Ρ Π΄Π΅Π»Π°Π΅ΡΠ΅ ΡΡΠΎ-ΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ - ΡΡΠΎ ΠΏΠΎΠ²Π»ΠΈΡΠ΅Ρ Π½Π° React Hooks, ΠΏΠΎΡΡΠΎΠΌΡ ΠΈΠ·Π±Π΅Π³Π°ΠΉΡΠ΅ ΡΡΠΎΠ³ΠΎ, Π΅ΡΠ»ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅.
Π£ ΠΌΠ΅Π½Ρ Π±ΡΠ»Π° ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΈ Ρ ΡΠ΅ΡΠΈΠ» Π΅Π΅, Π΄ΠΎΠ±Π°Π²ΠΈΠ²:
alias: { react: path.resolve('./node_modules/react') }
to ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ
resolve
Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΌΠΎΠ΅Π³ΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ Π±ΡΠ»Π° ΠΌΠΎΡ ΠΎΡΠΈΠ±ΠΊΠ°, ΠΊΠΎΠ³Π΄Π° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» Π΄Π²Π΅ ΠΊΠΎΠΏΠΈΠΈ React, Π½ΠΎ Ρ ΡΠΎΠ³Π»Π°ΡΠ΅Π½, ΡΡΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π·Π΄ΠΎΡΠΎΠ²ΠΎ, Π΅ΡΠ»ΠΈ Π±Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ Π±ΡΠ»ΠΎ Π»ΡΡΡΠ΅. Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΡ ΠΎΠΆΠ΅ Π½Π°: # 2402
ΠΠ»Ρ ΡΠ΅Ρ
, ΠΊΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Parcel, Π΅ΡΠ»ΠΈ dist
Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ ΡΠ°ΠΌ, Π³Π΄Π΅ Π½Π°Ρ
ΠΎΠ΄ΡΡΡΡ Π²Π°ΡΠΈ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ, Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ:
"alias": {
"react-mediator": "./dist"
},
ΠΠ° Π²Π°Ρ package.json
, Π° Π·Π°ΡΠ΅ΠΌ Π²Ρ Π²ΡΠ΅ Π΅ΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ link
(npm ΠΈΠ»ΠΈ yarn) Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Π΄Π»Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ/ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
@mikeaustin Π£ Π½Π°Ρ ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°. Π£ Π²Π°Ρ Π΅ΡΡΡ ΠΏΡΠΈΠΌΠ΅Ρ Β«ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ/Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ React ΠΊΠ°ΠΊ ΡΠ²ΠΎΠΉΡΡΠ²Π° Π² ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΌΠΎΠ΄ΡΠ»ΡΒ»?
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ React Context, ΡΡΠΎΠ±Ρ ΠΎΠ±ΠΎΠΉΡΠΈ ΡΠ°ΠΌ Β«ReactΒ», ΠΈ ΡΠΎΠ·Π΄Π°ΡΡ HoC Π΄Π»Ρ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ ΡΠ²ΠΎΠΉΡΡΠ²Π° Π² ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΡΠΎ ΡΠ³ΠΎΠ΄Π½ΠΎ Π² API, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, api.React, Π½ΠΎ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ»ΠΎΠΆΠ½Π΅Π΅ ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°ΡΡ HoC Π²ΠΎΠΊΡΡΠ³ ΡΡΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² (ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ΅ΠΏΠ΅ΡΡ ΠΎΠ½ΠΈ Π΄ΠΎΡΡΡΠΏΠ½Ρ ΡΠΎΠ»ΡΠΊΠΎ Π²Π½ΡΡΡΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°, Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½Ρ Π΄Π»Ρ ΡΠΊΡΠΏΠΎΡΡΠ°.
const withReact = Component = props => (
<ReactContext.Provider value={api => <Component api={api} {...props} /> } />
)
Π― ΡΡΠ°ΡΡ Π½Π° ΡΡΠΎ ΠΏΠ°ΡΡ ΡΠ°ΡΠΎΠ², Π΅ΡΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄, ΡΡΠΎΠ±Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² Π½Π΅Π³ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, Π½Π΅ΠΏΡΠΎΡΡΠΎ, ΠΈ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π±ΠΎΠ»ΡΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ ΡΡΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ ,
_p.s: Ρ ΡΠ΅Π°ΠΊΡΠΈΠΈ ΠΎΡΠ»ΠΈΡΠ½Π°Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ, Π½ΠΎ Ρ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΡΠ° ΡΡΡΠ°Π½ΠΈΡΠ° Π½ΡΠΆΠ΄Π°Π΅ΡΡΡ Π² ΠΏΡΠΎΠ²Π΅ΡΠΊΠ΅._
@ΠΠ»ΠΈΠ²Π΅ΡΠ Π°Π΄ΠΈΠ½ΠΈ
Π― ΡΠΌΠΎΠ³ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΡΡΠΎ, ΠΎΠ±Π½ΠΎΠ²ΠΈΠ²
react-hot-loader
Π΄ΠΎ^4.6.0
ΠΠ°Π°Π°Π½, ΡΡΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΡΡΠΎ.
@gaearon @theKashey ΠΠ°ΠΊ Π½Π°ΡΡΠ΅Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΡΠΎ Π½Π° https://reactjs.org/warnings/invalid-hook-call-warning.html , ΡΡΠΎΠ±Ρ Π»ΡΠ΄ΠΈ Π½Π΅ ΡΡΠ°ΡΠΈΠ»ΠΈ ΡΠ²ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π²ΠΏΡΡΡΡΡ ΠΈΠ·-Π·Π° Π±ΠΎΠ»Π΅Π΅ ΡΡΠ°ΡΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ react-hot-loader
?
Π― Π΄ΡΠΌΠ°Π», ΡΡΠΎ ΡΡΠΎ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Ρ ΠΎΡΠΎΡΠΎ Π·Π°Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½ΠΎ ΡΠΆΠ΅ Π² Π΄ΡΠΆΠΈΠ½Π΅ Π²ΡΠΏΡΡΠΊΠΎΠ².
ΠΡΠΈΠ²Π΅Ρ, Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ React ΠΊΠ°ΠΊ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΡΠ°ΠΊ ΠΈ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ . Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Π²Π½ΡΡΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠ½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ Π΄Π²ΡΠΌΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°ΠΌΠΈ ΡΠ΅Π°ΠΊΡΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ:
Π ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ :
alias: { react: path.resolve( '__dirname', '..', 'node_modules', 'react' ) // Adapt this to match your file tree
Π ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ
externals: {
react: 'react', // Case matters here
'react-dom': 'react-dom' // Case matters here
}
ΠΡΠ°ΠΊ, Ρ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ Π²ΡΠ·ΠΎΠ²Π° Ρ ΡΠΊΠΎΠ² ΠΈΠ· Π½Π΅ΡΡΠ°Π½ΡΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° (*.js):
index.js
:
import ReactDOM from 'react-dom';
import './index.css';
import App from './app';
ReactDOM.render(App(), document.getElementById('root'));
app.jsx
import React from 'react';
import { BrowserRouter as Router, Route, Link } from 'react-router-dom';
const BaseContext = React.createContext();
const initialState = {
woo: true
};
const reducer = (state, action) => {
switch (action.type) {
default:
return state;
}
};
const Home = () => <h1>You're at home.</h1>;
const App = () => {
// eslint-disable-next-line
const [state, dispatch] = React.useReducer(reducer, initialState);
return (
<Router>
<BaseContext.Provider value={initialState}>
<BaseContext.Consumer>
<div className="welcome">
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
</ul>
</nav>
<header className="header">
<h1>Welcome!</h1>
</header>
<Route path="/" exact component={Home} />
</div>
</BaseContext.Consumer>
</BaseContext.Provider>
</Router>
);
};
export default App;
ΠΡΠ±ΠΎΠΉ ΡΠΎΠ²Π΅Ρ, Π΅ΡΠ»ΠΈ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡΡ, ΡΡΠΎ ΡΡΠΎ Π½Π΅ Β«ΠΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΡΡ Π΅Π³ΠΎ Π² ΡΠ°ΠΉΠ» JSX ΠΈ ΠΏΠ΅ΡΠ΅Π½Π΅ΡΡΠΈΒ»?
ΠΠ°ΠΆΠ΅ΡΡΡ, Ρ ΠΌΠ΅Π½Ρ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠΌΠ΅ΡΡ ΡΡΠΈΠΌΡΠ»Π° ΠΈ ΡΠ΅Π°ΠΊΡΠΈΠΈ, Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ Π³ΠΈΠ±ΡΠΈΠ΄Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ Π½Π°ΡΠ°Π» ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Ρ ΡΠΊΠΈ, ΠΈ ΠΎΠ½ΠΎ ΠΏΠΎΡΠ΅ΡΠΏΠ΅Π»ΠΎ Π½Π΅ΡΠ΄Π°ΡΡ, ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ Ρ Π½Π°ΡΠ°Π» Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΡΡΡΠ±ΠΎΡΡΡΠ»ΠΊΠΈ :(
Π Π΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ: Π½Π° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Ρ ΡΠ΅ΡΠΈΠ» ΡΠ²ΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² data-turbolinks-track="reload" data-turbolinks-eval="false"
Π² ΡΠ΅Π³ΠΈ ΡΡΠ΅Π½Π°ΡΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ, ΡΠ°ΠΊ ΡΡΠΎ ΡΡΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ ΡΠ΅ΠΉΡΠ°Ρ
Ρ ΠΌΠ΅Π½Ρ ΡΠΎΡ ΠΆΠ΅ Π²ΠΎΠΏΡΠΎΡ, ΡΠ΅ΡΠ΅Π· 4 ΡΠ°ΡΠ° Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ», ΡΡΠΎ ΡΡΠΈΠ»ΠΈΡΠ° jenkins ΠΎΡΡΡΡΡΡΠ²ΠΎΠ²Π°Π»Π° Π΄Π»Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² .babelrc Π½Π° ΡΠ΅ΡΠ²Π΅Ργγγ
ΠΠΎΡΠ΅ΠΌΡ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΡ?
$ npm ls react
[email protected] /mnt/g/development/javascript/pow-vehmain
βββ [email protected]`
Invalid hook call...
ServiceVisitMaintenance
src/components/ServiceVisit/ServiceVisitMaintenance.js:6
3 | import { ServiceVisitForm } from './ServiceVisitForm';
4 |
5 | const data = [{ id: 1, description: 'Ford' }, { id: 10, description: 'Edsel' }];
> 6 | const ServiceVisitMaintenance = () => {
7 | const [vehicleList, setVehicleList] = useState([]);
8 | return (
9 | <div>
ServiceVisitMaintenance.js:
import React, { useState } from 'react';
import { ServiceVisitForm } from './ServiceVisitForm';
const data = [{ id: 1, description: 'Ford' }, { id: 10, description: 'Edsel' }];
const ServiceVisitMaintenance = () => {
const [vehicleList, setVehicleList] = useState([]);
return (
<div>
<ServiceVisitForm vehicleList={data} />
</div>
);
};
export { ServiceVisitMaintenance };
ΠΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅, ΠΊΠ°ΠΊΠ°Ρ Ρ Π²Π°Ρ Π²Π΅ΡΡΠΈΡ react-dom.
$ npm ls ΡΠ΅Π°ΠΊΡΠΈΡ-Π΄ΠΎΠΌ
[email protected] /mnt/g/development/javascript/pow-vehmain
βββ ΡΠ΅Π°ΠΊΡΠΈΡ-Π΄ΠΎΠΌ@16.8.6
Π― ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ Ρ ΡΡΠΈΠΌ, ΠΊΠΎΠ³Π΄Π° ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π» ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ (mapStateToProps) (MyComponent) ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» ΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Π² ΡΠ²ΠΎΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ CRA.
ΠΠ΅Ρ, ΡΡΠΎ Π±ΡΠ»Π° ΠΌΠΎΡ Π³ΡΡΠ±Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ°. ΠΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠ·ΡΠ²Π°Π»Π° ΡΡΠΎ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»Π° react-router-dom ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»Π° ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π°, Π° Π½Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ.
Π£ ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΈΠ· Π²Π°Ρ Π±ΡΠ»Π° ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, Π½ΠΎ Ρ ΠΡΡΡΠ±ΠΈ?
Π― ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ Β«ΡΠ΅Π°Π³ΠΈΡΡΡ Π½Π° npm lsΒ»:
ΠΈ Β«npm ls react-domΒ»
Π‘Π½Π°ΡΠ°Π»Π° Ρ ΠΏΠΎΠ΄ΡΠΌΠ°Π», ΡΡΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ» ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎ, ΠΏΠΎΡΠ»Π΅ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΎΡΡ. ΠΠ°ΡΠ΅ΠΌ Ρ ΠΏΠΎΠΏΡΡΠ°Π»ΡΡ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ Π½ΠΎΠ²ΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ Π² Π΄ΡΡΠ³ΠΎΠΌ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅, 'gatsby new random-name', ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΠΊΡΠΎΡΠ΅ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ (Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ, ΡΠ»Π΅Π΄ΡΡ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅ https://www.youtube.com/watch?v=asrdFuAxPaU&feature=youtu). .be) Π² gatsby-starter-default, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, Π±ΡΠ΄Π΅Ρ Π»ΠΈ ΠΎΡΠΈΠ±ΠΊΠ° Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡΡ ΡΠ°ΠΌΠ° ΡΠΎΠ±ΠΎΠΉ. Π§ΡΠΎ ΠΆ, ΠΊ ΠΌΠΎΠ΅ΠΌΡ ΠΎΠ³ΠΎΡΡΠ΅Π½ΠΈΡ, ΡΠ°ΠΊ ΠΎΠ½ΠΎ ΠΈ Π±ΡΠ»ΠΎ!
ΠΡΠ±ΠΎΠΉ ΡΠΎΠ²Π΅Ρ Π±ΡΠ΄Π΅Ρ Ρ ΠΎΡΠΎΡΠΎ Π²ΠΎΡΠΏΡΠΈΠ½ΡΡ ΡΠ°Π·ΠΎΡΠ°ΡΠΎΠ²Π°Π½Π½ΡΠΌ ΠΏΠ»Π΅Π±Π΅Π΅ΠΌ.
Π― Π²ΡΠ΅ Π΅ΡΠ΅ ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ Π² ΡΠ±ΠΎΡΠ½ΠΈΠΊΠ΅ ΡΠ°ΡΡΠΊΠ°Π·ΠΎΠ². Π―Π²Π»ΡΠ΅ΡΡΡ Π»ΠΈ ΡΡΠΎΡ Π²ΡΠ²ΠΎΠ΄ ΠΈΠ· npm ls ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΌ ΠΈΠ»ΠΈ Π½Π΅Ρ?
Π ΠΌΠΎΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π±ΡΠ»Π° Π²ΡΠ·Π²Π°Π½Π° ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ why-did-you-update
.
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠ°Π±ΠΎΡΡΡ ΠΎΠ±Π»Π°ΡΡΡ ΠΈ ΠΌΠΎΠ½ΠΎΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ lerna ΠΈ ΠΏΠΎΠ΄Π½ΠΈΠΌΠΈΡΠ΅ ΠΏΠ°ΠΊΠ΅Ρ. ΡΡΠΎ ΡΠ΅ΡΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.
Ρ Π½Π°Ρ ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ SSR. ΠΏΠΎΡ
ΠΎΠΆΠ΅, ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ² externals: [βreactβ]
Π² Π½Π°ΡΠ΅ΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ°, Π° Π·Π°ΡΠ΅ΠΌ Π²ΡΡΡΠ½ΡΡ Π·Π°Π³ΡΡΠ·ΠΈΠ² react/umd/react.development.js
. ΡΡΠΎ Π±ΠΎΠ»Ρ, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΈ Ρ
ΠΎΡΠ΅Π»ΠΎΡΡ Π±Ρ Π½Π°ΠΉΡΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΏΠΎΡΠΎΠ±.
Π₯ΠΎΡΠΎΡΠΎ, Π½Π°Π΄Π΅ΡΡΡ, ΡΡΠΎ ΠΊΠΎΠΌΡ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ. ΠΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ Π·Π°Π³ΡΡΠΆΠ°Π»ΠΈ webpack runtime.js, ΡΡΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΎ ΠΊ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΊΠΎΠΏΠΈΠΉ React. Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π²Ρ Π·Π°Π³ΡΡΠΆΠ°Π΅ΡΠ΅ runtimeChunk (runtime.js) ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·.
ΠΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ ΡΠ΅ΡΡΠ°ΠΌΠΈ Jest, ΠΊΠ°ΠΊ Ρ ΠΌΠ΅Π½Ρ, ΡΡΠΎ ΡΠΎ, ΡΡΠΎ, ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΡΠ΅ΡΠ°Π΅Ρ Π΅Π΅ Π΄Π»Ρ ΠΌΠ΅Π½Ρ.
ΠΠΎΠ±Π°Π²ΡΡΠ΅ ΡΡΠΎ Π² ΡΠ²ΠΎΠΉ jest.config.js
moduleNameMapper: {
'^react$': '<rootDir>/node_modules/react/'
}
ΠΡΠ»ΠΎ Π±Ρ Π½Π΅ΠΏΠ»ΠΎΡ ΠΎ, Π΅ΡΠ»ΠΈ Π±Ρ ΡΡΠ° ΠΎΡΠΈΠ±ΠΊΠ° Ρ ΠΎΡΡ Π±Ρ ΡΠΊΠ°Π·ΡΠ²Π°Π»Π° Π½Π° ΡΠ°ΠΉΠ», Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΠ½Π° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ. Π― ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ Π²ΡΠ·Π²Π°Π» Ρ ΡΠΊ Π² ΠΎΠ±ΡΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΈ Π΅Π³ΠΎ Π±ΡΠ»ΠΎ ΡΡΡΠ΄Π½ΠΎ ΠΎΡΠ»Π°ΠΆΠΈΠ²Π°ΡΡ.
Π― Π½Π°ΡΠ΅Π» Π΄ΡΡΠ³ΡΡ ΠΏΡΠΈΡΠΈΠ½Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ Π½Π΅Π΅.
ΠΠΎΡ ΡΡΠ΅Π΄Π° electron
ΠΈ webpack
, Π½ΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΌΠΎΡΡ ΠΈ Π»ΡΠ΄ΡΠΌ, Π½Π΅ ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠΌ Ρ ΡΠ»Π΅ΠΊΡΡΠΎΠ½ΠΈΠΊΠΎΠΉ. Π― ΠΏΡΠΎΠ²Π΅Π» ΠΌΡΡΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π΄Π½ΠΈ, ΠΏΡΡΠ°ΡΡΡ ΡΠ΅ΡΠΈΡΡ, ΠΏΠΎΡΠ΅ΠΌΡ Ρ ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΡΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ ΠΏΠΎΡΠ»Π΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π΄ΠΎ React 16.9 (ΠΈ React DOM 16.9).
Π ΠΌΠΎΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Ρ ΠΌΠ΅Π½Ρ Π±ΡΠ»ΠΎ Π΄Π²Π° React Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, Π½ΠΎ Ρ Π½Π΅ ΡΠΌΠΎΠ³ Π½Π°ΠΉΡΠΈ Π΄Π²Π΅ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π² node_modules, Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ npm ls react
. Π― Π΄Π°ΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» webpack-bundle-analyzer
, ΡΡΠΎΠ±Ρ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, ΡΡΠΎ Π²Π½ΡΡΡΠΈ ΠΏΠ°ΠΊΠ΅ΡΠ°.
Π ΠΊΠΎΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠΎΠ² Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ», ΡΡΠΎ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈ Ρ ΠΌΠ΅Π½Ρ Π½Π΅Ρ Π΄Π²ΡΡ
ΡΠ΅Π°ΠΊΡΠΈΠΉ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ΅, Π½ΠΎ React ΠΈ React DOM Π΄Π²Π°ΠΆΠ΄Ρ ΡΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΈΡΡ/Π·Π°Π³ΡΡΠΆΠ°Π»ΠΈΡΡ Π² ΡΠ°ΠΉΠ»Π΅ HTML . ΠΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, Π΄ΠΎΠ±Π°Π²ΠΈΠ², Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, console.log("React load")
Π² index.js Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ React.
ΠΠ°ΡΡΠΎΡΡΠΈΠΉ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ Π±ΡΠ» ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ ΠΊ electron-webpack
. react ΠΈ react-dom Π½Π΅ Π±ΡΠ»ΠΈ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Ρ ΠΊΠ°ΠΊ Π²Π½Π΅ΡΠ½ΠΈΠ΅ , ΠΏΠΎΡΡΠΎΠΌΡ Π±ΡΠ»ΠΈ Π·Π°Π³ΡΡΠΆΠ΅Π½Ρ Π² ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡΠ΅, Π° ΠΏΠΎΠ·ΠΆΠ΅ ΠΈΠ· node_modules ΠΈΠ·-Π·Π° Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² ΠΊΠ°ΠΊΠΎΠΌ-ΡΠΎ Π΄ΡΡΠ³ΠΎΠΌ ΠΌΠΎΠ΄ΡΠ»Π΅.
Π Π΅ΡΠ΅Π½ΠΈΠ΅ Π±ΡΠ»ΠΎ ΡΠ°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΏΡΠΎΡΡΡΠΌ, ΠΊΠ°ΠΊ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΠΈΡ
ΡΡΡΠΎΠΊ Π² webpack.renderer.config.js
:
module.exports = {
externals: [
"react",
"react-dom"
],
};
ΠΡΠ°ΠΊ, Π΅ΡΠ»ΠΈ ΠΊΡΠΎ-ΡΠΎ Π·Π΄Π΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΏΠΎΡΡΠ»ΠΊΠΈ.js, ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΡΡΡΠ°Π½Π½ΠΎΠΉ ΠΏΡΠΈΡΠΈΠ½Π΅ ΠΌΠ½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ ΠΎΠ±ΠΎΠΉΡΠΈΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΈΠΌΠΏΠΎΡΡΠΎΠΌ: import React from 'React';
, ΠΈ ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ Ρ Π½Π°ΡΠ°Π» ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Ρ
ΡΠΊΠΈ ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Ρ ΠΏΠΎΠ»ΡΡΠΈΠ» ΠΎΡΠΈΠ±ΠΊΡ Π½Π°ΡΡΡΠ΅Π½ΠΈΡ ΠΈΠ½Π²Π°ΡΠΈΠ°Π½ΡΠ°, Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ, ΡΡΠΎ ΡΡΠΎ Π±ΡΠ»ΠΎ ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Ρ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π», ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ from 'React'
Π²ΠΌΠ΅ΡΡΠΎ from 'react'
. Π£ΠΏΡ.
Π£ ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΈΠ· Π²Π°Ρ Π±ΡΠ»Π° ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, Π½ΠΎ Ρ ΠΡΡΡΠ±ΠΈ?
Π― ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ Β«ΡΠ΅Π°Π³ΠΈΡΡΡ Π½Π° npm lsΒ»:
ΠΈ Β«npm ls react-domΒ»
Π‘Π½Π°ΡΠ°Π»Π° Ρ ΠΏΠΎΠ΄ΡΠΌΠ°Π», ΡΡΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ» ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎ, ΠΏΠΎΡΠ»Π΅ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΎΡΡ. ΠΠ°ΡΠ΅ΠΌ Ρ ΠΏΠΎΠΏΡΡΠ°Π»ΡΡ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ Π½ΠΎΠ²ΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ Π² Π΄ΡΡΠ³ΠΎΠΌ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅, 'gatsby new random-name', ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΠΊΡΠΎΡΠ΅ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ (Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ, ΡΠ»Π΅Π΄ΡΡ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅ https://www.youtube.com/watch?v=asrdFuAxPaU&feature=youtu). .be) Π² gatsby-starter-default, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, Π±ΡΠ΄Π΅Ρ Π»ΠΈ ΠΎΡΠΈΠ±ΠΊΠ° Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡΡ ΡΠ°ΠΌΠ° ΡΠΎΠ±ΠΎΠΉ. Π§ΡΠΎ ΠΆ, ΠΊ ΠΌΠΎΠ΅ΠΌΡ ΠΎΠ³ΠΎΡΡΠ΅Π½ΠΈΡ, ΡΠ°ΠΊ ΠΎΠ½ΠΎ ΠΈ Π±ΡΠ»ΠΎ!
ΠΡΠ±ΠΎΠΉ ΡΠΎΠ²Π΅Ρ Π±ΡΠ΄Π΅Ρ Ρ ΠΎΡΠΎΡΠΎ Π²ΠΎΡΠΏΡΠΈΠ½ΡΡ ΡΠ°Π·ΠΎΡΠ°ΡΠΎΠ²Π°Π½Π½ΡΠΌ ΠΏΠ»Π΅Π±Π΅Π΅ΠΌ.
ΠΠ°, Ρ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ Ρ ΡΠΎΠΉ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, ΡΡΠΎ ΠΈ Π²Ρ. Π― ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Π» ΡΠΎΠ²Π΅ΡΡ Π·Π΄Π΅ΡΡ... ,
// Add this in node_modules/react-dom/index.js
window.React1 = require('react');
// Add this in your component file
require('react-dom');
window.React2 = require('react');
console.log(window.React1 === window.React2);
Π― Π΄ΠΎΠ±Π°Π²ΠΈΠ» React2 Π² ΠΈΠ½Π΄Π΅ΠΊΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» ΠΏΠΎΠ΄ ΡΡΡΠ°Π½ΠΈΡΠ°ΠΌΠΈ. ΠΠ½ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π»ΠΎΠΆΡ.
ΠΠ΅Π΄ΡΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ npm Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΠ» Π΄Π΅Π΄ΡΠΏΠ»ΠΈΡΠΈΡΠΎΠ²Π°ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ, ΡΠΌ. Π·Π΄Π΅ΡΡ...
ΠΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΠΏΠ°ΠΊΠ΅Ρ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ Π΄Π²Π°ΠΆΠ΄Ρ! ΠΡΠΎ ΠΏΡΠΎΡΡΠΎ ΡΡΡΠ»ΠΊΠ°.
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΎΠ½ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅Ρ ΠΏΠ°ΠΊΠ΅ΡΡ Β«Π²Π²Π΅ΡΡ ΠΏΠΎ Π΄Π΅ΡΠ΅Π²ΡΒ» (Π²ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ Π΄Π΅ΡΠ΅Π²ΠΎ). ΠΡΠΎ ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ», ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΏΠ°ΠΊΠ΅ΡΡ ΠΏΡΠΈΡΠ»ΠΎΡΡ Π±Ρ ΠΈΡΠΊΠ°ΡΡ Π² node_modules ΠΊΠ°ΠΊΠΎΠ³ΠΎ-ΡΠΎ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ° (ΡΡΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Π±Π΅ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ½ΠΎ), ΠΈ ΡΡΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΡΠΏΡΠΎΡΡΠΈΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ.
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΡΠΎ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ Π² Π²Π°ΡΠ΅ΠΌ Π³ΡΠ°ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π΄Π΅Π΄ΡΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ, ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π°ΠΉΠ΄Π΅Π½ Π² Π³ΡΠ°ΡΠ΅ Ρ ΠΎΡΡ Π±Ρ Π΅ΡΠ΅ ΡΠ°Π·, ΠΎΠ±ΡΡΠ½ΠΎ Π½Π° Β«Π±ΠΎΠ»Π΅Π΅ Π²ΡΡΠΎΠΊΠΎΠΌ ΡΡΠΎΠ²Π½Π΅Β».
Π₯ΠΎΡΡ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ Π΄Π΅Π΄ΡΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ Π½Π΅ ΡΡΠ°Π±ΠΎΡΠ°Π»Π°.
Π§ΡΠΎ Π²Ρ ΠΏΡΠΎΠ±ΠΎΠ²Π°Π»ΠΈ?
Π― ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΡΡ ΠΎΡΠΈΠ±ΠΊΡ ΠΏΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ΅ ΡΠ±ΠΎΡΠΊΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ NextJS. ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ material-ui, ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΈΡΡΠ΅Π·Π½Π΅Ρ, ββΠ΅ΡΠ»ΠΈ Ρ ΠΈΡ
ΡΠ΄Π°Π»Ρ. Π― Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠΈΠ»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ. Π― Π±Π΅Π·ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΏΡΡΠ°Π»ΡΡ ΡΠ΄Π°Π»ΠΈΡΡ node_modules ΠΈ Ρ. Π΄. Π― Π±Π΅Π·ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΏΡΡΠ°Π»ΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΡ ΠΈ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ react
Π² ΡΠ°ΠΉΠ» next.config.js ΠΈ package.json. Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ react 16.8.6, react-dom 16.8.6 ΠΈ next 9.0.4. npm ls
Π³ΠΎΠ²ΠΎΡΠΈΡ, ΡΡΠΎ Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ. Π― Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π½ΠΈΠΊΠ°ΠΊΠΈΡ
ΡΡΡΠ»ΠΎΠΊ npm.
Π Π΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ: https://github.com/dancancro/questions/tree/invalid-hook-call
Codesandbox Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π·Π΄Π΅ΡΡ: https://codesandbox.io/s/github/dancancro/questions/tree/invalid-hook-call/?fontsize=14 .
Stackoverflow: https://stackoverflow.com/questions/57647040/nextjs-invalid-hook-call-hooks-can-only-be-call-inside-of-the-body-of-a-fun
ΠΡΠΈΠ±ΠΊΠ° Π·Π΄Π΅ΡΡ: https://gist.github.com/dancancro/2dfafb053aaaedfade406fd4f67eb68a
... render -> renderToString -> ReactDOMServerRenderer.read -> ReactDOMServerRenderer.render -> Object.WithStyles [ΠΊΠ°ΠΊ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³] ...
ΠΡΠΈΠ±ΠΎΡΠ½ΡΠΉ Ρ
ΡΠΊ β ΡΡΠΎ Π²ΡΠ·ΠΎΠ² useStyles()
Π² ΡΡΡΠΎΠΊΠ΅ 17428 ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΡΠ°ΠΉΠ»Π° Π² ΡΡΠ½ΠΊΡΠΈΠΈ withStyles
. ΠΠ°ΠΉΠ΄ΠΈΡΠ΅ Β«var class = useStyles (ΡΠ΅ΠΊΠ²ΠΈΠ·ΠΈΡ)Β». ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΠΊΠΎΠ΄Π΅, ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ nextjs. ΠΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Ρ Π½Π°ΠΏΠΈΡΠ°Π», Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ withStyles
, ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ Ρ
ΡΠΊΠΈ ΠΈΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, Π½Π°ΡΠΈΠ½Π°ΡΡΠΈΠ΅ΡΡ Ρ Β«use*Β».
ΠΠΠΠΠΠΠΠΠΠ: ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΠΈΠ· ΠΌΠΎΠ΅Π³ΠΎ next.config.js ΡΠ΅ΡΠΈΠ»ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ:
webpack: config => {
config.externals = [
'/'
]
return config
},
Π― Π½Π°ΡΠ΅Π» ΠΎΠ±Ρ
ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡΡΡ, ΡΠ΄Π°Π»ΠΈΠ² react
ΠΈ react-dom
ΠΈΠ· ΠΏΠ°ΠΏΠΊΠΈ ΠΌΠΎΠ΅Π³ΠΎ ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ° node_modules
.
Π― Π² ΡΠΎΠΉ ΠΆΠ΅ Π»ΠΎΠ΄ΠΊΠ΅, ΡΡΠΎ ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· Π²Π°Ρ. Π£ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΠΏΠ°ΠΊΠ΅Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, Π½Π°Π΄ ΠΊΠΎΡΠΎΡΡΠΌ Ρ ΡΠ°Π±ΠΎΡΠ°Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ, ΠΈ Ρ Π½Π΅ Ρ ΠΎΡΡ Π·Π°Π½ΠΈΠΌΠ°ΡΡΡΡ Π΅Π³ΠΎ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠ΅ΠΉ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° ΠΌΠ½Π΅ Π½ΡΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΠΌΠΎΠ΅ΠΌ ΠΏΠ°ΠΊΠ΅ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π― ΡΠ²ΡΠ·Π°Π» Π΅Π³ΠΎ ΠΈ Π½Π°ΡΠ°Π» ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΡΡΡ ΠΎΡΠΈΠ±ΠΊΡ.
ΠΠΎΡ ΠΎΠ±Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡΡΡ:
npm link
'dnode_modules
Π΄Π»Ρ ΠΏΠ°ΠΊΠ΅ΡΠ° Adist/
, Π²ΠΊΠ»ΡΡΠ°Ρ node_modules
node_modules
ΠΏΠ°ΠΊΠ΅ΡΠ° A ΡΠ΄Π°Π»ΠΈΡΠ΅ react
ΠΈ react-dom
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ» ΠΎΠ΄Π½Ρ ΠΈ ΡΡ ΠΆΠ΅ Π²Π΅ΡΡΠΈΡ React Π² ΠΎΠ±ΠΎΠΈΡ ΠΏΠ°ΠΊΠ΅ΡΠ°Ρ . ΠΠ°ΠΌ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΡΠΈΡΡ Π²ΡΠ΅ Π·Π°ΠΏΡΡΠ΅Π½Π½ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ.
Π£ ΠΌΠ΅Π½Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΡ
why-did-you-update
. (https://github.com/maicki/why-did-you-update/issues/52)
Π½Π΅ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎ, ΠΏΠΎΡΠ΅ΠΌΡ-Π²Ρ-ΠΎΠ±Π½ΠΎΠ²ΠΈΠ»ΠΈ
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ @bertho-zero ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½ΠΎΠ²ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈΠ»ΠΈ ΠΌΠΎΠΉ Ρ ΡΠΊ useWhyDidYouUpdate
@brunolemos ΠΡΠΎ Π·Π΄ΠΎΡΠΎΠ²ΠΎ, Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°ΡΡΠ΅, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ Π΅Π³ΠΎ Π² ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ.
Π Π΅ΡΠ΅Π½ΠΈΠ΅ @ dmart914 ΡΠ΅ΡΠΈΠ»ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π΄Π»Ρ ΠΌΠ΅Π½Ρ. Π£ ΠΌΠ΅Π½Ρ ΡΠΎΠΆΠ΅ Π΅ΡΡΡ ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ, ΡΠ°ΠΊ ΡΡΠΎ Ρ ΠΌΠΎΠ³Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ, Π½Π΅ ΠΏΡΠ±Π»ΠΈΠΊΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ... ΠΊΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ Π½Π°ΡΠ΅Π» ΠΎΠ±Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡΡΡ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ? ΠΡΠ±Π»ΠΈΠΊΠΎΠ²Π°ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Ρ ΠΎΡΠΊΡΡΡΡΠΌ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ ΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² NPM, ΡΡΠΎΠ±Ρ Ρ ΡΠΊΠΈ Π²ΠΎΠ»ΡΠ΅Π±Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π½Π°ΡΠ°Π»ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ, β Π½Π΅ Π»ΡΡΡΠΈΠΉ ΠΎΠΏΡΡ...
Π Π΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΌΠΎΠ΄ΡΠ»Ρ ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ° react
Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, Π΅ΡΠ»ΠΈ Π² ΡΡΠΎΠΌ ΠΏΠ°ΠΊΠ΅ΡΠ΅ Π΅ΡΡΡ ΡΠ΅ΡΡΡ, ΡΡΠ΅Π±ΡΡΡΠΈΠ΅ react
(Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, @testing-library/react
ΠΈΠ»ΠΈ @testing-library/react-hooks
), ΠΏΠΎΡΡΠΎΠΌΡ ΠΠΎΡ
ΠΎΠΆΠ΅, Π½Π°ΠΌ Π²ΡΠ΅ Π΅ΡΠ΅ Π½ΡΠΆΠ΅Π½ Π»ΡΡΡΠΈΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠΏΡΠ°Π²ΠΈΡΡΡΡ Ρ ΡΡΠΈΠΌ.
ΠΠΎΡ Π·Π°ΡΠ²ΠΊΠ° ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π΄Π²ΡΡ
ΡΠ°ΡΡΠ΅ΠΉ. ΠΡΠ½ΠΎΠ²Π½ΠΎΠ΅ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ Π·Π°Π³ΡΡΠΆΠ°Π΅ΡΡΡ Π² Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ React 16.9.0.
ΠΠΎΠ΄ΡΠ»Ρ Π·Π°Π³ΡΡΠΆΠ°Π΅ΡΡΡ Π² Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° React.lazy() ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΈΠΌΠΏΠΎΡΡΠ°().
ΠΡΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠ΅ ΠΌΠΎΠ΄ΡΠ»Ρ Π²ΡΠ΄Π°Π΅ΡΡΡ ΠΎΡΠΈΠ±ΠΊΠ° "ΠΠ΅Π²Π΅ΡΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² Ρ
ΡΠΊΠ°".
Π ΠΌΠΎΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ ΡΠΎΠ·Π΄Π°ΡΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ, ΠΎΠ½ΠΈ Π½Π΅ Π·Π½Π°ΡΡ Π΄ΡΡΠ³ ΠΎ Π΄ΡΡΠ³Π΅ ΠΈ Π±ΡΠ΄ΡΡ ΠΈΠΌΠ΅ΡΡ ΡΠ²ΠΎΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΠΊΠΎΠΏΠΈΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ. Π― ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°Π» ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ, Π½Π°ΠΉΠ΄Π΅Π½Π½ΡΠ΅ Π² ΠΏΠΎΡΠΎΠΊΠ΅, Π½ΠΎ Π½Π΅ ΡΠ΅ΡΠΈΠ» ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΠ° Π² webpack.config ΠΌΠΎΠ΄ΡΠ»Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° ΡΠ΅Π°ΠΊΡΠΈΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΊΠ°ΠΊ ΡΡΠΎ Π±ΡΠ»ΠΎ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ apieceofbart.
ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌ: {
ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ: path.resolve('../../node_modules/ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ')
}
ΠΡΡΠ°Π»ΡΡ ΡΠΊΠ°Π·Π°ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΡΠ΅Π°ΠΊΡΠΈΠΈ Π² package.json ΠΌΠΎΠ΄ΡΠ»Ρ Π½Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
"Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ": {
"react-dom": " ΡΠ°ΠΉΠ»:../common/node_modules/react-dom ",
"ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ": " ΡΠ°ΠΉΠ»:../common/node_modules/ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ "
}
Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΠ΅Π°ΠΊΡΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ Π·Π°ΠΏΡΡΠΊ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΊΠΎΠΏΠΈΠΉ, ΠΊΠΎΠ³Π΄Π° ΡΠ΅ΡΡ ΠΈΠ΄Π΅Ρ ΠΎ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ Π·Π°Π³ΡΡΠΆΠ°Π΅ΠΌΡΡ ΠΌΠΎΠ΄ΡΠ»ΡΡ .
ΠΡΠ½ΠΎΠ²ΡΠ²Π°ΡΡΡ Π½Π° Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΎΡΠ²Π΅ΡΠ°Ρ Π²ΡΡΠ΅, Π²ΠΎΡ ΡΡΠΎ ΡΡΠ°Π±ΠΎΡΠ°Π»ΠΎ Π΄Π»Ρ ΠΌΠ΅Π½Ρ:
config/webpack.config.js
externals: {
react: {
root: 'React',
commonjs2: 'react',
commonjs: 'react',
amd: 'react'
},
'react-dom': {
root: 'ReactDOM',
commonjs2: 'react-dom',
commonjs: 'react-dom',
amd: 'react-dom'
}
}
package.json
"devDependencies" : {
...
"react": "^16.9.0",
"react-dom": "^16.9.0",
}
"peerDependencies": {
"react": "^16.9.0",
"react-dom": "^16.9.0"
}
public/index.html
<head>
<script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>
...
ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Ρ ΡΠΌΠΎΠ³ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ Ρ ΡΠΊΠΈ Π² ΡΠ²ΠΎΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ React, Π·Π°Π³ΡΡΠΆΠ΅Π½Π½ΡΠΉ ΠΈΠ· CDN, Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ Jest Π²ΡΠ΅ Π΅ΡΠ΅ Π·Π°Π³ΡΡΠΆΠ°Π» ΠΊΠΎΠΏΠΈΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ ΠΈΠ· node_modules (ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΉ ΠΈΠ· devDependencies).
Π½Π°Π΄Π΅ΡΡΡ, ΡΡΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ
Π― ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, ΠΊΠΎΠ³Π΄Π° ΠΏΡΡΠ°ΡΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠ²ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π½Π° ΠΊΠ»Π°ΡΡΠΎΠ²ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ, ΠΈ Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΡΡ ΠΎΡΠΈΠ±ΠΊΡ, ΠΏΠΎΡΡΠΎΠΌΡ Π²ΠΎΡ ΠΌΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΡΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΈ, Π½Π°Π΄Π΅ΡΡΡ, ΠΎΠ½ΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ ΠΈ Π² Π²Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅.
ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π±ΠΎΠ»Π΅Π΅ Π²ΡΡΠΎΠΊΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ΄ΠΊΠ° Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅
ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ React ΠΈΠ· Β«ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡΒ»;
ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ PropTypes ΠΈΠ· 'prop-types';
ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ { withStyles } ΠΈΠ· '@material-ui/styles';
ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠ½ΠΎΠΏΠΊΡ ΠΈΠ· '@material-ui/core/Button';
ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠ΅ ΡΡΠΈΠ»ΠΈ = ΡΠ΅ΠΌΠ° => ({
ΠΊΠΎΡΠ΅Π½Ρ: {
ΡΠΎΠ½: 'Π»ΠΈΠ½Π΅ΠΉΠ½ΡΠΉ Π³ΡΠ°Π΄ΠΈΠ΅Π½Ρ (45 Π³ΡΠ°Π΄ΡΡΠΎΠ², #FE6B8B 30%, #FF8E53 90%)',
Π³ΡΠ°Π½ΠΈΡΠ°: 0,
Π³ΡΠ°Π½ΠΈΡΠ°Π Π°Π΄ΠΈΡΡ: 3,
boxShadow: '0 3px 5px 2px rgba(255, 105, 135, .3)',
Π±Π΅Π»ΡΠΉ ΡΠ²Π΅Ρ',
ΡΠΎΡΡ: 48,
ΠΎΡΡΡΡΠΏ: '0 30px',
},
});
ΠΊΠ»Π°ΡΡ HigherOrderComponent ΡΠ°ΡΡΠΈΡΡΠ΅Ρ React.Component {
ΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ(){
const {ΠΊΠ»Π°ΡΡΡ} = this.props;
Π²Π΅ΡΠ½ΡΡΡ (
ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π²ΡΡΡΠ΅Π³ΠΎ ΠΏΠΎΡΡΠ΄ΠΊΠ°
);
}
}
HigherOrderComponent.propTypes = {
ΠΊΠ»Π°ΡΡΡ: PropTypes.object.isRequired,
};
ΡΠΊΡΠΏΠΎΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠΎ ΡΡΠΈΠ»ΡΠΌΠΈ (ΡΡΠΈΠ»ΠΈ) (HigherOrderComponent);
Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Yarn ΠΈ ΠΈΡΠΏΡΠ°Π²ΠΈΠ» ΡΡΠΎ, Π·Π°Π΄Π°Π² ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π² ΠΌΠΎΠ΅ΠΌ
package.json
:"resolutions": { "**/react": "16.7.0-alpha.2", "**/react-dom": "16.7.0-alpha.2" },
ΠΡ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π² ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΈΠ»ΠΈ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΠ°ΠΊΠ΅Ρ?
ΠΡΠ½ΠΎΠ²ΡΠ²Π°ΡΡΡ Π½Π° Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΎΡΠ²Π΅ΡΠ°Ρ Π²ΡΡΠ΅, Π²ΠΎΡ ΡΡΠΎ ΡΡΠ°Π±ΠΎΡΠ°Π»ΠΎ Π΄Π»Ρ ΠΌΠ΅Π½Ρ:
- ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ Π²
config/webpack.config.js
externals: { react: { root: 'React', commonjs2: 'react', commonjs: 'react', amd: 'react' }, 'react-dom': { root: 'ReactDOM', commonjs2: 'react-dom', commonjs: 'react-dom', amd: 'react-dom' } }
- ΠΡΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΎ
package.json
"devDependencies" : { ... "react": "^16.9.0", "react-dom": "^16.9.0", }
"peerDependencies": { "react": "^16.9.0", "react-dom": "^16.9.0" }
- ΠΡΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΎ
public/index.html
<head> <script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script> <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script> ...
ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Ρ ΡΠΌΠΎΠ³ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ Ρ ΡΠΊΠΈ Π² ΡΠ²ΠΎΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ React, Π·Π°Π³ΡΡΠΆΠ΅Π½Π½ΡΠΉ ΠΈΠ· CDN, Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ Jest Π²ΡΠ΅ Π΅ΡΠ΅ Π·Π°Π³ΡΡΠΆΠ°Π» ΠΊΠΎΠΏΠΈΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ ΠΈΠ· node_modules (ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΉ ΠΈΠ· devDependencies).
Π½Π°Π΄Π΅ΡΡΡ, ΡΡΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ
ΠΠ΅Π· ΠΎΠ±ΠΈΠ΄, Π½ΠΎ Π½Π°ΡΡΠΎΡΠ°ΠΆΠΈΠ²Π°Π΅Ρ ΡΠΎ, ΡΡΠΎ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡ ΡΠ°ΠΊΠΈΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΡΠΌ. ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ ΠΏΠ°ΡΡ Π΄Π½Π΅ΠΉ Ρ ΠΏΡΡΠ°Π»ΡΡ ΡΠ΅ΡΠΈΡΡ ΡΡΡ ΠΎΡΠΈΠ±ΠΊΡ, Π½Π΅ ΠΏΠΎΠ»Π°Π³Π°ΡΡΡ Π½Π° ΡΠ°ΠΊΠΈΠ΅ Ρ Π°ΠΊΠΈ.
Π― ΡΠ°Π±ΠΎΡΠ°Ρ Π½Π°Π΄ ΠΌΠ½ΠΎΠ³ΠΎΡΠ°Π·ΠΎΠ²ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠ΅ Ρ
ΡΠΊΠΈ. ΠΠ½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡ
Π² ΡΠ΅Π°Π»ΡΠ½ΡΡ
ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ
, ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°ΡΡ. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ β ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ yarn|npm link
. Π― ΡΠ²ΡΠ·ΡΠ²Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ rollup ΠΈ ΠΌΠΎΠ³Ρ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ Π² ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡΠ΅ Π½Π΅Ρ Π²Π΅ΡΡΠΈΠΈ react. ΠΠΎΠ³Π΄Π° Ρ ΡΠ²ΡΠ·ΡΠ²Π°Ρ (Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅Ρ) ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ, ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΡΠΈΠ±ΠΊΠ°/ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°. ΠΡΠΎ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ Π΄Π»Ρ Π³ΠΎΠ»ΡΡ
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ create-react-app
ΠΈ next.js
. ΠΠ±Π° ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ webpack Π² ΡΠΎΠ½ΠΎΠ²ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅.
ΠΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ ΡΠΆΠ΅ Π½Π°ΡΠ΅Π» Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅?
ΠΠΎΠ»Π½ΠΎΡΡΡΡ ΠΎΡΠΊΠ°Π·Π°Π²ΡΠΈΡΡ npm|yarn link
, Ρ ΡΠΌΠΎΠ³ ΡΠ΅ΡΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΡ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΡΡΡΠΊΡΡΡΡ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°. ΠΡΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²Π°ΠΌ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ webpack Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ±ΠΎΡΡΠΈΠΊΠ°, ΠΏΠΎΡΡΠΎΠΌΡ Π²Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΎΠ±ΡΡΠ²Π»ΡΡΡ _react_ ΠΈ _react-dom_ ΠΊΠ°ΠΊ external
ΠΈΠ»ΠΈ alias
. Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΠΎΠ½ Π²Π²ΠΎΠ΄ΠΈΡ Π² ΠΏΡΠΎΠ΅ΠΊΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½ΠΎΠ²ΡΡ
ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ² ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ² Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, Π½ΠΎ, ΡΠΉ, ΠΎΠ½ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ... Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ ΠΈ Π΄Π°ΠΆΠ΅ Π²Π½ΡΡΡΠΈ Π½Π°ΡΠΈΡ
ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² Π΄ΠΎΠΊΠ΅ΡΠΎΠ².
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΡΠΎ Π±ΡΠ΄Π΅Ρ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ:
@GabrielBB ΡΠΏΠ°ΡΠΈΠ±ΠΎ, ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ° Π΄Π»Ρ ΠΌΠ΅Π½Ρ
@dmart914 ΡΠΏΠ°ΡΠΈΠ±ΠΎ! ΠΠΎΠΊΠ° Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΎΠ±Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π΄Π»Ρ ΠΌΠ΅Π½Ρ :)
Π Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Ρ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ React Invalid Hook Call ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΠΏΡΠΎΡΡΠΎΠΉ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ.
ΠΡΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ:
__ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ__
ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ @ 16.10.1
ΡΠ΅Π°ΠΊΡΠΈΡ-Π΄ΠΎΠΌ @ 16.10.1
Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅Ρ@4.41.0
Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅Ρ[email protected]
Π Π·Π°ΠΏΡΡΡΠΈΡΡ webpack test.js -o main.js
Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ.
Π― ΠΎΠΆΠΈΠ΄Π°Ρ, ΡΡΠΎ ΡΡΠΎΡ ΡΠ°ΠΉΠ»:
React.useState
.test
ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΠ΅ ΠΎΠ±ΡΠ°ΡΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² updateTest
.React.useEffect
.Π― ΡΡΠΎ-ΡΠΎ Π΄Π΅Π»Π°Ρ Π½Π΅ ΡΠ°ΠΊ, ΠΈΠ»ΠΈ ΡΡΠΎ-ΡΠΎ Π΅ΡΠ΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ?
// test.js
import React, { createElement as el } from 'react';
import ReactDOM from 'react-dom';
function Item() {
debugger;
const [test, updateTest] = React.useState(false); // Throws React error.
React.useEffect(function checkTest() { // Throws React error.
console.log("checking test", test);
}, [test]);
React.useEffect(function tester() { // Throws React error.
if (!test) {
setTimeout(() => {
console.log("changing value for test");
updateTest(true);
}, 1000);
}
}, [test]);
return el('div', {style: {width: '300px', height: '300px', 'background-color': 'green', border: '1px solid red'}});
}
function render() {
let root = document.querySelector('#primary');
if (!root) {
root = document.createElement('div');
document.body.appendChild(root);
}
ReactDOM.render(Item(), root);
}
render();
ΠΡ Π·Π°Π±ΡΠ»ΠΈ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ. ΠΡ ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΎ Π²ΡΠ·ΡΠ²Π°Π΅ΡΠ΅ Item()
Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π΄ΠΎΡΡΠΈΠ³Π½Π΅ΡΠ΅ Π²ΡΠ·ΠΎΠ²Π° ReactDOM.render
. ΠΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΠΉΡΠΈ el(Item)
.
ΠΡΡΠΈΠ½Π½ΡΠΉ! Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ ΠΠ°ΠΌ Π·Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ.
ΠΠ°Ρ
ΠΎΠΆΡΡΡ Π² ΡΠ°ΠΊΠΎΠΉ ΠΆΠ΅ ΡΠΈΡΡΠ°ΡΠΈΠΈ, ΠΊΠ°ΠΊ ΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΡΡΠ³ΠΈΠ΅ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΎΡΡ. Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ webpack Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠ° Π½Π΅ΠΊΠΎΡΠΎΡΡΡ
ΡΠ΅Π°Π³ΠΈΡΡΡΡΠΈΡ
ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² (Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ
ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ Ρ
ΡΠΊΠΈ) ΠΈ ΠΏΠΎΠΌΠ΅ΡΠ°Ρ ΠΏΠ΅ΡΠ΅Π½Π΅ΡΠ΅Π½Π½ΡΠΉ ΠΊΠΎΠ΄ Π² ΠΏΠ°ΠΏΠΊΡ lib
. Π― Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ Π½Π° ΠΏΠΎΠ»Π΅ externals
ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ°, ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΎ Π½Π΅ ΡΠ²ΡΠ·ΡΠ²Π°Π»ΠΎΡΡ Ρ ΠΊΠΎΠ΄ΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°. Π― Ρ
ΠΎΡΠ΅Π» Π±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π² Π΄Π²ΡΡ
ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ
ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ
β ΡΡΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΡΠ²Π»ΡΡΡΡΡ ΠΎΠ±ΡΠΈΠΌΠΈ Π΄Π»Ρ Π½ΠΈΡ
, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ Ρ
ΠΎΡΠ΅Π»ΠΈ Π±Ρ ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΈΡ
Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ ΠΈ ΡΡΠΎΠ±Ρ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΎΡΡΠ°ΠΆΠ°Π»ΠΈΡΡ Π² ΠΎΠ±ΠΎΠΈΡ
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ
.
ΠΡΠ»ΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ common-components: file:../../common-components/lib
Π² package.json, ΡΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π·Π°Π³ΡΡΠΆΠ°ΡΡΡΡ ΠΎΡΠ»ΠΈΡΠ½ΠΎ, ΠΎΠ΄Π½Π°ΠΊΠΎ Π·Π°ΠΏΡΡΠΊ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° Π½Π΅ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ β Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΠΏΡΡΡΠΈΡΡ yarn upgrade common-components
, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠ΅ΡΠ²Π΅Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ.
ΠΡΠ»ΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ββββΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ common-components: link:../../common-components/lib
, ΡΠΎ ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΠΉ Π·Π°ΠΏΡΡΠΊ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΎΠ±Π½ΠΎΠ²ΠΈΡ ΡΠ°ΠΉΠ»Ρ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ node_modules
(ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ΅ΠΏΠ΅ΡΡ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΡΡ ΡΡΡΠ»ΠΊΡ), Π½ΠΎ Ρ ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΠΊΠ°Π·Π°Π½Π½ΡΡ Π²ΡΡΠ΅ ΠΎΡΠΈΠ±ΠΊΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ. Π― ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ, ΡΡΠΎ ΡΠ΅ΠΏΠ΅ΡΡ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π²Π΅ΡΡΠΈΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ Π² ΠΏΠ°ΠΏΠΊΠ΅ common-components/node_modules
.
ΠΡΡΡ Π»ΠΈ ΡΠΏΠΎΡΠΎΠ± ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΡΡΠ»ΠΊΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, common-components: link:../../common-components/lib
), Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΠ΅Π°ΠΊΡΠΈΡ, Π½Π°ΠΉΠ΄Π΅Π½Π½ΡΡ Π² ΠΏΠ°ΠΏΠΊΠ΅ node_modules ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ? ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Ρ ΠΏΠ»Π°Π½ΠΈΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π² ΠΎΠ±ΠΎΠΈΡ
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ
, Ρ Π½Π΅ ΠΌΠΎΠ³Ρ ΡΠ²ΡΠ·Π°ΡΡ ΠΏΠ°ΠΊΠ΅Ρ ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ
Ρ ΠΎΠ±ΡΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ², ΠΈ Ρ Ρ
ΠΎΡΠ΅Π» Π±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΡ ΠΎΠ±ΠΎΠΈΡ
ΠΎΡΠ½ΠΎΠ²Π½ΡΡ
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ ΡΠ΅Π°ΠΊΡΠΈΠ΅ΠΉ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ Π² ΠΏΠ°ΠΊΠ΅ΡΠ΅ ΠΎΠ±ΡΠΈΡ
ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ². Π― Π²ΠΈΠ΄Π΅Π» Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ, ΠΎΡΠ½ΠΎΡΡΡΠΈΠ΅ΡΡ ΠΊ ΠΏΠΎΠ»Ρ webpack resolve
, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π·Π²ΡΡΠΈΡ ΠΌΠ½ΠΎΠ³ΠΎΠΎΠ±Π΅ΡΠ°ΡΡΠ΅, Π½ΠΎ Ρ Π½Π΅ ΠΌΠΎΠ³Ρ Π·Π°ΡΡΠ°Π²ΠΈΡΡ Π΅Π³ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ. ΠΡΠ±Π°Ρ ΠΏΠΎΠΌΠΎΡΡ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΈΠ½ΡΡΠ° Ρ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ½ΠΎΡΡΡΡ!
ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ: Π΄Π»Ρ Π²ΡΠ΅Ρ , ΠΊΡΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ΅ΡΡΡ Π½Π°ΡΠΈΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ, ΠΌΡ Π·Π°ΠΊΠΎΠ½ΡΠΈΠ»ΠΈ ΡΠ΅ΠΌ, ΡΡΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ ΡΠ°Π³ ΡΠ±ΠΎΡΠΊΠΈ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΡΡΠΎ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΠΉΠ»Ρ Π² Π΄Π²Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°, Π² ΠΊΠΎΡΠΎΡΡΡ ΠΎΠ½ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡ, ΠΈ Π²ΠΎΠΎΠ±ΡΠ΅ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΡΡΠ°Π½ΡΠΏΠΈΠ»ΡΡΠΈΠΈ.
ΠΠ΄Π½ΠΈΠΌ ΠΈΠ· Π±ΡΡΡΡΡΡ
ΠΎΠ±Ρ
ΠΎΠ΄Π½ΡΡ
ΠΏΡΡΠ΅ΠΉ Π±ΡΠ»ΠΎ Π±Ρ Π½Π΅ ΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°ΡΡ ΠΏΠ°ΠΊΠ΅Ρ, Π° ΠΏΡΠΎΡΡΠΎ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ Π΅Π³ΠΎ Π½Π° github ΠΈ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ Π² ΡΠ²ΠΎΠΉ ΠΏΡΠΎΠ΅ΠΊΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ yarn add <git-url>
.
ΠΠ΄Π½ΠΈΠΌ ΠΈΠ· Π±ΡΡΡΡΡΡ ΠΎΠ±Ρ ΠΎΠ΄Π½ΡΡ ΠΏΡΡΠ΅ΠΉ Π±ΡΠ»ΠΎ Π±Ρ Π½Π΅ ΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°ΡΡ ΠΏΠ°ΠΊΠ΅Ρ, Π° ΠΏΡΠΎΡΡΠΎ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ Π΅Π³ΠΎ Π½Π° github ΠΈ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ Π² ΡΠ²ΠΎΠΉ ΠΏΡΠΎΠ΅ΠΊΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ
yarn add <git-url>
.
ΠΡΠΈΡΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· Π½Π°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΡΡΠΈ npm link ΠΈ npm package, Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΠ΄Π° Π±Π΅Π· Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² NPM ΠΈΠ»ΠΈ GitHub Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ ΡΠ·Π½Π°Π΅ΠΌ, ΡΡΠΎ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ.
ΠΡ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΠΈΡΡ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠΉ Ρ https://github.com/facebook/react/issues/13972#issuecomment -447599035, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Ρ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΡΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π²ΡΠ·Π²Π°Π½ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ ΡΠ·Π»Π° Webpack. ΠΠ°ΡΠΈΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π±ΡΠ» ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ΅ΡΡ, Π·Π°ΠΏΡΡΠ΅Π½Π½ΡΠΉ Π² Jest, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎ Π·Π°ΠΏΡΡΠΊΠ°Π» webpack()
Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΏΠ΅ΡΠ΅Π΄ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΡΠ΅ΡΡΠΎΠ². Π― ΡΡΠΈΡΠ°Ρ, ΡΡΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠ²ΡΠ·Π°Π½Π° Ρ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ ESM ΠΈ CJS ΠΌΠΎΠ³ΡΡ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ.
ΠΠΎΠ·ΡΠΌΠΈΡΠ΅ ΡΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
// node express server, doing server-rendering
import React from 'react';
import { ApolloProvider } from '@apollo/react-common';
import { renderToStringWithData } from '@apollo/react-ssr';
res.send(await renderToStringWithData(<ApolloProvider><App /></ApolloProvider>)
ΠΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ΅Π°Π½ΡΠ° ΠΎΡΠ»Π°Π΄ΠΊΠΈ Ρ Π²ΠΈΠΆΡ, ΡΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄Π²Π° ΡΠ°Π·Π½ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° React Π² ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΡΡΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°:
_react: {Children, ...}
_react2: {default: {Children, ...}
ΠΠ΄Π΅
_react
ΠΈΠ· ESM import React from 'react'
Π² ΡΡΠΎΠΌ ΡΠ°ΠΉΠ»Π΅
_react2
ΠΎΡ CJS var _react = _interopRequireDefault(require("react"));
ΠΈΠ·Π½ΡΡΡΠΈ node_modules/@apollo/react-ssr/lib/react-ssr.cjs.js
Π― ΡΡΠΈΡΠ°Ρ, ΡΡΠΎ ΡΡΠΎ ΠΏΡΠΈΠ²Π΅Π»ΠΎ ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎ ΡΡΡΠ»ΠΊΠ° Π½Π° React Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°Π»Π° Π² Π΄Π²ΡΡ
ΠΌΠ΅ΡΡΠ°Ρ
(ΡΠ°ΠΉΠ» ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π° ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΈ Π²Π½ΡΡΡΠΈ ΠΏΠ°ΠΊΠ΅ΡΠ° @apollo/react-ssr
) ΠΈ, ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π²ΡΠ·Π²Π°Π»Π° ΠΎΡΠΈΠ±ΠΊΡ.
ΠΡ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ»ΠΈ, ΡΡΠΎ ΡΡΠΎ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, Π±ΡΠ»ΠΎ Π²ΡΠ·Π²Π°Π½ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ webpack()
Π²Π½ΡΡΡΠΈ ΡΠ΅ΡΡΠ°, ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π»ΠΈ ΡΡΠΈ ΡΠ΅ΡΡΡ Π² ΡΠΊΠ²ΠΎΠ·Π½ΡΠ΅. Π£ΡΠΎΠΊ Π΄Π»Ρ Π½Π°Ρ Π² ΡΠΎΠΌ, ΡΡΠΎ Π΅ΡΠ»ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠ΅ΡΡΠΎΠ²ΠΎΠΌ ΠΊΠΎΠ΄Π΅, Ρ Π²Π°Ρ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ ΡΠ΅ΡΡΡ.
ΠΠ½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ ΡΠ΅ΡΠΈΡΡ ΡΡΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΡΡΠΆΠΈ:
cd Π½Π° myApp/node_modules/react
ΠΈ yarn link
Π·Π°ΡΠ΅ΠΌ Π² ΡΠ²ΠΎΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ Π·Π°ΠΏΡΡΡΠΈΡΠ΅ yarn link react
Π’Π΅ΠΏΠ΅ΡΡ Π²Π°ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΡ ΠΆΠ΅ ΡΠ°ΠΌΡΡ Π²Π΅ΡΡΠΈΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ, ΡΡΠΎ ΠΈ Π²Π°ΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
Π― ΠΏΡΡΠ°Π»ΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠ΅Π°ΠΊΡΠΈΡ ΠΊΠ°ΠΊ ΠΎΠ΄Π½ΠΎΡΠ°Π½Π³ΠΎΠ²ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ Π² ΠΌΠΎΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅, Π½ΠΎ ΡΠΎΠ³Π΄Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π½Π΅ ΡΠΎΠ±ΠΈΡΠ°Π»Π°ΡΡ
ΠΠ°ΠΊ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ create-react-app
Π±Π΅Π· ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π½Π° yarn
?
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡ ΠΆΠ΅ ΡΠ΅Ρ Π½ΠΈΠΊΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΡΠ»ΠΊΡ npm. ΠΠ΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π² ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΠΈ.
Π‘Π²ΡΠ·ΡΠ²Π°Π½ΠΈΠ΅ react
β Π½Π΅ Π»ΡΡΡΠ°Ρ ΠΈΠ΄Π΅Ρ, ΠΊΠΎΠ³Π΄Π° Π²Ρ ΡΠ°Π±ΠΎΡΠ°Π΅ΡΠ΅ Π½Π°Π΄ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ°ΠΌΠΈ Ρ ΡΠ°Π·Π½ΡΠΌΠΈ Π²Π΅ΡΡΠΈΡΠΌΠΈ.
@woles , Π²Ρ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ ΠΏΡΠ°Π²Ρ, Π½ΠΎ Π² ΠΌΠΎΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ ΡΠ΅ΡΠ°Π΅Ρ ΠΌΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΠΊΡΡΡΠΊΠ°ΠΌΠΈ. Π― Π½Π°Π΄Π΅ΡΡΡ, ΡΡΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΡΠ΅Π°ΠΊΡΠΈΠΈ ΠΏΡΠΈΠ΄ΡΠΌΠ°ΡΡ Π»ΡΡΡΠ΅Π΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅
ΠΡΠΈΠ²Π΅Ρ,
Π― ΠΈΡΠΏΡΠ°Π²ΠΈΠ» ΡΡΡ ΠΎΡΠΈΠ±ΠΊΡ ΡΠ΅ΡΠ΅Π· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°ΡΠΎΠ², ΠΏΠΎΠ½ΡΠ², ΡΡΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π²Π½ΡΡΡΠΈ ΡΠ΅Π°Π³ΠΈΡΡΡΡΠ΅Π³ΠΎ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡΠ°.
ΠΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΠ°Π»ΠΎ, Π½ΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ΅ Ρ Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅ ΠΌΠΎΠ³ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ useState. ΠΏΡΠΈΡΠΈΠ½Π° Π·Π°ΠΊΠ»ΡΡΠ°Π»Π°ΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π²Π½ΡΡΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Π° ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π° ΡΠ΅Π°Π³ΠΈΡΡΡΡΠΈΡ
ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡΠΎΠ² Π±Π΅Π· ΡΡΠ½ΠΊΡΠΈΠΈ Π±ΠΎΠ»Π΅Π΅ Π²ΡΡΠΎΠΊΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ΄ΠΊΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
<Route exact path="/path" render={ ComponentCausingTheErrorMesage }/>
ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π°
<Route exact path="/path" component={ ComponentNowWorkingAgain }/>
ΠΈΡΠΏΡΠ°Π²ΠΈΠ» ΡΡΠΎ Π΄Π»Ρ ΠΌΠ΅Π½Ρ
Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» npm link
ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ, Π½Π°Π΄ ΠΊΠΎΡΠΎΡΡΠΌ Ρ Π°ΠΊΡΠΈΠ²Π½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π», ΠΈ ΠΌΠ½Π΅ ΠΏΡΠΈΡΠ»ΠΎΡΡ ΡΡΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ, ΡΠ²ΡΠ·Π°Π² react
ΠΈ react-dom
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Ρ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ, Π° Π·Π°ΡΠ΅ΠΌ ΡΠ²ΡΠ·Π°Π² ΠΌΠΎΠ΄ΡΠ»Ρ ΠΊ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ:
Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ:
cd node_modules/react && npm link
react-dom
Π² ΠΌΠΎΠ΄ΡΠ»Π΅:
npm link react && npm link react-dom
npm link
Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ:
npm link [module-name]
ΠΠ°Π΄Π΅ΡΡΡ, ΡΡΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ ΠΊΠΎΠΌΡ-ΡΠΎ
Π£ Π½Π°Ρ Π±ΡΠ»ΠΈ Ρ ΡΠΊΠΈ, ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠ΅ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, Π½ΠΎ ΠΌΡ ΡΡΠ°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡ Ρ ΡΡΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ Π½Π° SSR. ΠΠΎΠΉ ΠΊΠΎΠ»Π»Π΅Π³Π° ΡΠ΅ΡΠΈΠ» ΡΡΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ Π² Π½Π°ΡΠ΅ΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΡΠ΅ΡΠ²Π΅ΡΠ°:
const nodeExternals = require('webpack-node-externals');
const serverConfig = () => {
// lots of config, then:
externals: [
nodeExternals({
modulesFromFile: true,
}),
],
}
ΠΠ½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ ΡΠ΅ΡΠΈΡΡ ΡΡΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΡΡΠΆΠΈ:
cd Π½Π°
myApp/node_modules/react
ΠΈyarn link
Π·Π°ΡΠ΅ΠΌ Π² ΡΠ²ΠΎΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ Π·Π°ΠΏΡΡΡΠΈΡΠ΅
yarn link react
Π’Π΅ΠΏΠ΅ΡΡ Π²Π°ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΡ ΠΆΠ΅ ΡΠ°ΠΌΡΡ Π²Π΅ΡΡΠΈΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ, ΡΡΠΎ ΠΈ Π²Π°ΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
Π― ΠΏΡΡΠ°Π»ΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠ΅Π°ΠΊΡΠΈΡ ΠΊΠ°ΠΊ ΠΎΠ΄Π½ΠΎΡΠ°Π½Π³ΠΎΠ²ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ Π² ΠΌΠΎΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅, Π½ΠΎ ΡΠΎΠ³Π΄Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π½Π΅ ΡΠΎΠ±ΠΈΡΠ°Π»Π°ΡΡ
ΠΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΏΡΠΎΡΡΠΎ ΠΊΡΠ°ΡΠΈΠ²ΠΎ
ΠΡΠΎΡΡΠΎ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ ΠΏΡΠΈ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ electronic-webpack, react ΠΈ material-ui. ΠΠΎΠ³Π΄Π° Ρ ΠΏΡΡΠ°ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎ-Π»ΠΈΠ±ΠΎ ΠΈΠ· material-ui - Ρ ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΡΡ ΠΎΡΠΈΠ±ΠΊΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ
ΠΡΠΈΠ±ΠΊΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°Ρ
ΠΈΠ· material-ui.
ΠΡΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ ΠΌΠΎΠ΅Π³ΠΎ ΡΠ»ΡΡΠ°Ρ?
ΠΡΠΈΠ²Π΅Ρ, ZVER3D, ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ ΠΌΠΎΠΉ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ . ΠΠ°Π΄Π΅ΡΡΡ, ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ!
Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»
npm link
ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ, Π½Π°Π΄ ΠΊΠΎΡΠΎΡΡΠΌ Ρ Π°ΠΊΡΠΈΠ²Π½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π», ΠΈ ΠΌΠ½Π΅ ΠΏΡΠΈΡΠ»ΠΎΡΡ ΡΡΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ, ΡΠ²ΡΠ·Π°Π²react
ΠΈreact-dom
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Ρ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ, Π° Π·Π°ΡΠ΅ΠΌ ΡΠ²ΡΠ·Π°Π² ΠΌΠΎΠ΄ΡΠ»Ρ ΠΊ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ:Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ:
1. `cd node_modules/react && npm link` 2. same for `react-dom`
Π² ΠΌΠΎΠ΄ΡΠ»Π΅:
1. `npm link react && npm link react-dom` 2. `npm link`
Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ:
1. `npm link [module-name]`
ΠΠ°Π΄Π΅ΡΡΡ, ΡΡΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ ΠΊΠΎΠΌΡ-ΡΠΎ
ΠΠΈΠ»ΡΠΉ ΠΌΠ°Π»ΡΡ ΠΠΎΠΈΡΠ΅ΠΉ, ΡΡΠΎ ΠΌΠ½Π΅ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΠΌΠΎΠ³Π»ΠΎ. ΠΠ°ΠΆΠ΅ Π½Π΅ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π» ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π² ΡΠ°Π·Π½ΡΡ Π²Π΅ΡΡΠΈΡΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ!! Π― ΡΠΎΠ·Π΄Π°Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ Π΄Π»Ρ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ Π² NPM, Π½ΠΎ Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ Π΄Π»Ρ Π΅Π³ΠΎ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΡΡΠ»ΠΊΠΈ npm. ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ (ΡΠ΅ΠΉΡΠ°Ρ) ΠΎΠ½ΠΈ ΠΎΠ±Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΠ°Π·Π½ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ ΡΠ΅Π°ΠΊΡΠΈΠΈ. Π!
ΠΡΠΈΠ²Π΅Ρ, ZVER3D, ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ ΠΌΠΎΠΉ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ . ΠΠ°Π΄Π΅ΡΡΡ, ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ!
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ, ΡΡΠΎ ΡΠΊΠ°Π·Π°Π»ΠΈ ΠΌΠ½Π΅ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅. ΠΡΡΠ³ΠΈΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ Π±ΡΠ»ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°, ΠΊΠΎΡΠΎΡΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ, Π² Β«whiteListedModulesΒ». ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π±ΡΠ΄Π΅Ρ Π·Π°ΠΊΠ»ΡΡΠ°ΡΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Π²Π°ΠΌ ΠΏΡΠΈΠ΄Π΅ΡΡΡ Π΄Π΅Π»Π°ΡΡ ΡΡΠΎ Π΄Π»Ρ Π²ΡΠ΅Ρ
ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ΅Π±ΡΡΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ.
ΠΡΠ°ΠΊ, Π² package.json Ρ Π½Π°ΠΏΠΈΡΠ°Π» ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅:
"electronWebpack": {
"whiteListedModules": [
"@material-ui/core",
"@material-ui/icons"
]
}
Π― ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ React, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ ΠΌΠΎΠ½ΠΎΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ. Π£ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ( brush
) ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ( react-gbajs
).
ΠΠΎΡΡΠΎΠΌΡ, ΠΊΠΎΠ³Π΄Π° Ρ ΠΏΡΡΠ°ΡΡΡ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡΡ ΡΠ²ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ react-gbajs
, Ρ ΠΌΠ΅Π½Ρ ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ° ΠΎΡΠΈΠ±ΠΊΠ° ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°Ρ
React. ΠΡΠ»ΠΈ Ρ ΡΠΊΠΎΠΏΠΈΡΡΡ ΠΈ Π²ΡΡΠ°Π²Π»Ρ ΡΠΎΡ ΠΆΠ΅ ΠΊΠΎΠ΄ Π½Π° brush
, Ρ ΠΌΠ΅Π½Ρ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΈΡ
ΠΏΡΠΎΠ±Π»Π΅ΠΌ.
Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΎΠ², ΡΡΠΎΠ±Ρ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΡΡΠΎ, Π½ΠΎ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ
Π½Π΅ ΡΠ΅ΡΠΈΠ» ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ (ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ±ΠΎΡΠΊΠΈ Π² Webpack, ΡΠ°Π±ΠΎΡΠ΅Π΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ Yarn, ΡΡΡΠ»ΠΊΠ° npm...)
Π― ΠΏΠΎΠΏΡΡΠ°Π»ΡΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΎΡΠ»Π°Π΄ΠΊΡ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π»ΠΈ Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ Π΄Π²Π΅ ΠΊΠΎΠΏΠΈΠΈ ΠΠ‘ React (ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ console.log(window.React1 === window.React2)
ΠΈΠ· Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° React), Π½ΠΎ ΠΎΠ½ ΠΎΡΠ΅Π½ΠΈΠ²Π°Π΅ΡΡΡ ΠΊΠ°ΠΊ true
!
( ΠΠ§ΠΠΠ¬ ΠΠΠΠ₯ΠΠ ΠΎΠ±Ρ
ΠΎΠ΄Π½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ΅ΠΉΡΠ°Ρ, - ΡΡΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Ρ
ΡΠΊΠΈ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ΅ΠΊΠ²ΠΈΠ·ΠΈΡΠ°: <GBAEmulator useEffect={useEffect} />
... Π½ΠΎ Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½Π΅ Ρ
ΠΎΡΡ Π΅Π³ΠΎ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΡΡ)
Π£ ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ Π΅ΡΡΡ ΠΈΠ΄Π΅ΠΈ, ΠΊΠ°ΠΊ ΡΡΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ?
ΠΠΎΠΉ ΠΏΡΠΎΠ΅ΠΊΡ Ρ ΠΎΡΠΊΡΡΡΡΠΌ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ, ΠΈ Ρ Π΄ΠΎΠ±Π°Π²Π»ΡΡ ΡΡΠΎΡ Π½ΠΎΠ²ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π² ΡΡΡ Π²Π΅ΡΠΊΡ: https://github.com/macabeus/klo-gba.js/blob/ac18f4d42b122c333622f502947135c2de217ce2/react-gbajs/src/index.js#L251 -L274
ΠΡΠ΅ΠΌ ΠΏΡΠΈΠ²Π΅Ρ,
Π£ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ (myApp), ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ (myDepPackage). ΠΠ±Π° ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ webpack Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ° ΡΠ±ΠΎΡΠΊΠΈ, ΠΈ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΠΆΠ΅, Ρ ΠΌΠ΅Π½Ρ Π±ΡΠ»Π° ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΎΡΠΈΠ±ΠΊΠ°. ΠΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π²ΡΡΠ΅ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ Π½Π΅ ΡΡΠ°Π±ΠΎΡΠ°Π»ΠΎ Π΄Π»Ρ ΠΌΠ΅Π½Ρ. Π§ΡΠΎ ΠΎΠ½ ΡΠ΄Π΅Π»Π°Π», ΡΠ°ΠΊ ΡΡΠΎ Π·Π°ΡΡΠ°Π²ΠΈΠ» Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅Ρ ΠΠ Π²ΠΊΠ»ΡΡΠ°ΡΡ ΡΠ΅Π°ΠΊΡΠΈΡ Π² ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ (myDepPackage). ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½Π°Ρ ΡΡΡΠΎΠΊΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΡ ΠΌΠ½Π΅ ΠΏΡΠΈΡΠ»ΠΎΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° (ΠΈΠ· myDepPackage), ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π½ΠΈΠΆΠ΅:
externals: {
react: "react",
},
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ·Π½Π°ΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΎ ΠΎΠΏΡΠΈΠΈ Β«Π²Π½Π΅ΡΠ½ΠΈΠ΅Β» Π·Π΄Π΅ΡΡ: https://webpack.js.org/configuration/externals/#externals
@tsevdos ΠΠΎΠΎΡΠ΅Π½Ρ ΡΠΏΠ°ΡΠΈΠ±ΠΎ!!! β€οΈ
ΠΡΠΎ ΡΠ΅ΡΠΈΠ»ΠΎ ΠΌΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ Ρ ΡΠΊΠ°Π·Π°Π» Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ.
ΠΠ»Ρ Π½Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡΡΠ°Π»Π°ΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Ρ Π½Π°Ρ Π΅ΡΡΡ Π²ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ React, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π·Π°Π³ΡΡΠΆΠ°Π΅ΡΡΡ Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ ΠΈΠ· ΡΠΎΡΡΠΊΠΎΠ΄Π° WordPress ΠΈ ΠΌΠΎΠ½ΡΠΈΡΡΠ΅ΡΡΡ Π² div ΡΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΌ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠΌ. ΠΠ° Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΡΡΠ°Π½ΠΈΡΠ°Ρ Ρ Π½Π°Ρ Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΈ ΠΎΠ½ΠΈ ΡΠ°Π±ΠΎΡΠ°Π»ΠΈ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ, ΠΏΠΎΠΊΠ° ΠΌΡ Π½Π΅ Π½Π°ΡΠ°Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Ρ ΡΠΊΠΈ.
ΠΠ½ Π±ΡΠ΄Π΅Ρ ΠΆΠ°Π»ΠΎΠ²Π°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΌΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ Π±ΡΠ»ΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ ΡΠΎΡΡΠΊΠΎΠ΄ WP, ΡΡΠΎΠ±Ρ ΡΠΊΡΠΈΠΏΡ Π·Π°Π³ΡΡΠΆΠ°Π»ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·.
ΠΠ²ΡΡΠΈΡ ΠΏΡΠΎΡΡΠΎ ΠΈ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, Π½ΠΎ ΠΏΠΎΠ½ΡΡΡ Π±ΡΠ»ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎ! ΠΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ ΠΎΠ½ Π΄Π΅Π»Π°Π» ΡΡΠΎ ΠΈ ΡΠ°Π±ΠΎΡΠ°Π» Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ, ΠΏΠΎΠΊΠ° ΠΌΡ Π½Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Ρ ΡΠΊΠΈ.
ΠΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ, ΡΡΠΎ Π½Π° Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΡΡΠ°Π½ΠΈΡΠ°Ρ Ρ Π½Π°Ρ Π΅ΡΡΡ Π΄ΡΡΠ³ΠΈΠ΅ β Π΄ΡΡΠ³ΠΈΠ΅ β ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ Π²ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ Ρ ΡΠΊΠΈ, ΠΈ ΠΎΠ½ΠΈ ΡΠΎΠΆΠ΅ Π·Π°Π³ΡΡΠΆΠ°ΡΡ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠΊΡΠΈΠΏΡ/ΡΠ±ΠΎΡΠΊΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ React... Π½ΠΎ ΡΠΎΠ³Π΄Π° ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΏΡΠΎΡΡΠΎ ΠΎΡΠ»ΠΈΡΠ½ΠΎ! ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡΡΠ°Π»Π°ΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΎΠ΄Π½Π° ΠΈ ΡΠ° ΠΆΠ΅ ΡΠ±ΠΎΡΠΊΠ° Π·Π°Π³ΡΡΠΆΠ°Π»Π°ΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°Π·Π°, ΠΈ ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ Ρ ΡΠΊΠΈ .
Π§ΡΠΎ ΡΡΠ°Π±ΠΎΡΠ°Π»ΠΎ Π΄Π»Ρ ΠΌΠ΅Π½Ρ, ΡΠ°ΠΊ ΡΡΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ Π΄Π²ΡΡ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈΠ· ΡΡΠΎΠΉ ΡΠ΅ΠΌΡ.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ( ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ @apieceofbart )
resolve: {
alias: {
react: resolve('./node_modules/react')
}
}
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ( ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ @tsevdos )
externals:
react: 'react'
}
Π£ ΠΌΠ΅Π½Ρ Π±ΡΠ»Π° ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ html-webpack-plugin
, ΠΈ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» index.html
, Π²ΡΠ³Π»ΡΠ΄ΡΡΠΈΠΉ ΠΊΠ°ΠΊ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΠΎΡ template
Π΄ΠΎ HtmlWebpackPlugin
.
// webpack.config.js
plugins: [
new HtmlWebpackPlugin({
template: "./public/index.html"
})
],
<!-- public/index.html -->
<html>
<head>
<title>React App</title>
</head>
<body>
<div id="root"></div>
<script src="main.js"></script>
</body>
</html>
Π― ΠΏΠΎΠ½ΡΠ», ΡΡΠΎ ΠΏΠ»Π°Π³ΠΈΠ½ Π²Π²ΠΎΠ΄ΠΈΠ» <script type="text/javascript" src="main.js"></script>
ΡΡΠ°Π·Ρ ΠΏΠΎΡΠ»Π΅ <div id="root"></div>
.
ΠΡΠ°ΠΊ, ΠΊΠΎΠ³Π΄Π° Ρ ΠΎΡΠΊΡΡΠ» ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΠΈ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ html Π²ΡΠ³Π»ΡΠ΄Π΅Π» ΡΠ°ΠΊ.
<html>
<head>
<title>React App</title>
</head>
<body>
<div id="root"></div>
<script src="main.js"></script>
<script type="text/javascript" src="main.js"></script> <!-- injected from html-webpack-plugin -->
</body>
</html>
ΠΠ»Ρ ΠΌΠ΅Π½Ρ ΡΡΠΎ Π²ΡΠ·ΡΠ²Π°Π»ΠΎ Invalid Hook Call Warning
.
ΠΠ½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ ΡΠ΄Π°Π»ΠΈΡΡ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, ΡΠ΄Π°Π»ΠΈΠ² <script src="main.js"></script>
, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.
<!-- public/index.html -->
<html>
<head>
<title>React App</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
Π― Π½Π°Π΄Π΅ΡΡΡ, ΡΡΠΎ ΡΡΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ ΠΊΠΎΠΌΡ-ΡΠΎ Π½Π°ΠΉΡΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅!
ΠΠΌΠ΅ΠΉΡΠ΅ Π² Π²ΠΈΠ΄Ρ, ΡΡΠΎ ΡΠ°ΠΊΠΈΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π²ΡΠ·Π²Π°Π½Ρ Π·Π°Π²ΠΈΡΠΈΠΌΡΠΌΠΈ ΠΎΡ React Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΠΌΠΈ. Π ΠΌΠΎΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» ΡΠ°Π·Π½ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ @emotion/core
ΠΈ @emotion/styled
.
ΠΡΠΈΠ²Π΅Ρ,
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π±Π΅Π· ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΡ β ΡΡΠΎ ΡΠΌΠ΅ΡΠΈΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΠΎ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΠ° webpack Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΠΌΠΈ custom- cra ΠΈ react -app-rewired . Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΡΠΎΠ·Π΄Π°Π² ΡΠ°ΠΉΠ» config-overrides.js Ρ:
const { override, addWebpackAlias } = require('customize-cra');
const path = require('path');
module.exports = override(
addWebpackAlias({
react: path.resolve(path.join(__dirname, './node_modules/react')),
}),
);
Π£ ΠΌΠ΅Π½Ρ Π±ΡΠ»Π° ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π½Π° ΡΠ°ΠΉΡΠ΅ Gatsby, Ρ Π·Π°ΠΏΡΡΡΠΈΠ» npm install ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΠ»ΡΡ Π΄ΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ Π²Π΅ΡΡΠΈΠΈ Gatsby, ΠΈ Π²ΡΠ΅ ΡΡΠΎ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΎ.
ΠΡΠ»ΠΈ Ρ Π²Π°Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ Π·Π°ΠΏΡΡΠΊΠΎΠΌ ΡΡΡΠ»ΠΈΠ²ΠΎΠ³ΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ yarn or npm test
(ΠΊΠ°ΠΊ Π±ΡΠ»ΠΎ Ρ ΠΌΠ΅Π½Ρ) ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ react-test-renderer
, ΡΠ±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ react-test-renderer
ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΡΠΎΠΉ ΠΆΠ΅ Π²Π΅ΡΡΠΈΠΈ react
ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡ.
// Package.json
{
...
"react" : "16.8.3",
...
}
ΠΡΠΏΠΎΠ»Π½ΠΈΡΡ yarn add [email protected]
Π£ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°, ΠΈ Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΠ» Π²ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ react
ΠΈ react-dom
ΠΊΠ°ΠΊ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅, ΡΠ°ΠΊ ΠΈ Π² ΠΎΡΠ½ΠΎΠ²Π½ΡΡ
ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ
. ΠΎΠ½ΠΈ ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊΠΈΠ΅ ΠΆΠ΅, Π½ΠΎ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π»ΠΈ.
ΠΠ΄Π½Π°ΠΊΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ @apieceofbart ΡΡΠ°Π±ΠΎΡΠ°Π»ΠΎ Π΄Π»Ρ ΠΌΠ΅Π½Ρ.
@apieceofbart , ΡΡ ΡΠΏΠ°Ρ ΠΌΠΎΠΉ Π΄Π΅Π½Ρ <3
Π§ΡΠΎ ΡΡΠ°Π±ΠΎΡΠ°Π»ΠΎ Π΄Π»Ρ ΠΌΠ΅Π½Ρ, ΡΠ°ΠΊ ΡΡΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ Π΄Π²ΡΡ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈΠ· ΡΡΠΎΠΉ ΡΠ΅ΠΌΡ.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ( ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ @apieceofbart )
resolve: { alias: { react: resolve('./node_modules/react') } }
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ( ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ @tsevdos )
externals: react: 'react' }
Π’ΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅. ΠΠ½Π΅ Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΠΎΠ±Π° ΡΡΠΈΡ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ, ΡΡΠΎΠ±Ρ Π·Π°ΡΡΠ°Π²ΠΈΡΡ Π΅Π³ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ. ΠΠΎΠ΅ ΠΎΠ±ΡΡΡΠ½Π΅Π½ΠΈΠ΅ ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Π²ΡΠΎΡΠ°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²Π½Π΅ΡΠ½ΡΡ ΡΠ΅Π°ΠΊΡΠΈΡ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ Β«ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡΒ», Π° ΠΏΠ΅ΡΠ²Π°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΈΠΌΡ Β«ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡΒ» Π½Π° ΠΏΠ°ΠΏΠΊΡ Β«node_modules/reactΒ» Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΠΎΠ±Π° ΠΎΠ½ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡ, ΡΡΠΎΠ±Ρ Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΌΠΎΡΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ.
Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ Π΄Π»Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ Π»ΡΠ΄Π΅ΠΉ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ , ΡΡΠΎ Ρ Π½Π΅ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ.
Π§ΡΠΎ ΡΡΠ°Π±ΠΎΡΠ°Π»ΠΎ Π΄Π»Ρ ΠΌΠ΅Π½Ρ, ΡΠ°ΠΊ ΡΡΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ Π΄Π²ΡΡ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈΠ· ΡΡΠΎΠΉ ΡΠ΅ΠΌΡ.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ( ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ @apieceofbart )resolve: { alias: { react: resolve('./node_modules/react') } }
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ( ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ @tsevdos )
externals: react: 'react' }
Π’ΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅. ΠΠ½Π΅ Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΠΎΠ±Π° ΡΡΠΈΡ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ, ΡΡΠΎΠ±Ρ Π·Π°ΡΡΠ°Π²ΠΈΡΡ Π΅Π³ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ. ΠΠΎΠ΅ ΠΎΠ±ΡΡΡΠ½Π΅Π½ΠΈΠ΅ ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Π²ΡΠΎΡΠ°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²Π½Π΅ΡΠ½ΡΡ ΡΠ΅Π°ΠΊΡΠΈΡ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ Β«ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡΒ», Π° ΠΏΠ΅ΡΠ²Π°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΈΠΌΡ Β«ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡΒ» Π½Π° ΠΏΠ°ΠΏΠΊΡ Β«node_modules/reactΒ» Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΠΎΠ±Π° ΠΎΠ½ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡ, ΡΡΠΎΠ±Ρ Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΌΠΎΡΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ.
Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ Π΄Π»Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ Π»ΡΠ΄Π΅ΠΉ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ , ΡΡΠΎ Ρ Π½Π΅ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ.
ΠΡΠΎΡΠΎΠΉ ΠΏΡΠ½ΠΊΡ Π²Π°ΠΆΠ΅Π½!
ΠΡΠ»ΠΈ ΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ, Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΠ±ΠΎΡΠΊΠΈ ΡΠ΅Π°ΠΊΡΠΈΡ Π±ΡΠ΄Π΅Ρ ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π° Π²ΠΌΠ΅ΡΡΠ΅, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΡΠΎ Π²Π½ΡΡΡΠ΅Π½Π½ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ.
ΠΎΡΠ΅Π½Ρ Π»ΡΠ±Π»Ρ @apieceofbart !!!! Π― ΡΠΎΠ±ΠΈΡΠ°Π»ΡΡ ΠΏΡΠΎΠ±ΠΈΡΡ ΡΡΠΎΠ» ΡΠ²ΠΎΠΈΠΌ Π½ΠΎΠ³ΠΎΠΉ ΡΠ΅ΡΠ΅Π· ΡΡΠ΅Π½Ρ
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΎΠ±Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡΡΠΈ Π΄Π»Ρ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠΎΠ² Π΄ΠΎ ΡΠΈΡ ΠΏΠΎΡ Π½Π΅Ρ. Π£ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΠΊΠΎΡΠ½Π΅Π²ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΡΠ΅Π°ΠΊΡΠΈΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΡΡΠ΅Π±ΡΠ΅Ρ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² Ρ Π΄ΡΡΠ³ΠΎΠΉ ΡΠ΅Π°ΠΊΡΠΈΠ΅ΠΉ. ΠΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²Π½Π΅ΡΠ½ΡΡ Π²Π΅ΡΡΠΈΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π΅ΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ ΡΠΎ ΡΠ²ΠΎΠΈΠΌΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠΌΠΈ. ΠΡΠ»ΠΈ ΠΌΡ ΠΏΠΎΠ΄ΡΠΎΠ»ΠΊΠ½Π΅ΠΌ ΠΈΡ ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΈ ΡΠΎΠΉ ΠΆΠ΅ Π²Π½Π΅ΡΠ½Π΅ΠΉ Π²Π΅ΡΡΠΈΠΈ, ΡΠΎ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² ΠΏΠΎΡΠ΅ΡΠΏΠΈΡ ΠΊΡΠ°Ρ , ΠΈ Π±ΡΠ΄Π΅Ρ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ ΡΡΡ Π²Π΅ΡΡΠΈΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ Π±ΡΠ΄Π΅Ρ Π·Π°Π²ΠΈΡΠ΅ΡΡ ΠΎΡ ΡΡΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ.
ΠΡΡΡ ΠΈΠ΄Π΅ΠΈ?
ΠΡΡΡ Π»ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ΅Π°Π³ΠΈΡΡΡΡΠΈΡ Ρ ΡΠΊΠΎΠ² Π²ΠΌΠ΅ΡΡΠ΅ ΡΠΎ ΡΡΡΠ»ΠΊΠΎΠΉ npm, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΡ ΠΈΠ· CRA?
@tschellenbach
Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ craco Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΠΈΡΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ CRA Π±Π΅Π· ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΡ.
https://github.com/gsoft-inc/craco
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ @tsevdos Ρ ΡΠ΅ΡΠΈΠ» ΡΠ²ΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΈ ΡΠ΄Π΅Π»Π°Π» ΡΡΠ΅Π±Π½ΠΈΠΊ ΠΏΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΠ°ΠΊΠ΅ΡΠ° React: https://youtu.be/esyS87NfBOw
Π£ ΠΌΠ΅Π½Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° Π½Π΅ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ»ΠΎΡΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ±ΠΎΡΡΠΈΠΊ ΠΏΠΎΡΡΠ»ΠΎΠΊ. Π― ΡΠΌΠΎΠ³ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΡΡΠΎ, ΡΠΊΠ°Π·Π°Π² ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌ Π² package.json ΠΌΠΎΠ΅Π³ΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ³Π»ΡΠ΄Π΅Π» ΡΠ°ΠΊ:
"alias": {
"react": "./node_modules/react",
"react-dom": "./node_modules/react-dom"
},
ΠΠΎΠ·Π½ΠΈΠΊΠ°ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΠΏΠΎΠΏΡΡΠΊΠΎΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠΎΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ React (Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΠ΅ Π² Ρ ΡΠΊΠ°Ρ ) Π² ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π² ΡΠΎΠΌ ΠΆΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ΅ Ρ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΠ°ΠΊΠ΅ΡΠΎΠΌ json. Π‘ΡΡΡΠΊΡΡΡΠ° ΡΠ°ΠΉΠ»Π° Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
- javascript
- src
- ComponentIWantToUse.tsx
- package.json
- electron
- src
- IwantToUseItHere.tsx
- package.json
ΠΠ±Π° package.json Π²ΠΊΠ»ΡΡΠ°ΡΡ Π² ΡΠ΅Π±Ρ response ΠΈ react-dom Π² package.json, Π½ΠΎ ΡΡΠΎ ΠΎΠ΄Π½ΠΈ ΠΈ ΡΠ΅ ΠΆΠ΅ Π²Π΅ΡΡΠΈΠΈ, ΠΈ Ρ Π½Π΅ Π²ΠΈΠΆΡ, ΡΡΠΎΠ±Ρ ΠΎΠ½ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π» Π΄Π²Π΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΠ΅Π°ΠΊΡΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° Ρ Π΄Π΅Π»Π°Ρ npm ls react
. ΠΡΡΡ ΠΈΠ΄Π΅ΠΈ?
Π ΠΠΠΠΠ’ΠΠ ΠΠΠΠ’Π¬: ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ @ewan-m ΡΡΠ°Π±ΠΎΡΠ°Π»ΠΎ!
Π’Π°ΠΊ ΡΡΠΎ Ρ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ ΡΠΎ ΡΡΡΠ°Π½Π½ΡΠΌ ΡΠ»ΡΡΠ°Π΅ΠΌ, Ρ Π΄ΡΠΌΠ°Ρ. Π‘ΡΠΎΡΠΎΠ½Π½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°, ΠΊ ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΠ΅ΡΠ°Π½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΊΠ»Π°ΡΡΠΎΠ². ΠΠΎΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π² ΠΌΠΎΠ΅ΠΉ ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Π΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½Ρ. ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΊΠ»Π°ΡΡΠ° ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ ΠΊΠ°ΠΊ ΠΌΠ°ΠΊΠ΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΠΌΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΊΠ°ΠΊ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ. Π― ΡΡΠΈΡΠ°Ρ, ΡΡΠΎ ΡΡΠΎ ΡΠΎ, ΡΡΠΎ Π²ΡΠ·ΡΠ²Π°Π΅Ρ Β«ΠΡΠΈΠ±ΠΊΠ°: Π½Π΅Π²Π΅ΡΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² Π»ΠΎΠ²ΡΡΠΊΠΈΒ». ΠΠ°ΠΊ ΠΌΠ½Π΅ ΠΎΠ±ΠΎΠΉΡΠΈ ΡΡΠΎ, ΡΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Ρ ΡΠΊΠΈ, ΠΌΠ½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ ΠΌΠΎΠΉ Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΊΠ»Π°ΡΡΠ°?
@GrandathePanda Π‘ΠΌΠ΅ΡΠΈΠ²Π°Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠΎΠ² ΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΠΌΠ΅ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ. ΠΡΠ»ΠΈ ΠΊΠ»Π°ΡΡ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π», ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ·ΡΠ²Π°Π΅Ρ Ρ ΡΠΊ, Π² ΡΡΠΎΠΌ Π½Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅, ΡΡΠΎ Π²Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ΄Π΅Π»Π°ΡΡ, ΡΡΠΎ Π²ΡΠ·Π²Π°ΡΡ Ρ ΡΠΊ ΠΏΡΡΠΌΠΎ ΠΈΠ· ΠΊΠ»Π°ΡΡΠ°.
Π₯ΠΎΡΠΎΡΠΎ, @JeremyGrieshop , ΡΠΎΠ³Π΄Π° ΠΌΠ½Π΅ Π΅ΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠΎΠΈΡ ΠΊΠΎΠ΅-ΡΡΠΎ ΠΈΠ·ΡΡΠΈΡΡ, Π΅ΡΠ»ΠΈ Ρ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·ΠΈΡΡΡ Π±Π΅Π· ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠΎΡΠΎΠ½Π½Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°, ΠΎΠ½ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ ΠΈ ΠΌΠΎΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡ. ΠΡΠ»ΠΈ Π±Ρ ΠΌΠ½Π΅ ΠΏΡΠΈΡΠ»ΠΎΡΡ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡΡ, ΡΡΠΎ ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ Π΄ΡΡΠ³ΡΡ Π²Π΅ΡΡΠΈΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π² ΡΠ²ΠΎΠ΅ΠΌ ΠΏΠ°ΠΊΠ΅ΡΠ΅.
Π₯ΠΎΡΠΎΡΠΎ, @JeremyGrieshop , ΡΠΎΠ³Π΄Π° ΠΌΠ½Π΅ Π΅ΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠΎΠΈΡ ΠΊΠΎΠ΅-ΡΡΠΎ ΠΈΠ·ΡΡΠΈΡΡ, Π΅ΡΠ»ΠΈ Ρ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·ΠΈΡΡΡ Π±Π΅Π· ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠΎΡΠΎΠ½Π½Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°, ΠΎΠ½ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ ΠΈ ΠΌΠΎΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡ. ΠΡΠ»ΠΈ Π±Ρ ΠΌΠ½Π΅ ΠΏΡΠΈΡΠ»ΠΎΡΡ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡΡ, ΡΡΠΎ ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ Π΄ΡΡΠ³ΡΡ Π²Π΅ΡΡΠΈΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π² ΡΠ²ΠΎΠ΅ΠΌ ΠΏΠ°ΠΊΠ΅ΡΠ΅.
ΠΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ, ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅ npm ls react react-dom
Π² ΡΠ²ΠΎΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΡΡΠΎΠ±Ρ ΡΠ·Π½Π°ΡΡ, Π΅ΡΡΡ Π»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²Π΅ΡΡΠΈΠΉ. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ ΡΡΠΎΡΠΎΠ½Π½Π΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π΅ΡΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ ΠΎΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ.
@JeremyGrieshop ΠΡΠ°ΠΊ, ΠΏΠΎΡ ΠΎΠΆΠ΅, ΡΡΠΎ ΠΌΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ 16.12.0 Π΄Π»Ρ ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ dom, Π° ΡΡΠΎΡΠΎΠ½Π½Π΅Π΅ (ΡΠ»Π°ΡΡΠΈΡΠ½ΡΠΉ ΠΏΠΎΠΈΡΠΊΠΎΠ²ΡΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ) ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ 16.8.0 Π΄Π»Ρ ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ dom. ΠΡΠ»ΠΈ Ρ ΠΏΡΠ°Π², ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠΎΠΌ, ΡΡΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΠΎΡ ΡΡΠΎΡΠΎΠ½Π½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° 16.8.0 ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ 16.12.0, ΡΡΠΎ Π²ΡΠ·ΠΎΠ²Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ? ΠΠ½ΠΈ ΡΠ°ΠΊΠΆΠ΅ ΡΠ²Π»ΡΡΡΡΡ ΠΌΠΎΠ½ΠΎΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠ΅ΠΌ lerna, ΡΡΠΎ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎ ΡΡΠ»ΠΎΠΆΠ½ΡΠ΅Ρ ΡΡΠΎ Π΅ΡΠ΅ Π±ΠΎΠ»ΡΡΠ΅ ΠΏΠΎΡΠ»Π΅ ΠΏΡΠΎΡΡΠ΅Π½ΠΈΡ Π²ΡΠ΅Ρ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΡ Π²ΡΡΠ΅ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅Π². ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΈΠ·-Π·Π° Ρ ΡΠΊΠ° useStyles, ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π² materialui, ΠΎΠ½ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ withStyles hoc Π΄Π»Ρ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΠΈ, ΠΈ Ρ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΠ΅ΠΌ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ Ρ ΡΠΎΠ±ΠΈΡΠ°ΡΡΡ ΠΏΠΎΠΉΡΠΈ ΠΏΠΎ ΡΡΠΎΠΌΡ ΠΏΡΡΠΈ. ΠΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² webpack ΠΈ/ΠΈΠ»ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠ΅ json, ΡΠΏΠΎΠΌΡΠ½ΡΡΡΠ΅ Π²ΡΡΠ΅, Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΊΠ°ΠΆΡΡΡΡ Π±ΠΈΠ½ΡΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Π²Π΅ΡΠΆΠ΅Π½ ΠΏΠΎΠ»ΠΎΠΌΠΊΠ΅, ΡΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ hoc, Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ Ρ ΡΠΊΠΈ Π²ΡΡΡΠ½ΡΡΡ, ΠΊΠ°ΠΊ ΡΠΎΠ·ΡΠ΅ΡΡ ΠΏΠ΅ΡΠ΅Π΄ Π»ΠΈΡΠΎΠΌ ΡΡΠΎΠ»ΡΠΊΠΈΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΏΡΠΈΠ΄ΠΈΡΠΎΠΊ ΠΊ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ.
@GrandathePanda ΠΠΠ₯Π, Π²Π°ΡΠΈ Π²Π°ΡΠΈΠ°Π½ΡΡ: (1) Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΡΡΠ΅ΡΡΡ ΡΡΠΎΡΠΎΠ½Ρ Π»ΠΈΠ±ΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ ΡΠ²ΠΎΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ Π΄ΠΎ 16.12, Π»ΠΈΠ±ΠΎ ΠΏΠΎΠΏΡΠΎΡΠΈΡΡ ΠΈΡ ΡΠ΅ΡΠΈΡΡ, ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π»ΠΈ ΠΎΠ½Π° Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΠ΄Π½ΠΎΡΠ°Π½Π³ΠΎΠ²ΠΎΠΉ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π±ΠΎΠ»ΡΡΠ΅, ΡΠ΅ΠΌ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ; (2) ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ 16.8 Π² ΡΠ²ΠΎΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΠΎΠ΄Π½ΠΈ ΠΈ ΡΠ΅ ΠΆΠ΅ Π²Π΅ΡΡΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ; (3) Π£Π΄Π°Π»ΠΈΡΠ΅ ΡΠ²ΠΎΡ ΠΊΠΎΠΏΠΈΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ:
rimraf node_modules/search-ui/node_modules/react && rimraf node_modules/search-ui/node_modules/react-dom
ΠΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΡ Π²ΡΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ Π² Β«ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠ±ΠΎΡΠΊΡΒ» ΠΈ Β«ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΠΉ Π·Π°ΠΏΡΡΠΊΒ» Π² ΡΠ°ΡΡΠΈ Β«ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π²Β» Π²Π°ΡΠ΅Π³ΠΎ package.json (ΡΡΠΎ Ρ ΠΈ Π΄Π΅Π»Π°Ρ Π² Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ). ΠΠ΅Π΄ΠΎΡΡΠ°ΡΠΊΠΎΠΌ (3), Ρ ΠΏΠΎΠ»Π°Π³Π°Ρ, ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎ, ΡΡΠΎ ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΡΠΎ-Π»ΠΈΠ±ΠΎ ΡΡΡΠ°ΡΠ΅Π²ΡΠ΅Π΅ ΠΌΠ΅ΠΆΠ΄Ρ 16.8 ΠΈ 16.12.
ΠΡΠ΅ΠΌ ΠΏΡΠΈΠ²Π΅Ρ,
Π£ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ (myApp), ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ (myDepPackage). ΠΠ±Π° ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ webpack Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ° ΡΠ±ΠΎΡΠΊΠΈ, ΠΈ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΠΆΠ΅, Ρ ΠΌΠ΅Π½Ρ Π±ΡΠ»Π° ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΎΡΠΈΠ±ΠΊΠ°. ΠΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π²ΡΡΠ΅ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ Π½Π΅ ΡΡΠ°Π±ΠΎΡΠ°Π»ΠΎ Π΄Π»Ρ ΠΌΠ΅Π½Ρ. Π§ΡΠΎ ΠΎΠ½ ΡΠ΄Π΅Π»Π°Π», ΡΠ°ΠΊ ΡΡΠΎ Π·Π°ΡΡΠ°Π²ΠΈΠ» Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅Ρ ΠΠ Π²ΠΊΠ»ΡΡΠ°ΡΡ ΡΠ΅Π°ΠΊΡΠΈΡ Π² ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ (myDepPackage). ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½Π°Ρ ΡΡΡΠΎΠΊΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΡ ΠΌΠ½Π΅ ΠΏΡΠΈΡΠ»ΠΎΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° (ΠΈΠ· myDepPackage), ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π½ΠΈΠΆΠ΅:
externals: { react: "react", },
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ·Π½Π°ΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΎ ΠΎΠΏΡΠΈΠΈ Β«Π²Π½Π΅ΡΠ½ΠΈΠ΅Β» Π·Π΄Π΅ΡΡ: https://webpack.js.org/configuration/externals/#externals
@tsevdos Ρ Π»ΡΠ±Π»Ρ ΡΠ΅Π±Ρ. ΠΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΠ»ΠΈ ΠΊΠΎΠ½Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌ Π΄Π½ΡΠΌ Π½Π°ΠΏΡΡΠΆΠ΅Π½Π½ΡΡ Ρ Π»ΠΎΠΏΠΎΡ. Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ.
ΠΡΠ΅ΠΌ ΠΏΡΠΈΠ²Π΅Ρ,
Π― ΠΏΡΡΠ°ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Ρ ΡΠΊ Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ΅, ΡΡΠΎΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½ ΠΈΠ· gatsby-browser.js .
ΠΠ°ΠΊΠΎΠ²ΠΎ ΡΠ΅ΠΊΡΡΠ΅Π΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅?
Π― ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΡΡ ΠΎΡΠΈΠ±ΠΊΡ:
ΠΠ΅ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½Π½ΡΠΉ ΠΎΡΠΊΠ°Π· (ΠΎΡΠΈΠ±ΠΊΠ°): Π½Π΅Π²Π΅ΡΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² Π»ΠΎΠ²ΡΡΠΊΠΈ. Π₯ΡΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π²Π½ΡΡΡΠΈ ΡΠ΅Π»Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΡΠΈ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΠΏΡΠΈΡΠΈΠ½:
- Π£ Π²Π°Ρ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π½Π΅ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ Π²Π΅ΡΡΠΈΠΈ React ΠΈ ΡΠ΅Π½Π΄Π΅ΡΠ΅ΡΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, React DOM).
- ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ Π½Π°ΡΡΡΠ°Π΅ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° Ρ ΡΠΊΠΎΠ².
- Π£ Π²Π°Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ React Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.
Π‘ΠΌ. https://fb.me/react-invalid-hook-call ΡΠΎΠ²Π΅ΡΡ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΡΠ»Π°ΠΆΠΈΠ²Π°ΡΡ ΠΈ ΡΡΡΡΠ°Π½ΡΡΡ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.
ΠΡΠΎ ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠ΄Π°:
import React from 'react';
import PropTypes from 'prop-types';
import { Provider } from 'react-redux';
import configureStore from './src/utils/configure-store';
import { useApiResources } from './src/hooks/use-api-resources';
const RootWrapper = ({ element }) => {
const resources = useApiResources();
const store = configureStore();
return <Provider store={store}>{element}</Provider>;
};
RootWrapper.propTypes = {
element: PropTypes.node.isRequired,
};
export default RootWrapper;
ΠΠ°ΠΊΠΎΠ²ΠΎ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅?
Π₯ΡΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π±Π΅Π· ΠΎΡΠΈΠ±ΠΎΠΊ, ΠΈΠ»ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Ρ ΠΏΠΎΠ»Π΅Π·Π½ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ°Ρ .
ΠΠ΅ΡΡΠΈΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ react ΠΈ react-dom: 16.12.0
@leejh3224 Π±ΠΎΠ»ΡΡΠΎΠ΅ ΡΠΏΠ°ΡΠΈΠ±ΠΎ, ΡΡΠ²Π°ΠΊ! ΠΏΠΎΡΠ»Π΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΡΠ°ΡΠΎΠ² ΠΏΠΎΠΈΡΠΊΠ° Ρ Π½Π°ΡΠ΅Π» ΡΡΠΎΡ ΠΎΡΠ²Π΅Ρ, ΠΎΠ½ ΡΠ΅ΡΠΈΠ» ΠΌΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.
ΠΡΠΎΡΡΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ» ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ HtmlWebpackPlugin Ρ
inject: true
Π΄ΠΎ inject: 'head'
, ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ ΡΠ΅Π°ΠΊΡΠΈΠΈ ΠΈΡΡΠ΅Π·Π»ΠΈ.
Π― ΡΠΎΠ·Π΄Π°Π» Π²ΠΎΠΏΡΠΎΡ ΠΎ ΡΡΠ΅ΠΊΠ΅ Ρ ΠΌΠΎΠΈΠΌ ΠΎΠΏΡΡΠΎΠΌ, ΠΏΡΡΠ°ΡΡΡ Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ Π΄Π»Ρ ΡΠ΅Ρ , ΠΊΠΎΠΌΡ ΡΠ΄Π°Π»ΠΎΡΡ Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ, Π²Π·Π³Π»ΡΠ½ΡΡΡ Π½Π° ΡΡΠΎ ΠΈ Π΄Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ²Π΅ΡΠΎΠ²?
Π― ΠΏΠ΅ΡΠ΅Π½ΠΎΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ jquery Π½Π° React. Π£ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΡΡΠΈΠ»ΠΈΡΠ° Π΄Π»Ρ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² React Π² jQuery ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ asJqueryPlugin
. ΠΠΎΡ ΡΠ°ΠΉΠ»:
import React from 'react'
import ReactDOM from 'react-dom'
/**
* A way to render React components with props easily with jQuery
*
* ## Register the React Component
*
* In your React Component file, register the component with jQuery using `asJqueryPlugin`
* ```
* const Greeting = ({ person }) => <div>Hello {person}</div>
* asJqueryPlugin('Greeting', Greeting, { person: "Bob" })
* ```
*
* ## Rendering, Selecting and Updating Props with jQuery
*
* Select an element and render using the `react` function
* ```
* $('#greeting').react('Greeting', { person: 'Frank' })
* ```
*/
window.reactRegistry = window.reactRegistry || {}
// This is how React components register themselves as available within jQuery
export default function asJqueryPlugin(componentName, Component) {
window.reactRegistry[componentName] = { Component }
}
if (typeof window.$ !== 'undefined') {
;(function($) {
// Add the plugin function jQuery
$.fn.react = function renderReactIntoElements(componentName, props) {
this.each(function render() {
const entry = window.reactRegistry[componentName || $(this).data('react')]
if (!entry) throw Error(`${componentName} component is not registered.`)
ReactDOM.render(<entry.Component {...props} />, this)
})
return this
}
})(window.$)
}
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΎΡΠ΅ΠΊ Π²Ρ ΠΎΠ΄Π° Π² Webpack, ΠΈ ΡΠ΅ΠΉΡΠ°Ρ ΠΎΠΊΠΎΠ»ΠΎ 3-4 ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΡΡ ΡΠ΅Ρ Π½ΠΈΠΊΡ. Π― ΠΏΠΎΠ»Π°Π³Π°Ρ, ΡΡΠΎ ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½Ρ Π² ΡΠ°Π·Π½ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ ΡΠΎΡΠ΅ΠΊ Π²Ρ ΠΎΠ΄Π°, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°.
ΠΡΠ°ΠΊ, Π΅ΡΠ»ΠΈ Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ Π΄Π²Π΅ ΡΠΎΡΠΊΠΈ Π²Ρ ΠΎΠ΄Π° Π² Webpack:
entry: {
foo: './assets/js/foo',
bar: './assets/js/bar'
}
ΠΠ°ΡΠ΅ΠΌ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΡΡΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΌΡ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌ ΠΎΡΠΊΡΡΡΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ (ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Ρ ΡΠΊΠΈ):
// foo.js
import React from 'react'
import asJqueryPlugin from '../utils/asJqueryPlugin'
const Foo = () => {
const ref = useRef()
return <div ref={ref}>Foo</div>
}
asJqueryPlugin('Foo', Foo)
// bar.js
... same stuff but with Bar component
Π’Π΅ΠΏΠ΅ΡΡ, Π΅ΡΠ»ΠΈ Ρ Π²ΠΊΠ»ΡΡΡ ΠΎΠ±Π΅ Π·Π°ΠΏΠΈΡΠΈ Π½Π° ΠΎΠ΄Π½Ρ ΡΡΡΠ°Π½ΠΈΡΡ ΠΈ ΠΏΠΎΠΏΡΡΠ°ΡΡΡ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡΡ ΠΎΠ±Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΡΠ΅ΡΠ΅Π· ΠΏΠ»Π°Π³ΠΈΠ½ jquery...
<script src="/bundles/foo.js" />
<script src="/bundles/bar.js" />
<script>
$('#foo-container').react('Foo')
$('#bar-container').react('Bar')
</script>
... Π― ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΡΡ ΠΎΡΠΈΠ±ΠΊΡ Ρ ΡΠΊΠΎΠ².
ΠΠ΅ ΡΠ²Π΅ΡΠ΅Π½, ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ Π»ΠΈ ΡΡΠΎ ΡΠ°Π·Π³ΠΎΠ²ΠΎΡΡ ΠΈΠ»ΠΈ Π½Π΅Ρ, Π½ΠΎ, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ (ΡΠΎΠΌΠ½ΠΈΡΠ΅Π»ΡΠ½ΠΎ) Π·Π΄ΡΠ°Π²ΠΎΠΌΡΡΠ»ΡΡΠΈΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΏΠ°ΡΡΡ Π² ΡΠΈΡΡΠ°ΡΠΈΡ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°ΠΌΠΈ ΡΠ΅Π°ΠΊΡΠΈΠΈ.
ΠΠ½Π΅ ΡΡΠΎ ΠΏΠΎΠΌΠΎΠ³Π»ΠΎ - https://github.com/facebook/react/issues/13991#issuecomment -554928373
ΠΠΎ ΠΌΠ½Π΅ ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΈΡΠ»ΠΎΡΡ ΡΠ΄Π°Π»ΠΈΡΡ react
ΠΈ react-dom
ΠΈΠ· Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΡΡ ΠΈΡ
Π² ΠΎΠ΄Π½ΠΎΡΠ°Π½Π³ΠΎΠ²ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ΄Π°Π»ΠΈΡΡ ΠΈ ΠΏΠ΅ΡΠ΅ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΌΠΎΠ΄ΡΠ»ΠΈ ΡΠ·Π»Π°.
ΠΡΠΈΠ²Π΅Ρ,
Π― ΠΏΡΠΎΡΠΈΡΠ°Π» ΡΠ°Π·Π³ΠΎΠ²ΠΎΡ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π² ΠΠ½ΡΠ΅ΡΠ½Π΅ΡΠ΅, ΠΈ Ρ Π²ΡΠ΅ Π΅ΡΠ΅ Π·Π°ΡΡΡΡΠ» Ρ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² ΡΠ΅Π°ΠΊΡΠΈΠΈ.
Π― Π½Π°ΠΆΠΈΠΌΠ°Ρ ΡΡΠΎ ΡΠ΅ΠΏΠΎ Π΄Π»Ρ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΊΠΈ: https://github.com/jeromelegrand/dooliz-lib
Π― Π½Π°Π΄Π΅ΡΡΡ, ΡΡΠΎ ΠΊΡΠΎ-ΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΌΠΎΡΡ ΠΌΠ½Π΅.
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ.
Π― ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ ΠΈ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π½Π°ΡΠ΅Π» Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡΠΌΠΈ Π²ΡΡΠ΅.
ΠΠΊΡΠ°ΡΡΠ΅: Ρ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ ΡΠ²Π΅ΡΠ΅Π½, ΡΡΠΎ Ρ ΠΌΠ΅Π½Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Π° ΡΠ΅Π°Π³ΠΈΡΡΡΡΠ°Ρ Π²Π΅ΡΡΠΈΡ, ΠΈ Ρ ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ react-bootstrap, ΠΊΠΎΡΠΎΡΡΠΉ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Ρ
ΡΠΊΠΈ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π½ΠΈ Ρ ΠΊΠΎΠ³ΠΎ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌ.
ΠΡΠ° ΠΎΡΠΈΠ±ΠΊΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Ρ ΠΌΠ΅Π½Ρ Π½Π° Π±ΡΠΊΡΠ½Π΄Π΅ node.js.
__Π§ΡΠΎ Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΠ» Π² Π²Π΅ΡΡΠΈΡΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ__
Π£ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΠΏΡΡΠΆΠΈ Ρ ΡΠ°Π±ΠΎΡΠΈΠΌΠΈ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π°ΠΌΠΈ, yarn list react
ΠΈΠ»ΠΈ yarn list react-dom
ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ.
Π― Π½Π°ΠΏΠ΅ΡΠ°ΡΠ°Π» ΡΡΠ΅Π±ΡΠ΅ΠΌΡΠΉ ΠΊΠ΅Ρ, ΡΡΠΎΠ±Ρ ΡΠ²ΠΈΠ΄Π΅ΡΡ, ΡΡΠΎ Π±ΡΠ»ΠΎ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½ΠΎ:
for(var key in require.cache) {
if(key.indexOf("react") !== -1 && key.indexOf("index") !== -1) {
console.log(key);
}
}
Π― Π·Π°ΠΏΡΡΠΊΠ°Ρ Π΅Π³ΠΎ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΏΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ ΡΡΠΎ-ΡΠΎ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡ ΠΈΠ· react-bootstrap, ΡΡΠΎ Π²ΡΠ·ΡΠ²Π°Π΅Ρ Ρ ΠΌΠ΅Π½Ρ ΠΎΡΠΈΠ±ΠΊΡ Π½Π΅Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΎΠ³ΠΎ Ρ ΡΠΊΠ°, ΠΈ ΠΎΠ½ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΠ΅Ρ:
C:\web\resourceful\daCore\node_modules\react-dom\index.js
C:\web\resourceful\daCore\node_modules\react\index.js
C:\web\resourceful\daCore\node_modules\react-router-dom\index.js
C:\web\resourceful\daCore\node_modules\react-router-dom\node_modules\react-router\index.js
C:\web\resourceful\daCore\node_modules\react-is\index.js
C:\web\resourceful\daCore\node_modules\mini-create-react-context\dist\cjs\index.js
C:\web\resourceful\daCore\node_modules\react-router\index.js
C:\web\resourceful\daCore\node_modules\@fortawesome\react-fontawesome\index.js
C:\web\resourceful\daCore\node_modules\@tinymce\tinymce-react\lib\cjs\main\ts\index.js
Π§ΡΠΎ, ΠΏΠΎΡ ΠΎΠΆΠ΅, ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π°Π΅Ρ, ΡΡΠΎ Π·Π°Π³ΡΡΠΆΠ΅Π½Π° ΡΠΎΠ»ΡΠΊΠΎ 1 Π²Π΅ΡΡΠΈΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ.
ΠΠ°ΠΊΠΎΠ½Π΅Ρ, Ρ Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΡΡΠΎ Π² node_modules/react-dom/index.js.
console.log("React DOM daCore");
global['React1'] = require('react');
Π ΡΡΠΎ Π΄Π»Ρ node_modules/react-router-dom/cjs/Form.js
require('react-dom');
global['React2'] = require('react');
console.log('#TEST '+(global['React1'] === global['React2']? 'SAME' : 'NOT SAME'));
Π§ΡΠΎ ΠΏΠ΅ΡΠ°ΡΠ°Π΅Ρ SAME
ΠΡΠ±Π°Ρ ΠΈΠ΄Π΅Ρ, ΡΡΠΎ Π΅ΡΠ΅ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ?
Π― ΡΠ°ΠΊΠΆΠ΅ ΠΎΠΏΡΠ±Π»ΠΈΠΊΡΡ ΡΡΠΎ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ react-bootstrap.
ΠΠΎΡΡΠΎΠΌΡ Ρ ΠΏΠΎΡΡΠΈ ΡΠ²Π΅ΡΠ΅Π½, ΡΡΠΎ Π½Π°Π»ΠΈΡΠΈΠ΅ Π΄Π²ΡΡ
ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² React Π·Π΄Π΅ΡΡ Π½Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°. Π― Π΄ΡΠΌΠ°Ρ, ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠΎΠΌ, ΡΡΠΎ Π΅ΡΡΡ Π΄Π²Π° ΡΠ΅Π°Π³ΠΈΡΡΡΡΠΈΡ
_roots_. ΠΡ Π²ΡΠ·ΡΠ²Π°Π΅ΡΠ΅ ReactDOM.render()
Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· Π² ΡΠ°Π·Π½ΡΡ
ΡΠ°ΡΡΡΡ
ΡΡΡΠ°Π½ΠΈΡΡ? ΠΡΠ»ΠΈ ΡΡΠΎ ΡΠ°ΠΊ, Ρ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ·Π²Π°ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ Ρ
ΡΠΊΠΈ Β«ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°ΡΒ» ΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡ Β«ΠΊΠΎΡΠ½ΡΒ» ΠΈ Π»ΠΎΠΌΠ°ΡΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΈΡ
Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ, ΠΈ Π΄Π²Π° ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΈΠΌΠ΅ΡΡ ΠΎΠ±ΡΠΈΠΉ ΠΊΠΎΠ΄. Π― ΡΡΡ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ...
... Π― Π΄ΡΠΌΠ°Ρ, ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠΎΠΌ, ΡΡΠΎ Π΅ΡΡΡ Π΄Π²Π° ΡΠ΅Π°Π³ΠΈΡΡΡΡΠΈΡ _root_. ΠΡ Π²ΡΠ·ΡΠ²Π°Π΅ΡΠ΅
ReactDOM.render()
Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· Π² ΡΠ°Π·Π½ΡΡ ΡΠ°ΡΡΡΡ ΡΡΡΠ°Π½ΠΈΡΡ?
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ @timkindberg , ΡΡΠΎ ΠΏΠΎΠΌΠΎΠ³Π»ΠΎ ΠΌΠ½Π΅ Π½Π°ΠΊΠΎΠ½Π΅Ρ ΡΠ΅ΡΠΈΡΡ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. Π― ΠΏΠΎΠ½ΡΠ», ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ react-tree-walker Π΄Π»Ρ Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π° ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΡ
Π΄Π°Π½Π½ΡΡ
ΠΏΠ΅ΡΠ΅Π΄ ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΌ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³ΠΎΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ReactDOMServer.renderToString
ΠΡΡΡΡΠΎΠ΅ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ° ΡΡΡΡΠ°Π½ΠΈΠ»ΠΎ ΠΎΡΠΈΠ±ΠΊΡ, ΠΈ ΡΠ΅ΠΏΠ΅ΡΡ Ρ ΠΌΠ΅Π½Ρ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ react-ssr-prepass , ΡΡΠΎ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΡΠ΅ΠΏΠ΅ΡΡ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ΅ readme react-tree-walker
Π’Π°ΠΊ ΡΡΠΎ ΡΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π±ΡΠ»ΠΈ Π΄Π²Π° Π²ΡΠ·ΠΎΠ²Π° ReactDOM.render
! ΠΠ° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΡΡΠ° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Ρ react-ssr-prepass ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π΄Π»Ρ ΠΌΠ΅Π½Ρ, ΠΈ ΠΊΠΎΠ³Π΄Π° Suspense ΠΏΡΠΈΠ·Π΅ΠΌΠ»ΡΠ΅ΡΡΡ Π² react-dom/server, Ρ ΠΌΠΎΠ³Ρ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠΈΡΡΡΡ Π½Π° ΡΡΠΎ
Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ react-compare-image
https://github.com/junkboy0315/react-compare-image
Π² ΡΠ²ΠΎΠ΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅ Gutenberg, Π½ΠΎ Ρ ΠΌΠ΅Π½Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΡΡΠ° ΡΡΡΠ°Π½Π½Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, Ρ
ΠΎΡΡ Π²ΡΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΠΊΠΎΠ³Π΄Π° Ρ ΡΠ΄Π°Π»ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ReactCompareImage
ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΡ. Π€ΡΠ½ΠΊΡΠΈΡ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΎΡΠ»ΠΈΡΠ½ΠΎ, Π½ΠΎ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
Π― ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅Π» https://reactjs.org/warnings/invalid-hook-call-warning.html ΠΈ Π½Π΅ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ΠΈΠ· ΡΡΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ.
ΠΠΎΡ ΠΏΠΎΠ»Π½ΡΠΉ ΡΠ°ΠΉΠ» ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ:
``ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΠΏΠ΅ΠΊΡΠΎΡΠ° ΠΈΠ· "./inspector";
ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ {ΡΡΠ°Π³ΠΌΠ΅Π½Ρ} ΠΈΠ· "ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ";
ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ReactCompareImage ΠΈΠ· Β«ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ-ΡΡΠ°Π²Π½ΠΈΡΡ-ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅Β»;
/**
const save = ({ΠΈΠΌΡ_ΠΊΠ»Π°ΡΡΠ°, Π°ΡΡΠΈΠ±ΡΡΡ}) => {
const {
paddingTop,
paddingRight,
paddingBottom,
paddingLeft,
marginTop,
marginRight,
marginBottom,
marginLeft,
border,
borderColor,
borderType,
background,
backgroundImage,
gradient,
dividerColor,
buttonColor,
direction,
beforeImage,
beforeLabel,
afterImage,
afterLabel,
} = attributes;
const style = {
"padding": `${paddingTop}px ${paddingRight}px ${paddingBottom}px ${paddingLeft}px`,
"margin": `${marginTop}px ${marginRight}px ${marginBottom}px ${marginLeft}px`,
"border": `${border}px ${borderType} ${borderColor}`,
"background": background
};
return(
<Fragment>
<ReactCompareImage
leftImage={beforeImage.url}
leftImageLabel={beforeLabel}
rightImage={afterImage.url}
rightImageLabel={afterLabel}
vertical={'vertical' === direction}
sliderLineColor={dividerColor}
/>
</Fragment>
);
};
ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ;
```
Π― ΡΠ°ΠΊΠΆΠ΅ ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ. Π£ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΡΠ΅Π·ΡΠΌΠ΅, ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π½Π° SO: https://stackoverflow.com/questions/60331304/next-js-with-typescript-invalid-hook-call-hooks-can-only-be-call-inside-of-t
Π£ ΠΌΠ΅Π½Ρ ΡΠ°ΠΊΠΆΠ΅ Π΅ΡΡΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ: https://github.com/coler-j/shopify_playground
ΠΠΎΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ β ΡΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ create-react
(Π½Π΅ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½Π½ΠΎΠ΅), ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π»ΠΎ ΠΎΠ±ΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»Π° React. Π― ΡΠΌΠΎΠ³ ΡΠ΅ΡΠΈΡΡ ΡΡΠΎ:
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Rollup Π΄Π»Ρ ΡΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π²ΠΌΠ΅ΡΡΠΎ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ°
ΠΠΎ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΏΡΠΈΡΠΈΠ½Π΅ Ρ Π΅ΡΠ΅ Π½Π΅ ΡΠ°Π·ΠΎΠ±ΡΠ°Π»ΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π½Π΅ΡΠ½ΠΈΡ
ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² Π½Π΅ ΡΠ΄Π°Π»ΡΠ»ΠΎ React ΠΈΠ· ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ.
ΡΠ²Π΅ΡΡΠΊΠ°-config.js
export default [
{
input: 'src/index.js',
output: {
file: pkg.main,
format: 'cjs',
sourcemap: true,
},
plugins: [external(), babel(), resolve(), commonjs(), svgr()],
},
{
input: 'src/index.js',
output: {
file: pkg.module,
format: 'es',
sourcemap: true,
},
plugins: [
alias({
entries: [{ find: '<strong i="12">@components</strong>', replacement: 'src/components' }],
}),
external(),
babel(),
svgr(),
],
},
]
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° craco ΠΈ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π»Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
craco.config.js
const path = require('path')
module.exports = {
webpack: {
alias: {
react: path.resolve(__dirname, './node_modules/react'),
},
},
}
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ @arminyahya Π·Π° ΡΠΎ, ΡΡΠΎ ΡΠΊΠ°Π·Π°Π» ΠΌΠ½Π΅ Π½Π° craco.
Π― ΠΏΡΡΠ°ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Ρ
ΡΠΊΠΈ ΠΏΡΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠ΅ ΡΠ΅Π°ΠΊΡΠΈΠΈ Ρ cdn. ΠΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ (ΡΡΠΎ Π²ΡΡ html-ΡΡΡΠ°Π½ΠΈΡΠ°) Π΄Π°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ $# Hooks can only be called inside of the body of a function component
ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ Example()
. Π― ΡΠ΄Π°Π»ΠΈΠ» Π²ΡΠ΅, Π΄Π°ΠΆΠ΅ ReactDOM, ΠΏΠΎΡΡΠΎΠΌΡ ΡΡΡΠ΄Π½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ, ΡΡΠΎ Ρ ΠΌΠ΅Π½Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠΏΠΈΠΉ React. ΠΡΠΎ ΠΏΡΠΎΡΡΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ?
<!DOCTYPE html>
<html>
<head>
<script crossorigin src="https://unpkg.com/[email protected]/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
</body>
<script type="text/babel">
function Example() {
let [count, setCount] = React.useState(0);
return ( <h1>Hello</h1> );
};
Example();
</script>
</body>
</html>
@samkamin ΠΡΠΎ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ Ρ ΡΠ΅Π±Ρ ΠΠΠ’ ΡΠ΅Π°Π³ΠΈΡΡΡΡΠΈΡ ΠΊΠΎΡΠ½Π΅ΠΉ. ΠΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΎΡΡΠ΅Π½Π΄Π΅ΡΠΈΡΡ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΡΡΠΎ Π²ΡΠ΅ Π΅ΡΠ΅ Ρ ΠΎΡΠΎΡΠ΅Π΅ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΠ΅ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Ρ ΡΠΊΠΈ ΠΏΠΎΠ»Π°Π³Π°ΡΡΡΡ (ΠΈ ΡΠ²ΡΠ·Π°Π½Ρ) Ρ ΠΊΠΎΡΠ½Π΅ΠΌ ΡΠ΅Π°ΠΊΡΠΈΠΈ.
<html>
<head>
<script crossorigin src="https://unpkg.com/[email protected]/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/[email protected]/umd/react-dom.development.js"></script>
<script crossorigin src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
</body>
<div id="root"></div>
<script type="text/babel">
function Example() {
let [count, setCount] = React.useState(0);
return ( <h1>Hello</h1> );
};
ReactDOM.render(<Example />, document.getElementById('root'))
</script>
</body>
</html>
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ! ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΡΡΠΎ Π±ΡΠ»ΠΎ Π½Π΅ ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ ΠΊΠΎΡΠ½Ρ ΡΠ΅Π°ΠΊΡΠΈΠΈ - Ρ ΠΏΡΠΎΡΡΠΎ ΡΠ΄Π°Π»ΠΈΠ» Π΅Π³ΠΎ, ΡΡΠΎΠ±Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ ΡΠΏΡΠΎΡΡΠΈΡΡ ΠΎΡΠΈΠ±ΠΊΡ, - Π½ΠΎ ΡΡΠΎ-ΡΠΎ ΡΡΠΎΠ»Ρ ΠΆΠ΅ Π³Π»ΡΠΏΠΎΠ΅: Π²ΠΌΠ΅ΡΡΠΎ <Example />
Ρ ΠΏΡΠΎΡΡΠΎ Π½Π°ΠΏΠΈΡΠ°Π» Example()
. Π‘ΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅. Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π΅ΡΠ΅ ΡΠ°Π·.
ΠΠ°ΠΆΠ΅ΡΡΡ, Ρ ΠΌΠ΅Π½Ρ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ. Π― ΡΠΎΠ·Π΄Π°Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π΄Π»Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² Π΄ΡΡΠ³ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ , Π½ΠΎ ΠΏΡΠΈ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΌ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΈΠ· Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ. Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Ρ ΡΠΊΠΈ Ρ ΡΠ΅Π°ΠΊΡΠΈΠ΅ΠΉ 16.13.0.
webpack.config.js
module.exports = {
entry: ENTRY,
output: {
library: LIBRARY_NAME,
path: path.resolve(__dirname, OUTPUT_DIR),
filename: OUTPUT_FILENAME,
libraryTarget: 'commonjs2',
},
module: {
rules: [
{
test: /\.(js|tsx)$/,
exclude: /node_modules/,
loader: 'babel-loader',
},
{
test: /\.tsx?$/,
exclude: /node_modules/,
use: 'ts-loader',
},
],
},
resolve: {
alias: {
'<strong i="7">@src</strong>': path.resolve(__dirname, './src'),
'<strong i="8">@components</strong>': path.resolve(__dirname, './src/components'),
'<strong i="9">@core</strong>': path.resolve(__dirname, './src/core'),
react: path.resolve(__dirname, './node_modules/react'),
'react-dom': path.resolve(__dirname, './node_modules/react-dom'),
},
extensions: ['.js', '.json', '.tsx', '.ts'],
},
externals: {
react: 'react',
},
target: 'node',
plugins: [
new HtmlWebPackPlugin({
template: './tests/index.html',
filename: 'index.html',
}),
]}
ΠΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ? Π― ΠΏΡΠΎΠ²Π΅ΡΠΈΠ» Π²ΡΠ΅ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΡΠ°ΡΡΡ
ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠΉ.
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ! :ΡΡ
ΠΌΡΠ»ΠΊΠ°:
Π― ΠΎΠ±ΡΡΠ²ΠΈΠ» Settings.js ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
import React, {useState} from 'react';
import {
View,
Text,
Switch
} from 'react-native';
export function Settings(props) {
const [rememberPin, setRememberPin] = useState(false);
let {changeView, header} = props;
const toggleRememberPin = (value) => {
setRememberPin(value);
};
return (
<View>
<Text>Remember PIN:</Text>
<Switch
onValueChange={toggleRememberPin}
value={rememberPin}
ios_backgroundColor="#aeaeae"
/>
</View>
);
}
export default {Settings};
Π― ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΡ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π΅Π³ΠΎ Π² App.js ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
import React, {Component} from 'react';
import {
SafeAreaView,
StyleSheet,
View,
Text,
TouchableOpacity,
Dimensions,
ScrollView,
Switch
} from 'react-native';
import Colors from './src/assets/Colors';
import {Settings} from './src/components/Settings';
...
export default class App extends Component {
constructor(props) {
super(props);
this.state = {viewsStack: this.viewsStack};
}
viewsStack = {
SplashScreen: false,
BindingInstructions: false,
PinPad: false,
Qr: false,
Dashboard: false,
Authorizations: false,
Settings: true,
Browsers: false,
TransmitSDK: false,
OTP: false,
};
changeView = (newView) => {
let {viewsStack} = this.state;
for (let key of Object.keys(viewsStack)) {
viewsStack[key] = false;
}
viewsStack[newView] = true;
this.setState(viewsStack);
};
render() {
let {viewsStack} = this.state;
return (
<SafeAreaView style={styles.safeAreaView}>
{viewsStack.SplashScreen && (splashScreen())}
{viewsStack.BindingInstructions && (bindingInstructions({changeView: this.changeView}))}
{viewsStack.PinPad && (pinPad({message: 'Inserisci un nuovo PIN', changeView: this.changeView}))}
{viewsStack.Qr && (qr({header: 'QR Binding', message: 'Scansiona il QR dalla tua dashboard\noppure\ninserisci il codice manualmente.', changeView: this.changeView}))}
{viewsStack.Dashboard && (dashboard({header: 'Profilo Utente', changeView: this.changeView}))}
{viewsStack.Authorizations && (authorizations({header: 'Autorizzazioni', authorizations: [1, 2, 3, 4, 5, 6], changeView: this.changeView}))}
{viewsStack.Settings && (Settings({header: 'Impostazioni', changeView: this.changeView}))}
</SafeAreaView>
);
}
};
...
ΠΠΎ Ρ ΠΏΠΎΠ»ΡΡΠ°Ρ:
Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ:
"react": "16.9.0",
"react-native": "0.61.5"
Π§ΡΠΎ ΡΠ»ΡΡΠΈΠ»ΠΎΡΡ?
ΠΡ Π²ΡΠ·ΡΠ²Π°Π΅ΡΠ΅ ΡΠ²ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Settings
ΠΊΠ°ΠΊ ΡΡΠ½ΠΊΡΠΈΡ, Π° Π½Π΅ ΠΊΠ°ΠΊ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ.
<Settings header='Impostazioni' changeView={this.changeView} />
Π₯ΡΠΊΠΈ Π½Π΅ Π΄ΠΎΠΏΡΡΠΊΠ°ΡΡΡΡ Π²Π½ΡΡΡΠΈ ΠΏΡΠΎΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ, ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°Ρ , ΠΈ ΡΠΎ, ΠΊΠ°ΠΊ Π²Ρ ΠΈΡ Π²ΡΠ·ΡΠ²Π°Π΅ΡΠ΅, Π·Π°ΡΡΠ°Π²Π»ΡΠ΅Ρ React Π΄ΡΠΌΠ°ΡΡ, ΡΡΠΎ Π²Π°Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ.
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΡΠΎ ΠΈΠ·Π±Π°Π²ΠΈΡ ΠΊΠΎΠ³ΠΎ-ΡΠΎ ΠΎΡ Π³ΠΎΠ»ΠΎΠ²Π½ΠΎΠΉ Π±ΠΎΠ»ΠΈ, Π΅ΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ react-router-dom, Π΅ΡΠ»ΠΈ Π²Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π΄ΠΈΡΠ΅ ΡΠ²ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π² ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³ Π²ΠΎΡ ΡΠ°ΠΊ (Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ), ΡΡΠΎ Π΄Π°ΡΡ Invalid Hook Call Warning
<Route path="/:cuid/:title" render={PostArticle} />
ΠΠ½Π΅ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°Π»ΠΎΡΡ ΠΏΠΎΠ»ΡΠ°ΡΠ°, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ½ΡΡΡ, Π³Π΄Π΅ Ρ ΠΎΡΠΈΠ±ΡΡ
ΠΠΎΠΌΡ-ΡΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΌΠΎΡΡ β Π΅ΡΠ»ΠΈ Π²Ρ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΠΈΡΡ Ρ ΡΡΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ ΠΏΠΎΡΠ»Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ react-router-dom, ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅, ΠΊΠ°ΠΊ Π²Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈ ΡΠ²ΠΎΠΈ ΠΌΠ°ΡΡΡΡΡΡ. Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ <Route path={'/upgrade/:plan'} exact children={<Upgrade />} />
, ΠΏΠΎΠΊΠ° Ρ Π΄Π΅Π»Π°Π» <Route path={'/upgrade/:plan'} exact children={Upgrade} />
ΠΡΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π½Π΅ΡΠ΄ΠΎΠ±Π½ΠΎ, Π΅ΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ ΡΠ΅ΡΠ½ΠΈΠ»Π° ΠΈΠ»ΠΈ ΠΏΠ°ΡΡΠ΅Π»Ρ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ CLI (ΡΠΌ. https://github.com/vadimdemedes/pastel/issues/2). Π― Π½Π΅ ΠΌΠΎΠ³Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ peerDep, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Ρ Π½Π΅ ΠΌΠΎΠ³Ρ ΠΏΠΎΠΏΡΠΎΡΠΈΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ React, ΠΈ Ρ ΡΠ°ΠΊΠΆΠ΅ Π½Π΅ ΠΌΠΎΠ³Ρ Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ Π²Π΅ΡΡΠΈΡ/Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ React.
ΠΠΎΡ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Yarn ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ Invalid hook call
ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠ΅ΡΡΠ°Ρ
, Π° Π½Π΅ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡΡΠ°Π»Π°ΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ react-test-renderer
ΡΠ°Π·ΡΠ΅ΡΠ°Π»Π°ΡΡ Π² Π²Π΅ΡΡΠΈΡ Π½ΠΈΠΆΠ΅, ΡΠ΅ΠΌ Ρ react
ΠΈ react-dom
, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ resolutions
Π² package.json
:
"devDependencies": {
...
"react": "16.12.0",
"react-dom": "16.12.0",
...
},
"resolutions": {
"react-test-renderer": "16.12.0"
}
ΠΠ»Ρ Π»ΡΠ΄Π΅ΠΉ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΡ Gatsby Π² ΠΏΠΎΠ΄ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅, ΡΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅.
gatsby-node.js
:
const path = require('path')
const fromRoot = name => path.resolve(__dirname + '/../node_modules/' + name)
exports.onCreateWebpackConfig = ({ actions }) => actions.setWebpackConfig({
resolve: {
alias: {
'react': fromRoot('react'),
'react-dom': fromRoot('react-dom'),
},
},
})
Π£ ΠΌΠ΅Π½Ρ ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ npm link
οΌΠ΅ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°
ΠΠ°ΡΠ΅ΠΌ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Π½ΠΎΠ΅ ΡΠ΅Π°ΠΊΡΠΈΠ΅ΠΉ, ΡΡΠΎΠ±Ρ ΡΠ΅ΡΠΈΡΡ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.
ΠΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΡΡΠ»ΠΊΠΈ npm ΠΈΠ»ΠΈ Π΅Π΅ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ°. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²Π°Ρ ΡΠΏΠ°ΠΊΠΎΠ²ΡΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ Β«ΡΠ²ΠΈΠ΄Π΅ΡΡΒ» Π΄Π²Π° React β ΠΎΠ΄ΠΈΠ½ Π² ΠΏΠ°ΠΏΠΊΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ ΠΎΠ΄ΠΈΠ½ Π² ΠΏΠ°ΠΏΠΊΠ΅ Π²Π°ΡΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ. ΠΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ, ΡΡΠΎ myapp ΠΈ mylib ΡΠ²Π»ΡΡΡΡΡ ΡΠΎΠ΄ΡΡΠ²Π΅Π½Π½ΡΠΌΠΈ ΠΏΠ°ΠΏΠΊΠ°ΠΌΠΈ, ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΉ β Π·Π°ΠΏΡΡΡΠΈΡΡ npm link ../myapp/node_modules/react ΠΈΠ· mylib. ΠΡΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π·Π°ΡΡΠ°Π²ΠΈΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠΏΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ React.
ΠΡΠ»ΠΈ Π Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ Π (Π ΠΈ Π β Π±ΡΠ°ΡΡΡ ΠΈ ΡΠ΅ΡΡΡΡ)
npm link ./../A/node_modules/react
npm link
npm link B
ΠΌΠ΅Π½Ρ ΡΡΡΡΠ°ΠΈΠ²Π°Π΅Ρ
ΠΠ°ΠΆΠ΅ Ρ ΡΡΠΈΠΌΠΈ ΠΎΡΠ²Π΅ΡΠ°ΠΌΠΈ Ρ Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½, ΠΏΠΎΡΠ΅ΠΌΡ Ρ ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅. Π£ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΠΌΠΎΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ, ΡΠ²ΡΠ·Π°Π½Π½Π°Ρ Ρ ΠΌΠΎΠΈΠΌ ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΈ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ ΠΏΠΎΠ»ΡΡΠΈΠ» ΠΎΡΠΈΠ±ΠΊΡ, Ρ ΡΠ»Π΅Π΄ΠΎΠ²Π°Π» Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΠΌ ΡΠ΅Π°ΠΊΡΠΈΠΈ ΠΈ ΡΠ²ΡΠ·Π°Π» Π²Π΅ΡΡΠΈΡ ΠΌΠΎΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ Ρ ΡΠ΅Π°ΠΊΡΠΈΠ΅ΠΉ ΠΌΠΎΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (Π·Π°ΠΏΡΡΡΠΈΠ² npm link <>/webapp/node_modules/react
. (Π΄Π°ΠΆΠ΅ ΡΠ΄Π΅Π»Π°Π» ΡΡΠΎ Ρ ΡΠ΅Π°ΠΊΡΠΈΠ΅ΠΉ) dom). ΠΠΎΠ³Π΄Π° Ρ Π²ΠΎΡΠ΅Π» Π² ΡΠΈΡΡΠ΅ΠΌΡ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ Π»ΠΈ React1 ΠΈ React2, ΠΎΠ½ Π·Π°ΠΏΠΈΡΠ°Π» true
, ΠΏΠΎΡΡΠΎΠΌΡ Ρ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» Π΄ΡΠ±Π»ΠΈΡΡΡΡΠΈΠ΅ΡΡ Π²Π΅ΡΡΠΈΠΈ React, Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» ΡΠ΅ ΠΆΠ΅ Π²Π΅ΡΡΠΈΠΈ React ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π½Π΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎ, ΡΡΠΎ Π² ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π΅ ΠΈΡΠΏΡΡΠ°Π½ΠΈΠΉ ΡΠΊΠ°Π·ΡΠ²Π°Π»ΠΎΡΡ, ΡΡΠΎ Ρ ΠΌΠ΅Π½Ρ Π½Π΅Ρ Π΄ΡΠ±Π»ΠΈΡΡΡΡΠ΅ΠΉ Π²Π΅ΡΡΠΈΠΈ React, Ρ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ ΠΏΠΎΠ»ΡΡΠ°Π» ΠΎΡΠΈΠ±ΠΊΡ Π»ΠΎΠ²ΡΡΠΊΠΈ.
ΠΠΎ ΠΏΠΎΠΏΡΡΠΊΠ° ΡΡΠΎΠ³ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΡ, ΠΊΠ°ΠΊ ΡΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡ Π²ΡΡΠ΅, ΠΈΡΠΏΡΠ°Π²ΠΈΠ»Π° ΡΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΠΎΡΠΈΠ±ΠΊΡ:
alias: {
react: path.resolve('./node_modules/react')
}
Π’Π°ΠΊ ΡΡΠΎ Ρ Π² ΡΠ°ΡΡΠ΅ΡΡΠ½Π½ΠΎΡΡΠΈ.
Π’Π°ΠΊ ΡΡΠΎ Ρ Π² ΡΠ°ΡΡΠ΅ΡΡΠ½Π½ΠΎΡΡΠΈ.
@orpheus ΠΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΠ΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΡΠ½Ρ ΡΠ΅Π°ΠΊΡΠΈΠΈ Π½Π° ΠΎΠ΄Π½Ρ ΠΈ ΡΡ ΠΆΠ΅ ΡΡΡΠ°Π½ΠΈΡΡ? ΠΈΠ½Π°ΡΠ΅ Ρ Π²Π°Ρ Π΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° ReactDOM.render
Π½Π° ΠΎΠ΄Π½ΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΠ΅?
ΠΡ Π²ΡΠ²ΠΎΠ΄ΠΈΡΠ΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΡΠ½Ρ ΡΠ΅Π°ΠΊΡΠΈΠΈ Π½Π° ΠΎΠ΄Π½Ρ ΠΈ ΡΡ ΠΆΠ΅ ΡΡΡΠ°Π½ΠΈΡΡ? ΠΈΠ½Π°ΡΠ΅ Ρ Π²Π°Ρ Π΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π°
ReactDOM.render
Π½Π° ΠΎΠ΄Π½ΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΠ΅?
@ΡΠΈΠΌΠΊΠΈΠ½Π΄Π±Π΅ΡΠ³
Π― Π½Π΅. Π£ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ ReactDOM.render
Π² ΠΊΠΎΡΠ½Π΅ ΠΌΠΎΠ΅Π³ΠΎ app
, Π° ΠΌΠΎΠ΄ΡΠ»Ρ lib
, ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΡΠ²ΡΠ·ΡΠ²Π°Ρ, ΡΠ²Π»ΡΠ΅ΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ReactDOM.render
Π²ΠΎΠΎΠ±ΡΠ΅.
ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ: Ρ Π΄Π΅Π»Π°Ρ ΡΡΠΎ-ΡΠΎ Π²ΡΠΎΠ΄Π΅:
import React from 'react'
import ReactDOM from 'react-dom'
import Root from './App/Root'
ReactDOM.render(
<Root />,
document.getElementById('root')
)
Π³Π΄Π΅ <Root />
ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΡΡΠΎ-ΡΠΎ Π²ΡΠΎΠ΄Π΅
const Root = () => {
return <Provider store={store}>
<PermissionsProvider>
<Suspense fallback={null}>
<Router history={history}>
<Routes store={store} />
</Router>
</Suspense>
</PermissionsProvider>
</Provider>
}
PermissionsProvider
β ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ React, ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΡ ΠΈΠ· ΠΌΠΎΠ΅Π³ΠΎ ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ lib
, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Ρ
ΡΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΡΠ±ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠ½ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ Π΅Π³ΠΎ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ.
ΠΡΠΈΠ²Π΅Ρ, Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ»Π΅ΠΊΡΡΠΎΠ½ Ρ ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΡΠΌΠΈ ΠΊΡΡΡΠΊΠ°ΠΌΠΈ. Π΅ΡΠ»ΠΈ Ρ Π½Π°ΠΏΠΈΡΡ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ Ρ
ΡΠΊ, ΠΎΠ½ ΡΡΠ°Π±ΠΎΡΠ°Π΅Ρ. ΠΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΠ°, ΠΊΠΎΠ³Π΄Π° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Ρ
ΡΠΊΠΈ ΠΈΠ· Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ° Π² node_module, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ react-use
, swr
.
ΠΠ½Π΅ Π½ΡΠΆΠ½ΠΎ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠ°ΠΊΠ΅Ρ Π² ΠΌΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ».
ΠΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ Π²ΡΡΡΠ΅ΡΠ°Π΅ΡΡΡ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ?
ΠΡΠΈΠΌΠ΅Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π·Π΄Π΅ΡΡ:
https://github.com/Zaynex/electron-react-ts-kit/tree/hooks-error
ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΊΠΎΠ΄:
https://github.com/Zaynex/electron-react-ts-kit/blob/hooks-error/src/renderer/app.tsx
Π£ ΠΌΠ΅Π½Ρ ΡΠ°ΠΊΠΆΠ΅ Π²ΡΠ΅ Π΅ΡΠ΅ Π΅ΡΡΡ ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π΄Π°ΠΆΠ΅ ΠΏΠΎΡΠ»Π΅ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΏΠΎΠ²ΡΠΎΡΡΡΡΠΈΡ ΡΡ ΠΊΠΎΠΏΠΈΠΉ ΡΠ΅Π°ΠΊΡΠΈΠΈ ΠΈ ΡΠ΅Π°ΠΊΡΠΈΠΈ-Π΄ΠΎΠΌΠ°. Π― ΡΠΎΠ·Π΄Π°Π» ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠ΅ΡΡΠΎΠ²ΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ Π΄Π»Ρ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡ.
$ tree -I node_modules
.
|-- test-app
| |-- dist
| | |-- index.html
| | `-- main.js
| |-- package-lock.json
| |-- package.json
| |-- src
| | |-- index.html
| | `-- index.js
| `-- webpack.config.js
`-- test-lib
|-- dist
| `-- main.js
|-- package-lock.json
|-- package.json
|-- src
| `-- index.js
`-- webpack.config.js
Π Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΌΠ΅ΡΠΎΠ΄ ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΠ° webpack, Π½ΠΎ Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΎΠ±ΠΎΠ²Π°Π» ΠΌΠ΅ΡΠΎΠ΄ npm link
, ΠΈ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ
Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
Π― ΡΠΎΠΆΠ΅ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ. Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ExpressJS + Pug Π΄Π»Ρ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΉ, Π·Π°ΡΠ΅ΠΌ Ρ Π½Π°ΠΏΠΈΡΠ°Π» ΡΡΠ΅Π΄ΡΡΠ²ΠΎ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ (ΠΏΠΎΡ ΠΎΠΆΠ΅Π΅ Π½Π° ReactRails), ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°.
Π― ΠΏΠΎΠΏΡΡΠ°Π»ΡΡ ΠΈΠ·Π²Π»Π΅ΡΡ ΡΡΠΎ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ ΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΡΡ Π±Π΅ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ½ΡΠΌ, ΠΈ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ.
Π§ΡΠΎΠ±Ρ ΡΡΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ, ΠΌΠ½Π΅ ΠΏΡΠΈΡΠ»ΠΎΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΠΎΠ΄ ΠΊΠ»ΡΡ resolve
:
alias: {
react: path.resolve("./node_modules/react"),
},
Π’Π΅ΠΏΠ΅ΡΡ ΠΎΠ½ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π΄ΠΎΠ»ΠΆΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΏΡΠΈ ΠΎΠ±ΡΡΠ½ΠΎΠΌ Π·Π°ΠΏΡΡΠΊΠ΅ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ°, Π½ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π²ΡΠ΅ Π΅ΡΠ΅ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΡΡΡ Ρ ΡΠΎΠΌΠΎΠΌ Π΄ΠΎΠΊΠ΅ΡΠ°. Π― ΡΠ»ΠΈΡΠΊΠΎΠΌ Π½ΠΎΠ²ΠΈΡΠΎΠΊ Π² Π΄ΠΎΠΊΠ΅ΡΠ΅, ΡΡΠΎΠ±Ρ ΡΠ°Π·Π±ΠΈΡΠ°ΡΡΡΡ Ρ ΡΡΠΈΠΌ, ΡΠ°ΠΊ ΡΡΠΎ Π²Π΅ΡΠ½ΡΡΡ ΠΊ Π½Π΅ΠΌΡ ΠΏΠΎΠ·ΠΆΠ΅.
Π Π΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ: Ρ Π³ΠΎΠ²ΠΎΡΠΈΠ» ΡΠ»ΠΈΡΠΊΠΎΠΌ ΡΠ°Π½ΠΎ. Π’Π΅ΠΏΠ΅ΡΡ ΠΎΠ½ ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³ΠΎΠΌ React, Π½ΠΎ Π½Π΅ Ρ Π³ΠΈΠ΄ΡΠ°ΡΠΎΠΌ.
ΠΡΠΈΠ²Π΅Ρ, Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ»Π΅ΠΊΡΡΠΎΠ½ Ρ ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΡΠΌΠΈ ΠΊΡΡΡΠΊΠ°ΠΌΠΈ. Π΅ΡΠ»ΠΈ Ρ Π½Π°ΠΏΠΈΡΡ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ Ρ ΡΠΊ, ΠΎΠ½ ΡΡΠ°Π±ΠΎΡΠ°Π΅Ρ. ΠΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΠ°, ΠΊΠΎΠ³Π΄Π° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Ρ ΡΠΊΠΈ ΠΈΠ· Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ° Π² node_module, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ
react-use
,swr
.ΠΠ½Π΅ Π½ΡΠΆΠ½ΠΎ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠ°ΠΊΠ΅Ρ Π² ΠΌΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ».
ΠΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ Π²ΡΡΡΠ΅ΡΠ°Π΅ΡΡΡ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ?
ΠΡΠΈΠΌΠ΅Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π·Π΄Π΅ΡΡ:
https://github.com/Zaynex/electron-react-ts-kit/tree/hooks-errorΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΊΠΎΠ΄:
https://github.com/Zaynex/electron-react-ts-kit/blob/hooks-error/src/renderer/app.tsx
ΠΡΠΈΠ²Π΅Ρ. Π― Π±ΡΠ»Π° ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°. Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΡΠΉ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ Π²ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ ΠΊΠ°ΠΊ Π²Π½Π΅ΡΠ½ΠΈΠ΅ Π΄Π»Ρ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ°. ΠΠ° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΆΠ΅ΡΡΠΊΠΎ Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡΠΌΠΈ, ΡΠ°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ react ΠΈ react-dom.
ΠΠ»Ρ ΠΌΠ΅Π½Ρ ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π»ΠΎ, ΡΡΠΎ ΡΠ΅Π°ΠΊΡΠΈΡ, Π·Π°Π³ΡΡΠΆΠ΅Π½Π½Π°Ρ ΠΈΠ· ΠΌΠΎΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π°, ΠΎΡΠ»ΠΈΡΠ°Π»Π°ΡΡ ΠΎΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ, Π·Π°Π³ΡΡΠΆΠ΅Π½Π½ΠΎΠΉ ΠΈΠ· ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ.
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΠΈΡ
ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ Π² Π±Π΅Π»ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ , ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ (Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½, ΡΡΠΎ ΡΡΠΎ Π΅ΡΠ΅ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΡΠ»ΠΎΠΌΠ°Π»ΠΎ :)
@huhle ΡΠΏΠ°ΡΠΈΠ±ΠΎ, ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ! ΠΠΎΠΆΠ΅Ρ Π±ΡΡΡ, Π½Π°ΠΌ ΡΡΠΎΠΈΡ ΠΏΠΎΠ³ΡΡΠ·ΠΈΡΡΡΡ Π² ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΡΠΉ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅Ρ.
ΠΠ½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΡΠ΄Π°Π»ΠΎΡΡ Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ. Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΡΠΎ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π»ΡΡΡΠΈΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ, ΠΊΠΎΠ³Π΄Π° ΡΠ΅ΡΡ ΠΈΠ΄Π΅Ρ ΠΎ ΡΠ°Π±ΠΎΡΠΈΡ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π°Ρ Lerna ΠΈ Yarn, ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°ΡΡΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΡ.
ΠΠ°ΠΆΠ΅ΡΡΡ, Π²ΡΠ΅ ΡΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΊ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ° package.json
, ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΡ. ΠΠ½Π΅ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π²ΠΊΠ»ΡΡΠΈΡΡ ΡΡΠΈ ΡΠ°Π·Π΄Π΅Π»Ρ:
"peerDependencies": {
"react": "^16.13.1",
"react-dom": "^16.13.1"
},
"workspaces": {
"nohoist": [
"react", "react-dom"
]
}
ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΠΌΠ½Π΅ ΠΏΡΠΈΡΠ»ΠΎΡΡ ΠΏΠ΅ΡΠ΅ΡΡΡΠΎΠΈΡΡ ΠΏΡΠΎΠ΅ΠΊΡΡ, ΠΈ Ρ Π±ΡΠ» Π³ΠΎΡΠΎΠ² ΠΊ ΡΠ°Π±ΠΎΡΠ΅. ΠΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΠΈΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΠ΄Π½ΠΎΡΠ°Π½Π³ΠΎΠ²ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΡΠ΅Π±ΠΎΠ²Π°ΡΡ ΠΈΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π²Π°ΡΠΈΠΌ ΠΏΠΎΡΡΠ΅Π±Π»ΡΡΡΠΈΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠΌ. Π ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ΠΈ Π½Π΅ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Ρ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΡ , ΠΎΠ½ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π΄Π»Ρ ΠΏΠ°ΠΊΠ΅ΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π²Ρ ΠΏΡΡΠ°Π΅ΡΠ΅ΡΡ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ, Π½ΠΎ ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΏΡΠΈΡΠΈΠ½Π΅, Π΅ΡΠ»ΠΈ Π²Ρ Π½Π΅ ΡΠΊΠ°ΠΆΠ΅ΡΠ΅ Π΅ΠΌΡ Π½Π΅ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°ΡΡ, ΠΎΠ½ΠΈ ΠΎΡΡΠ°ΡΡΡΡ Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌΠΈ, ΠΈ Π½ΠΎΠ²ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ ΠΏΡΠΎΠ±ΠΈΠ²Π°Π΅ΡΡΡ ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ.
Π£Π΄Π°ΡΠΈ!
Π― ΠΏΡΡΠ°ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΡΡ ΠΏΡΡΠΆΠΈΠ½Ρ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΡΠΎΡΡΠΎΠΉ ΡΡΡΠ΅ΠΊΡ ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ. ΠΠ°ΠΆΠ΅ΡΡΡ, Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
`ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ React, {useState, useEffect} ΠΈΠ· 'ΡΠ΅Π°ΠΊΡΠΈΠΈ';
ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ {Π°Π½ΠΈΠΌΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅, useTransition} ΠΈΠ· 'React-Spring';
const TextContent = (ΡΠ΅ΠΊΠ²ΠΈΠ·ΠΈΡ) => {
const [items] = useState([
{ id: '0', title: 'Text1' },
{ id: '1', title: 'Text2' },
{ id: '2', title: 'Text1' }
])
const [index, setIndex] = useState(0);
const transitions = useTransition(items[index], index => index.id,
{
from: { opacity: 0 },
enter: { opacity: 1 },
leave: { opacity: 0 },
config: { tension: 220, friction: 120 }
}
)
useEffect(() => {
const interval = setInterval(() => {
setIndex((state) => (state + 1) % items.length);
}, 4000)
return () => clearInterval(interval);
}, []);
return (
<div>
{
transitions.map(({ item, props, key }) => (
<animated.div
key={key}
style={{ ...props, position: 'absolute' }}
>
<p>{item.title}</p>
</animated.div>
))
}
</div>
)
}
ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ TextContent ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ;`
Π― ΠΏΠΎΠΏΡΡΠ°Π»ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, Π΅ΡΡΡ Π»ΠΈ Ρ ΠΌΠ΅Π½Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² React. Npm ls-ing Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΌΠ½Π΅, ΡΡΠΎ Ρ ΠΌΠ΅Π½Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Π° Π²Π΅ΡΡΠΈΡ react ΠΈ react-dom, ΠΎΠ±Π΅ Π²Π΅ΡΡΠΈΠΈ 16.13.1.
ΠΡΠΈΠ²Π΅Ρ, Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ»Π΅ΠΊΡΡΠΎΠ½ Ρ ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΡΠΌΠΈ ΠΊΡΡΡΠΊΠ°ΠΌΠΈ. Π΅ΡΠ»ΠΈ Ρ Π½Π°ΠΏΠΈΡΡ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ Ρ ΡΠΊ, ΠΎΠ½ ΡΡΠ°Π±ΠΎΡΠ°Π΅Ρ. ΠΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΠ°, ΠΊΠΎΠ³Π΄Π° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Ρ ΡΠΊΠΈ ΠΈΠ· Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ° Π² node_module, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ
react-use
,swr
.
ΠΠ½Π΅ Π½ΡΠΆΠ½ΠΎ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠ°ΠΊΠ΅Ρ Π² ΠΌΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ».
ΠΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ Π²ΡΡΡΠ΅ΡΠ°Π΅ΡΡΡ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ?
ΠΡΠΈΠΌΠ΅Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π·Π΄Π΅ΡΡ:
https://github.com/Zaynex/electron-react-ts-kit/tree/hooks-error
ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΊΠΎΠ΄:
https://github.com/Zaynex/electron-react-ts-kit/blob/hooks-error/src/renderer/app.tsxΠΡΠΈΠ²Π΅Ρ. Π― Π±ΡΠ»Π° ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°. Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΡΠΉ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ Π²ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ ΠΊΠ°ΠΊ Π²Π½Π΅ΡΠ½ΠΈΠ΅ Π΄Π»Ρ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ°. ΠΠ° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΆΠ΅ΡΡΠΊΠΎ Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡΠΌΠΈ, ΡΠ°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ react ΠΈ react-dom.
ΠΠ»Ρ ΠΌΠ΅Π½Ρ ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π»ΠΎ, ΡΡΠΎ ΡΠ΅Π°ΠΊΡΠΈΡ, Π·Π°Π³ΡΡΠΆΠ΅Π½Π½Π°Ρ ΠΈΠ· ΠΌΠΎΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π°, ΠΎΡΠ»ΠΈΡΠ°Π»Π°ΡΡ ΠΎΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ, Π·Π°Π³ΡΡΠΆΠ΅Π½Π½ΠΎΠΉ ΠΈΠ· ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ.
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΠΈΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ Π² Π±Π΅Π»ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ , ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ (Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½, ΡΡΠΎ ΡΡΠΎ Π΅ΡΠ΅ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΡΠ»ΠΎΠΌΠ°Π»ΠΎ :)
ΠΠ΅Π»ΠΈΠΊΠΎΠ»Π΅ΠΏΠ½ΠΎ! Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ
Π― ΠΏΡΡΠ°ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΡΡ ΠΏΡΡΠΆΠΈΠ½Ρ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΡΠΎΡΡΠΎΠΉ ΡΡΡΠ΅ΠΊΡ ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ. ΠΠ°ΠΆΠ΅ΡΡΡ, Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
`ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ React, {useState, useEffect} ΠΈΠ· 'ΡΠ΅Π°ΠΊΡΠΈΠΈ';
ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ {Π°Π½ΠΈΠΌΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅, useTransition} ΠΈΠ· 'React-Spring';const TextContent = (ΡΠ΅ΠΊΠ²ΠΈΠ·ΠΈΡ) => {
const [items] = useState([ { id: '0', title: 'Text1' }, { id: '1', title: 'Text2' }, { id: '2', title: 'Text1' } ]) const [index, setIndex] = useState(0); const transitions = useTransition(items[index], index => index.id, { from: { opacity: 0 }, enter: { opacity: 1 }, leave: { opacity: 0 }, config: { tension: 220, friction: 120 } } ) useEffect(() => { const interval = setInterval(() => { setIndex((state) => (state + 1) % items.length); }, 4000) return () => clearInterval(interval); }, []); return ( <div> { transitions.map(({ item, props, key }) => ( <animated.div key={key} style={{ ...props, position: 'absolute' }} > <p>{item.title}</p> </animated.div> )) } </div> )
}
ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ TextContent ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ;`
Π― ΠΏΠΎΠΏΡΡΠ°Π»ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, Π΅ΡΡΡ Π»ΠΈ Ρ ΠΌΠ΅Π½Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² React. Npm ls-ing Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΌΠ½Π΅, ΡΡΠΎ Ρ ΠΌΠ΅Π½Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Π° Π²Π΅ΡΡΠΈΡ react ΠΈ react-dom, ΠΎΠ±Π΅ Π²Π΅ΡΡΠΈΠΈ 16.13.1.
Π’ΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅. react ΠΈ react-dom Π΄Π»Ρ ΠΌΠ΅Π½Ρ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π½Π° 16.13.1, ΠΈ ΠΏΠΎΠΏΡΡΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ react-spring ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΡΠΎΠΉ ΠΆΠ΅ ΠΎΡΠΈΠ±ΠΊΠ΅.
ΠΠ· Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° Π½Π° styled-components
Ρ ΡΠ·Π½Π°Π», ΡΡΠΎ Π΅ΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ ΡΠ΅ΡΠ΅Π· URI file:
Π² package.json
, Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ rm -rf node_modules/local-package-name/node_modules
ΠΏΠ΅ΡΠ΅Π΄ Π·Π°ΠΏΡΡΠΊΠΎΠΌ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ, Π²ΠΈΠ΄ΠΈΠΌΠΎ, Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ ΠΊΠΎΠΏΠΈΡΡΡΡΡΡ Π±Π΅Π· ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ node_modules
Π½Π° Π½Π°Π»ΠΈΡΠΈΠ΅ ΠΈΠ·Π±ΡΡΠΎΡΠ½ΡΡ
Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ.
ΠΠ· Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° Π½Π°
styled-components
Ρ ΡΠ·Π½Π°Π», ΡΡΠΎ Π΅ΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ ΡΠ΅ΡΠ΅Π· URIfile:
Π²package.json
, Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎrm -rf node_modules/local-package-name/node_modules
ΠΏΠ΅ΡΠ΅Π΄ Π·Π°ΠΏΡΡΠΊΠΎΠΌ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ, Π²ΠΈΠ΄ΠΈΠΌΠΎ, Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ ΠΊΠΎΠΏΠΈΡΡΡΡΡΡ Π±Π΅Π· ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈnode_modules
Π½Π° Π½Π°Π»ΠΈΡΠΈΠ΅ ΠΈΠ·Π±ΡΡΠΎΡΠ½ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ.
ΠΠ°, ΡΡΠΎ ΠΎΠ΄Π½Π° ΠΈ ΡΠ° ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ Π΄Π»Ρ Π΄ΡΠΆΠΈΠ½Ρ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΡΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅. Π― Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΡΠ΅Π»Ρ Β«prestartΒ» ΠΈ Β«prebuildΒ», ΡΡΠΎΠ±Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ rm -rf (ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ rimraf). ΠΡΡΠ³ΠΎΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π² ΡΡΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» npm-link-shared Π² ΡΠ²ΠΎΠ΅ΠΌ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΌ Π·Π°ΠΏΡΡΠΊΠ΅, ΡΡΠΎΠ±Ρ Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΠΌΠΎΠ΄ΡΠ»ΠΈ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ. ΠΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· Π½Π°Ρ, ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΌΠΎΠ½ΠΎΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠ΅Π², ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡΡ Ρ ΡΡΠΈΠΌ.
ΠΡΠΈΠ²Π΅Ρ, Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ»Π΅ΠΊΡΡΠΎΠ½ Ρ ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΡΠΌΠΈ ΠΊΡΡΡΠΊΠ°ΠΌΠΈ. Π΅ΡΠ»ΠΈ Ρ Π½Π°ΠΏΠΈΡΡ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ Ρ ΡΠΊ, ΠΎΠ½ ΡΡΠ°Π±ΠΎΡΠ°Π΅Ρ. ΠΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΠ°, ΠΊΠΎΠ³Π΄Π° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Ρ ΡΠΊΠΈ ΠΈΠ· Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ° Π² node_module, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ
react-use
,swr
.
ΠΠ½Π΅ Π½ΡΠΆΠ½ΠΎ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠ°ΠΊΠ΅Ρ Π² ΠΌΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ».
ΠΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ Π²ΡΡΡΠ΅ΡΠ°Π΅ΡΡΡ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ?
ΠΡΠΈΠΌΠ΅Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π·Π΄Π΅ΡΡ:
https://github.com/Zaynex/electron-react-ts-kit/tree/hooks-error
ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΊΠΎΠ΄:
https://github.com/Zaynex/electron-react-ts-kit/blob/hooks-error/src/renderer/app.tsxΠΡΠΈΠ²Π΅Ρ. Π― Π±ΡΠ»Π° ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°. Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΡΠΉ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ Π²ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ ΠΊΠ°ΠΊ Π²Π½Π΅ΡΠ½ΠΈΠ΅ Π΄Π»Ρ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ°. ΠΠ° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΆΠ΅ΡΡΠΊΠΎ Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡΠΌΠΈ, ΡΠ°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ react ΠΈ react-dom.
ΠΠ»Ρ ΠΌΠ΅Π½Ρ ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π»ΠΎ, ΡΡΠΎ ΡΠ΅Π°ΠΊΡΠΈΡ, Π·Π°Π³ΡΡΠΆΠ΅Π½Π½Π°Ρ ΠΈΠ· ΠΌΠΎΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π°, ΠΎΡΠ»ΠΈΡΠ°Π»Π°ΡΡ ΠΎΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ, Π·Π°Π³ΡΡΠΆΠ΅Π½Π½ΠΎΠΉ ΠΈΠ· ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ.
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΠΈΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ Π² Π±Π΅Π»ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ , ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ (Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½, ΡΡΠΎ ΡΡΠΎ Π΅ΡΠ΅ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΡΠ»ΠΎΠΌΠ°Π»ΠΎ :)
ΠΡΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ Π»ΡΠ΄ΡΠΌ, Ρ ΠΊΠΎΡΠΎΡΡΡ Π΅ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ redux ΠΈΠ»ΠΈ redux toolkit ΠΈ electronic-webpack. Π£ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ°Ρ ΡΠ°Π±ΠΎΡΠ°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ:
// package.json
...
"electronWebpack": {
"whiteListedModules": ["react-redux"]
}
ΡΠΌ. https://github.com/electron-userland/electron-webpack/issues/349
ΠΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡΡΠ°Π»Π°ΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Ρ Π½Π°ΠΏΠΈΡΠ°Π»
import React from 'React'
ΠΠΌΠ΅ΡΡΠΎ:
import React from 'react'
ΠΠ½ΠΎΠ³Π΄Π° ΡΡΠΎ Π³Π»ΡΠΏΠΎΡΡΠΈ.
Π― ΡΠ΅ΡΠΈΠ» ΡΡΠΎ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΌΠΎΠ΅Π³ΠΎ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ°:
externals: {
react: {
root: "React",
commonjs2: "react",
commonjs: "react",
amd: "react",
},
"react-dom": {
root: "ReactDOM",
commonjs2: "react-dom",
commonjs: "react-dom",
amd: "react-dom",
},
},
Π‘Π½Π°ΡΠ°Π»Π° Ρ ΠΏΠΎΠ΄ΡΠΌΠ°Π», ΡΡΠΎ ΡΡΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ npm link, ΡΠ΄Π΅Π»Π°Π» Π²ΡΠ΅, ΡΡΠΎ Π±ΡΠ»ΠΎ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ, ΠΈ Π΄Π°ΠΆΠ΅ ΠΏΠ΅ΡΠ΅ΡΠ΅Π» Π½Π° ΠΏΡΡΠΆΡ. Π ΠΊΠΎΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠΎΠ² Π²ΡΡΡΠ½ΠΈΠ»ΠΎΡΡ, ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΡΠΎ-ΡΠΎ Π΅ΡΠ΅, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ Π² npm Π΄Π°Π²Π°Π»Π° ΡΡ ΠΆΠ΅ ΠΎΡΠΈΠ±ΠΊΡ ΠΏΡΠΈ ΠΈΠΌΠΏΠΎΡΡΠ΅ Π² Π΄ΡΡΠ³ΠΎΠΉ ΠΏΡΠΎΠ΅ΠΊΡ.
ΠΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ Π·Π΄Π΅ΡΡ ΡΠ΅ΡΠΈΠ» ΡΡΠΎ Π½Π΅Π΄Π°Π²Π½ΠΎ Ρ ΠΌΠΎΠ½ΠΎΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠ΅ΠΌ lerna? Π― ΠΏΡΠΎΠ±ΠΎΠ²Π°Π» Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π±Π΅Π· Π²Π΅Π·Π΅Π½ΠΈΡ.
ΠΡΠΈΠ±ΠΊΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΏΠΎΡΠ»Π΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΠΊΠΎΠ΄Π°, Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ // Π½ΠΈΠΆΠ΅. ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ CssBaseline ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ΅ ΡΠ΅Π°ΠΊΡΠΈΠΈ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ. ΠΡΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ, ΠΊΠΎΠ³Π΄Π° ΡΡΠΎ Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½ΠΎ. ΠΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ β ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΊΠΎΠ΄ npx create-react-app. Π‘ΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ Π½ΠΎΠ²ΡΠΉ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ, ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Ρ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°Π» Π²ΡΡΠ΅, Π½Π΅ Π΄Π°Π»ΠΈ ΡΡΡΠ΅ΠΊΡΠ°.
ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ React ΠΈΠ· Β«ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡΒ»;
ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ Π»ΠΎΠ³ΠΎΡΠΈΠΏ ΠΈΠ· './logo.svg';
ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ CssBaseline ΠΈΠ· '@material-ui/core/CssBaseline';
ΡΡΠ½ΠΊΡΠΈΡ ΡΠΊΡΠΏΠΎΡΡΠ° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ App() {
Π²Π΅ΡΠ½ΡΡΡ (
//<React.Fragment>
//<CssBaseline />
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
</div>
//</React.Fragment>
);
}
ΠΠ»Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ:
Π Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ node_modules ΡΠ΄Π°Π»ΠΈΡΠ΅ ΠΏΠ°ΠΏΠΊΡ react ΠΈ react-dom
Π ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΠΏΠ°ΠΊΠ΅ΡΠ΅ ΡΠ½ΠΎΠ²Π° Π·Π°ΠΏΡΡΡΠΈΡΠ΅ Β«yarn installΒ» ΠΈΠ»ΠΈ Β«npm installΒ».
ΠΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Π΅Ρ Π·Π°Π³ΡΡΠ·ΠΊΡ Π²ΡΠΎΡΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ ΡΠ΅Π°ΠΊΡΠΈΠΈ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΠ°ΠΊΠ΅Ρ. ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ ΡΡΠΎ Π½Π΅ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎΠ΅ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅, Π½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π΄Π»Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
ΠΠ»Ρ ΡΠ΅Ρ , ΠΊΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ lerna, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΡΠΎΠ»ΠΊΠ½ΡΡΡΡΡ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΡΠ΅ΡΡΠΎΠ² Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠ°ΠΊΠ΅ΡΠ΅, Π³Π΄Π΅ ΠΊΠΎΠ΄ ΡΡΡΠ»Π°Π΅ΡΡΡ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π² Π΄ΡΡΠ³ΠΎΠΌ ΠΏΠ°ΠΊΠ΅ΡΠ΅.
ΠΡΠΎΠ±Π»Π΅ΠΌΠ°, Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΡ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΠΈΡΡ Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π·Π°ΠΊΠ»ΡΡΠ°Π»Π°ΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΠ΅Π°ΠΊΡΠΈΡ Π±ΡΠ»Π° ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π° Π² ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ, Π° ΡΠ°ΠΊΠΆΠ΅ Π±ΡΠ»Π° ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π° Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π² Π΄Π΅ΡΠ΅Π²Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π° withStyles , ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Ρ ΡΠΊΠΎΠ² Π² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π°.
ΠΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ ΡΠ΅Π°ΠΊΡΠΈΡ Π²Π½ΡΡΡΠ΅Π½Π½Π΅ ΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ReactCurrentDispatcher.current
, ΠΈ ΡΡΠΎ Π² ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΌ ΠΈΡΠΎΠ³Π΅ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ΅ ΡΠ΅Π°ΠΊΡΠΈΠΈ, Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² Π΄ΡΡΠ³ΠΎΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ΅ ΡΠ΅Π°ΠΊΡΠΈΠΈ - ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ ΠΏΡΡΡ, ΠΎΠ½ Π²ΡΠ΄Π°Π΅Ρ Invalid hook call ...
ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅.
ΠΡ ΡΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ Craco Π΄Π»Ρ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° Create React App Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ±ΠΎΡΠΊΠΈ:
webpack: {
alias: {
react: path.resolve(__dirname, './node_modules/react'),
},
},
ΠΠ΄Π½Π°ΠΊΠΎ ΡΡΠΎ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ±ΠΎΡΠΊΠΈ β ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΡΠ΅ΡΡΠΎΠ² ΠΊΠΎΠ΄ Π½Π΅ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ, Π° ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΈΠ· ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° β ΠΏΠΎΡΡΠΎΠΌΡ Π½Π°ΡΠΈΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ Π±ΡΠ»ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ CracoAlias ββΠ² Π½Π°ΡΠ΅ΠΌ craco.config.js
, ΡΡΠΎΠ±Ρ ΡΠΊΠ°Π·Π°ΡΡ ΠΏΡΡΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ΅ΡΡΠΎΠ²:
plugins: [
{
plugin: CracoAlias,
options: {
source: 'options',
baseUrl: './',
aliases: {
// We need to alias react to the one installed in the desktop/node_modules
// in order to solve the error "hooks can only be called inside the body of a function component"
// which is encountered during desktop jest unit tests,
// described at https://github.com/facebook/react/issues/13991
// This is caused by two different instances of react being loaded:
// * the first at packages/desktop/node_modules (for HostSignUpDownloadComponent.spec.js)
// * the second at packages/components/node_modules (for packages/components/Modal)
react: './node_modules/react',
},
},
},
],
Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» @craco/craco
Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π±Π΅Π· ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΡ, ΡΠ»Π΅Π΄ΡΡ ΠΏΡΠΈΠΌΠ΅ΡΡ @apieceofbart . Π¨Π°Π³ΠΈ Π΄Π»Ρ ΠΌΠ΅Π½Ρ Π±ΡΠ»ΠΈ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ npm link
Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ:
npm i @craco/craco --save
craco.config.js
Π² ΠΊΠΎΡΠ½Π΅, Π³Π΄Π΅ package.json Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π² Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.start
, build
ΠΈ test
, Π·Π°ΠΌΠ΅Π½ΠΈΠ² react-scripts
Π½Π° craco
Π² ΠΌΠΎΠ΅ΠΌ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.// craco.config.js
const path = require('path');
module.exports = {
webpack: {
alias: {
react: path.resolve(__dirname, './node_modules/react')
}
}
}
// package.json
{
....
"scripts": {
"start": "craco start",
"build": "craco build",
"test": "craco test",
"eject": "react-scripts eject"
},
...
}
edit: Ρ Π΄Π°ΠΆΠ΅ Π½Π΅ Π·Π°ΠΌΠ΅ΡΠΈΠ», ΡΡΠΎ Ρ @jasondarwin Π±ΡΠ»Π° ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΈΠ΄Π΅Ρ.
ΠΡΠΎΠ²Π΅Π» Π»ΡΡΡΠΈΠΉ Π΄Π΅Π½Ρ, ΠΏΡΡΠ°ΡΡΡ ΡΠ΅ΡΠΈΡΡ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. Π Π°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ΅Π³ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π΄Π΅ΡΡ, Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΎ ΠΊΠΎΠΌΡ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ.
ΠΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΌΠΎΠ½ΠΎΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ, ΠΈ Π΄Π²Π° ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π»ΠΈ ΡΠ°Π·Π½ΡΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΠΈΠ· ΡΠ΅Π°ΠΊΡΠΈΠΈ, Π½ΠΎ ΠΎΠ½ΠΈ ΡΠ°Π·ΡΠ΅ΡΠ°Π»ΠΈΡΡ Π² ΠΎΠ΄Π½ΠΎ ΠΈ ΡΠΎ ΠΆΠ΅ ΠΌΠ΅ΡΡΠΎ Π² ΠΌΠΎΠ΄ΡΠ»ΡΡ ΠΊΠΎΡΠ½Π΅Π²ΠΎΠ³ΠΎ ΡΠ·Π»Π°. ΠΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ, Ρ Π½Π°Ρ Π±ΡΠ»ΠΈ ΡΡΠΈ Π΄Π²Π° ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΎ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅Ρ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΠ°ΠΊΠ΅ΡΠ°. ΠΡΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π»ΠΎΡΡ Π² ΠΌΠΎΠ΄ΡΠ»Ρ ΠΊΠΎΡΠ½Π΅Π²ΠΎΠ³ΠΎ ΡΠ·Π»Π°, Π½ΠΎ ΠΏΡΠΈ ΠΈΠΌΠΏΠΎΡΡΠ΅ ΡΡΠΈΠΌ ΠΏΠ°ΠΊΠ΅ΡΠΎΠΌ ΠΎΠ½ ΠΏΠΎΠ»ΡΡΠ°Π» ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ. Π Π΅ΡΠ΅Π½ΠΈΠ΅ Π·Π°ΠΊΠ»ΡΡΠ°Π»ΠΎΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ Π²ΠΊΠ»ΡΡΠΈΡΡ ΡΠ΅Π°ΠΊΡΠΈΡ ΠΈ ΡΠ΅Π°ΠΊΡΠΈΡ DOM Π²ΠΎ Π²Π½Π΅ΡΠ½ΠΈΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ°, ΡΡΠΎΠ±Ρ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅Ρ Π½Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Π» Π½ΠΎΠ²ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ Π΄Π»Ρ ΠΏΠ°ΠΊΠ΅ΡΠ°.
externals: {
react: 'react',
reactDOM: 'react-dom',
},
ΠΠ°Π΄Π΅ΡΡΡ, ΡΡΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ ΠΊΠΎΠΌΡ-ΡΠΎ!
ΠΠ»Ρ ΠΌΠ΅Π½Ρ ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΎΡΡ react-hot-loader Π²Π΅ΡΡΠΈΠΈ 4.0.0, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎ react-hot-loader 4.8, ΠΏΠΎΡ ΠΎΠΆΠ΅, ΠΏΠΎΠΌΠΎΠ³Π»ΠΎ.
Π― ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Invalid hook call
Π’ΠΠΠ¬ΠΠ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΡΠ²ΠΎΠΈΡ
ΡΠ΅ΡΡΠΎΠ² Π½Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΌ Ρ
ΡΠΊΠ΅, ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΡΠΎΠ·Π΄Π°Ρ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΌΠΎΠ΄Π°Π»ΡΠ½ΡΠΌΠΈ ΠΎΠΊΠ½Π°ΠΌΠΈ.
Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, Ρ ΡΠΎΠ·Π΄Π°Π» ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ:
(https://github.com/BradCandell/invalid-hook-example)
react
ΠΈ react-dom
Π― ΡΠΏΡΡΠΊΠ°Ρ ΡΡΠΎ-ΡΠΎ ΡΠΆΠ°ΡΠ½ΠΎ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎΠ΅? ΠΠΎΠ³Π΄Π° Ρ Π½Π°ΡΡΡΠ°Π» ΠΏΡΠ°Π²ΠΈΠ»ΠΎ Π² ΠΏΡΠΎΡΠ»ΠΎΠΌ, npm start
ΡΠ΅ΡΠΏΠ΅Π» Π½Π΅ΡΠ΄Π°ΡΡ. ΠΠΎ ΡΡΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΠ²Π°Π» Π² ΠΌΠΎΠΈΡ
ΡΠ΅ΡΡΠ°Ρ
.
Π― ΡΠ΅Π½Ρ ΠΏΠΎΠΌΠΎΡΡ!
-ΠΡΡΠ΄
Π― ΡΠ΅ΡΠΈΠ» ΡΡΠΎ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΌΠΎΠ΅Π³ΠΎ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ°:
externals: { react: { root: "React", commonjs2: "react", commonjs: "react", amd: "react", }, "react-dom": { root: "ReactDOM", commonjs2: "react-dom", commonjs: "react-dom", amd: "react-dom", }, },
Π‘Π½Π°ΡΠ°Π»Π° Ρ ΠΏΠΎΠ΄ΡΠΌΠ°Π», ΡΡΠΎ ΡΡΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ npm link, ΡΠ΄Π΅Π»Π°Π» Π²ΡΠ΅, ΡΡΠΎ Π±ΡΠ»ΠΎ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ, ΠΈ Π΄Π°ΠΆΠ΅ ΠΏΠ΅ΡΠ΅ΡΠ΅Π» Π½Π° ΠΏΡΡΠΆΡ. Π ΠΊΠΎΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠΎΠ² Π²ΡΡΡΠ½ΠΈΠ»ΠΎΡΡ, ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΡΠΎ-ΡΠΎ Π΅ΡΠ΅, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ Π² npm Π΄Π°Π²Π°Π»Π° ΡΡ ΠΆΠ΅ ΠΎΡΠΈΠ±ΠΊΡ ΠΏΡΠΈ ΠΈΠΌΠΏΠΎΡΡΠ΅ Π² Π΄ΡΡΠ³ΠΎΠΉ ΠΏΡΠΎΠ΅ΠΊΡ.
ΠΡΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΡΡΠΎ Π΄Π»Ρ ΠΌΠ΅Π½Ρ. Π― ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π» react-toastify ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π» Π½Π΅Π²Π΅ΡΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² Π»ΠΎΠ²ΡΡΠΊΠΈ. Π― ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅Π» ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΏΡΠ½ΠΊΡ Π² ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ Ρ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ:
- Π£ Π²Π°Ρ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π½Π΅ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ Π²Π΅ΡΡΠΈΠΈ React ΠΈ React DOM.
- ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ Π½Π°ΡΡΡΠ°Π΅ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° Ρ ΡΠΊΠΎΠ².
- Π£ Π²Π°Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ React Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.
Π ΠΈΡΠΎΠ³Π΅ Π²ΡΡΠ΅Π» 3-ΠΉ Π½ΠΎΠΌΠ΅Ρ. Π― ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Π» ΡΡΠΎΠΌΡ:
https://reactjs.org/warnings/invalid-hook-call-warning.html#duplicate -ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ
ΠΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΡ
Π²ΡΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π»ΠΎ Π΄Π»Ρ ΠΌΠ΅Π½Ρ, ΠΏΠΎΠΊΠ° Ρ Π½Π΅ ΠΏΠΎΠ½ΡΠ», ΡΡΠΎ ΡΠ²ΡΠ·ΡΠ²Π°Ρ Π΄ΡΡΠ³ΡΡ ΠΊΠΎΠΏΠΈΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ, ΠΊΠΎΡΠΎΡΡΡ Ρ _ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π»_.
Π― ΡΡΠ°Π½ΡΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π» ΠΈ ΡΠΏΠ°ΠΊΠΎΠ²Π°Π» ΠΈΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΡΠ²ΠΎΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
Π²Π΅ΡΡΠΈΠΉ React, ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΡ
Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π»Π° true
Π²ΠΌΠ΅ΡΡΠΎ false
.
ΠΠΎΠΌΠ΅ΡΠΊΠ° react
ΠΊΠ°ΠΊ Π²Π½Π΅ΡΠ½ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ ΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΅Π΅ ΠΈΠ· ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΌΠΎΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΡΠ΄Π΅Π»Π°Π»ΠΈ ΡΠ²ΠΎΠ΅ Π΄Π΅Π»ΠΎ.
ΠΠΎΠΉ ΡΠ»ΡΡΠ°ΠΉ Π±ΡΠ» Π½Π΅ ΠΌΠΎΠ½ΠΎΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠ΅ΠΌ, Π° ΡΠ΅ΠΌ-ΡΠΎ ΠΏΠΎΡ ΠΎΠΆΠΈΠΌ. ΠΡ ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌ Π½ΠΎΠ²ΡΡ ΡΡΡΡΠΊΡΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°, ΠΈ Π²ΠΌΠ΅ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ npm link ΠΈΠ»ΠΈ lerna ΠΌΡ ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΡ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠΎΠ², ΡΡΠΎΠ±Ρ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°ΡΡ ΡΠ°ΠΉΠ»Ρ Π² ΡΠΎΠ΄ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅. ΠΠ½ ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, Π½ΠΎ Π²Ρ ΡΡΠΎΠ»ΠΊΠ½Π΅ΡΠ΅ΡΡ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ. Π ΡΡΠ°ΡΡΡΡ, ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΎΡ @apieceofbart ΡΡΡΡΠ°Π½ΠΈΠ»ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.
Π‘ΡΡΠΎΠΊΠ° 130:21: React Hook Β«useStylesΒ» Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π² ΡΡΠ½ΠΊΡΠΈΠΈ Β«pharmacyDashboardΒ», ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ React, Π½ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ React Hook.
Π‘ΡΡΠΎΠΊΠ° 133:45: React Hook Β«React.useStateΒ» Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π² ΡΡΠ½ΠΊΡΠΈΠΈ Β«pharmacyDashboardΒ», ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ React, Π½ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ React Hook.
ΡΡΠΎ ΠΎΡΠΈΠ±ΠΊΠ° ..... ΠΌΠΎΠΆΠ΅Ρ ΠΊΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ, ΠΏΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΠΏΠΎΠΌΠΎΠ³ΠΈΡΠ΅ ΠΌΠ½Π΅ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΡΡΠΎΠ³ΠΎ
@vyshnaviryali Π»ΡΡΡΠ΅ Π½Π°Π·ΠΎΠ²ΠΈΡΠ΅ ΡΠ²ΠΎΡ ΡΡΠ½ΠΊΡΠΈΡ usePharmacyDashboard
./src/components/HomeFiles/AppFooter.js
Π‘ΡΡΠΎΠΊΠ° 1:1: Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° Β«material-ui/no-hardcoded-labelsΒ».
ΠΌΠΎΠΆΠ΅Ρ ΠΊΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ, ΠΏΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΠΏΠΎΠΌΠΎΠ³ΠΈΡΠ΅ ΠΌΠ½Π΅ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΡΡΠΎΠ³ΠΎ
ΠΠ»Ρ Π²ΡΠ΅Ρ
, ΠΊΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ Ρ npm link
, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊ Π²Π°ΡΠΈΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌ, Π½ΠΎ Π½Π΅ Ρ
ΠΎΡΠΈΡΠ΅ npm publish
ΠΏΠ΅ΡΠ΅Π΄ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, Ρ ΡΠ΄ΠΈΠ²Π»Π΅Π½, ΡΡΠΎ Π½ΠΈΠΊΡΠΎ Π½Π΅ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΠ» ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ yalc
(https://www.npmjs.com/package/yalc)
ΠΠ»Ρ Π²ΡΠ΅Ρ , ΠΊΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ Ρ
npm link
, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊ Π²Π°ΡΠΈΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌ, Π½ΠΎ Π½Π΅ Ρ ΠΎΡΠΈΡΠ΅npm publish
ΠΏΠ΅ΡΠ΅Π΄ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, Ρ ΡΠ΄ΠΈΠ²Π»Π΅Π½, ΡΡΠΎ Π½ΠΈΠΊΡΠΎ Π½Π΅ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΠ» ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡyalc
(https://www.npmjs.com/package/yalc)
Π― Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ΄Π΅Π»Π°Π» Π² ΠΏΡΠΎΡΠ»ΠΎΠΌ Π³ΠΎΠ΄Ρ: https://github.com/facebook/react/issues/13991#issuecomment -535150839
ΠΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΠΆΠ΅ ΠΏΠΎΡΡΠΈ Π³ΠΎΠ΄ Π±Π΅Π· Π½Π°ΡΠ΅ΠΊΠ°Π½ΠΈΠΉ.
ΠΡΠ΅ ΠΎΠ΄ΠΈΠ½ Π·Π΄Π΅ΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠΉ lerna; ΡΡΠΎΠ±Ρ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΡΡΠΎ, Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΠ» Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ react
ΠΈ react-dom
Π² ΡΠ²ΠΎΠΉ ΠΊΠΎΡΠ΅Π½Ρ package.json
.
Π£ ΠΌΠ΅Π½Ρ Π±ΡΠ»Π° ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΈ Ρ ΡΠ΅ΡΠΈΠ» Π΅Π΅, Π΄ΠΎΠ±Π°Π²ΠΈΠ²:
alias: { react: path.resolve('./node_modules/react') }
to ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ
resolve
Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΌΠΎΠ΅Π³ΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ Π±ΡΠ»Π° ΠΌΠΎΡ ΠΎΡΠΈΠ±ΠΊΠ°, ΠΊΠΎΠ³Π΄Π° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» Π΄Π²Π΅ ΠΊΠΎΠΏΠΈΠΈ React, Π½ΠΎ Ρ ΡΠΎΠ³Π»Π°ΡΠ΅Π½, ΡΡΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π·Π΄ΠΎΡΠΎΠ²ΠΎ, Π΅ΡΠ»ΠΈ Π±Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ Π±ΡΠ»ΠΎ Π»ΡΡΡΠ΅. Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΡ ΠΎΠΆΠ΅ Π½Π°: # 2402
ΠΠ»Ρ ΡΠ΅Ρ
, ΠΊΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠΉ Π²ΡΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄, Π½ΠΎ ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ jest, Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ ΠΈΡ
Π² moduleNameMapper
Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ jest (ΠΎΠΏΡΡΡΠΈΡΠ΅ react-dom, Π΅ΡΠ»ΠΈ ΡΡΠΎ Π½Π΅ Π½ΡΠΆΠ½ΠΎ):
moduleNameMapper: {
...
"^react$": "<rootDir>/node_modules/react",
"^react-dom$": "<rootDir>/node_modules/react-dom",
...
}
Π― Π² ΡΠ°ΡΡΠ΅ΡΡΠ½Π½ΠΎΡΡΠΈ. Π― ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΡΠΎ, Π½ΠΎ ΠΌΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΈΡ Ρ ΡΠΊΠΎΠ², ΠΈ Π½Π΅Ρ Π΄ΡΠ±Π»ΠΈΠΊΠ°ΡΠΎΠ² ΡΠ΅Π°ΠΊΡΠΈΠΈ ΠΈΠ»ΠΈ ΡΠ΅Π°ΠΊΡΠΈΠΈ. Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ next.js. ΠΠΎΠΆΠ΅Ρ ΡΡΠΎ ΠΊΠ°ΠΊ-ΡΠΎ ΡΠ²ΡΠ·Π°Π½ΠΎ?
npm ls react
npm ls react-dom
@maapteh ΡΡΠΎ Π±ΡΠ»ΠΎ Π΄Π»Ρ ΠΌΠ΅Π½Ρ? Π― Π²ΡΠΏΠΎΠ»Π½ΠΈΠ» ΡΡΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈ Π½Π΅ Π½Π°ΡΠ΅Π» Π΄ΡΠ±Π»ΠΈΠΊΠ°ΡΠΎΠ². ΠΠ±Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΈΠΌΠ΅ΡΡ Π²Π΅ΡΡΠΈΡ 16.13.1.
@dancancro Π― ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Next.js ΠΈ Π½Π΅ ΠΌΠΎΠ³Ρ ΡΡΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ.
npm ls react
ΠΈ npm ls react-dom
Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Ρ Π·Π°ΠΏΠΈΡΡ. ΠΠΎ Ρ Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½, ΡΡΠΎ ΡΡΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ. Π― ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡ Ρ ΡΡΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ ΠΏΡΠΈ ΡΡΡΠ»ΠΊΠ΅ Π½Π° Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ. npm ls
Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Ρ Π·Π°ΠΏΠΈΡΡ, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Ρ Π½Π΅ ΡΠ²ΡΠ·ΡΠ²Π°Ρ ΡΠ΅Π°ΠΊΡΠΈΡ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Ρ ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌ ΡΠ΅ΠΏΠΎ. ΠΠΎ Π΄Π°ΠΆΠ΅ ΠΊΠΎΠ³Π΄Π° Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΡΠ΅Π°Π³ΠΈΡΡΡ Π½Π° ΡΡΡΠ»ΠΊΡ, Ρ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅.
@justincy Π£ ΠΌΠ΅Π½Ρ Π½Π΅Ρ ΡΡΡΠ»ΠΎΠΊ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΡ Π² ΠΌΠΎΠ΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅. ΠΡΡΡΡ ΠΎΠ± Π·Π°ΠΊΠ»Π°Π΄, ΡΡΠΎ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ Next.js. ΠΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΈΡΡΠ΅Π·Π½Π΅Ρ, ββΠ΅ΡΠ»ΠΈ Ρ ΠΏΠΎΠΌΠ΅ΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π²Π½ΡΡΡΡ typeof document !== 'undefined'
, ΡΡΠΎ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΠ΄ΠΎΡΠ²Π΅Ρ ΡΠ΅Π»Ρ Next.js.
ΠΠ½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ ΡΠ΅ΡΠΈΡΡ ΠΌΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΡΠ΄Π°Π»ΠΈΠ² ΡΠ΅Π°ΠΊΡΠΈΡ ΠΈ ΡΠ΅Π°ΠΊΡΠΈΡ-Π΄ΠΎΠΌ ΠΈΠ· node_modules Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ. ΠΡΠΎ Π½Π΅ ΠΈΠ΄Π΅Π°Π»ΡΠ½ΠΎ, Π½ΠΎ, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, Ρ ΠΌΠΎΠ³Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ.
@dancancro Π― ΡΠΊΠ΅ΠΏΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΡΠ½ΠΎΡΡΡΡ ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎ Π²Π°ΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π²ΡΠ·Π²Π°Π½Π° Next.js. ΠΡΠ»ΠΈ Π±Ρ ΡΡΠΎ Π±ΡΠ»ΠΎ ΡΠ°ΠΊ, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄ΡΡΠ³ΠΈΠ΅ Π»ΡΠ΄ΠΈ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΠΈΡΡ Π±Ρ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ. Π― ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡ Ρ ΡΡΠΈΠΌ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ·-Π·Π° ΡΠ²ΡΠ·Π°Π½Π½ΡΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ². Π― Π½Π΅ Π²ΠΈΠΆΡ ΠΎΡΠΈΠ±ΠΊΠΈ Π±Π΅Π· ΡΠ²ΡΠ·Π°Π½Π½ΡΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ².
ΠΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΈΡΡΠ΅Π·Π½Π΅Ρ, ββΠ΅ΡΠ»ΠΈ Ρ ΡΠ΄Π°Π»Ρ ΠΏΡΡΡ ΠΈΠ· ΡΠ΅ΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ΅. Π― Π½Π΅ Π²ΠΈΠΆΡ Π½ΠΈΡΠ΅Π³ΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΠ³ΠΎ Π² ΡΡΠΈΡ
ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°Ρ
. ΠΠ±Π΅ΡΡΡΠ²Π°Π½ΠΈΠ΅ ΡΡΠΈΡ
ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² Π² typeof document !== 'undefined'
ΡΠ°ΠΊΠΆΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
ΠΡΠΈΠ²Π΅Ρ, ΠΊΠΎΠΌΠ°Π½Π΄Π°, Ρ ΠΏΡΡΠ°ΡΡΡ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ Π²Π΅ΡΡΠΈΡ React Ρ 16.2.0 Π΄ΠΎ 16.13.1, ΡΠ°ΠΊΠΆΠ΅ ΡΠ΄Π΅Π»Π°Π» ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ Π΄Π»Ρ react-dom.
Π’Π΅ΠΏΠ΅ΡΡ Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ-ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π² "/test"
class TestWrapper extends React.Component {
render() {
return (
<React.Fragment>
<TestComponent />
</React.Fragment>
)
}
}
Π² ΡΠ΅ΡΡΠΎΠ²ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠ΅ Ρ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π» ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Ρ Ρ
ΡΠΊΠΎΠΌ
function TestComponent(props) {
useEffect(() => {
console.log("TEST COMPONENT");
});
return (
<div>
Hello world!
</div>
)
}
ΠΠΎ ΠΊΠΎΠ³Π΄Π° ΡΡΡΠ°Π½ΠΈΡΠ° ΡΠ΅Π½Π΄Π΅ΡΠΈΡΡΡ, Ρ
ΡΠΊ UseEffect Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΠ°, Ρ.Π΅. ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΎ Π½Π΅Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΎΠΌ Π²ΡΠ·ΠΎΠ²Π΅ Ρ
ΡΠΊΠ°.
PS. :
ΡΡΠΎ ΡΠΎ, ΡΡΠΎ Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ
Π― ΠΏΡΠΎΡΡΠΎ ...
@ @
Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ nextJS, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΠ½Π΅ Π½Π΅ Π½ΡΠΆΠ΅Π½ ΠΈΠΌΠΏΠΎΡΡ React. Π Ρ ΠΏΡΠΎΠ±ΠΎΠ²Π°Π» - Π½Π΅ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ.
ΠΡΠ΅ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΡΠ°Π½ΠΈΡΡ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΎΡΠ»ΠΈΡΠ½ΠΎ
@Brotipok ΠΊΠ°ΠΊΠ°Ρ Π²Π΅ΡΡΠΈΡ next.js? (ΠΠΈΠΆΡ ΠΏΠΎΡ ΠΎΠΆΠΈΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π΅ Π½Π° 9.5 Ρ 9.4.Π₯)
ΠΡΠΈΠ²Π΅Ρ!
Π£ ΠΌΠ΅Π½Ρ ΡΠ° ΠΆΠ΅ ΠΎΡΠΈΠ±ΠΊΠ°, ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°ΠΊΠ΅Ρ Π΄Π»Ρ ΡΠ΅Π°ΠΊΡΠΈΠΈ ΠΈ ΡΠ΅Π°ΠΊΡΠΈΠΈ dom, ΠΊΠΎΠ³Π΄Π° Ρ Π΄Π΅Π»Π°Ρ npm ls.
ΠΠ΅ΡΡΠΈΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ: 16.13.1
ΠΠ΅ΡΡΠΈΡ React-Π΄ΠΎΠΌΠ°: 16.13.1
Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ typescript ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π» ΠΏΡΠΎΠ΅ΠΊΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ create-react-app my-app --template typescript.
Π€ΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ Ρ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π² Π½Π΅ΠΌ Ρ ΡΠΊΠΈ.
ΠΠ°ΠΊΠ΅Ρ.json
{
"ΠΈΠΌΡ": "Π±Π»Π°Π±Π»Π°ΠΌΠΎΠ²ΠΈΠ΅",
"Π²Π΅ΡΡΠΈΡ": "0.1.0",
"ΡΠ°ΡΡΠ½ΠΎΠ΅": ΠΏΡΠ°Π²Π΄Π°,
"Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ": {
"@testing-library/jest-dom": "^4.2.4",
"@testing-library/ΡΠ΅Π°ΠΊΡΠΈΡ": "^9.5.0",
"@testing-library/user-event": "^7.2.1",
"@types/jest": "^24.9.1",
"@ΡΠΈΠΏΡ/ΡΠ·Π΅Π»": "^12.12.53",
"@types/ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ": "^16.9.43",
"@types/react-dom": "^16.9.8",
"@types/react-router-dom": "^5.1.5",
"Π·Π½Π°ΡΠΊΠΈ ΡΠ΅Π°ΠΊΡΠΈΠΈ": "^3.10.0",
"ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ-ΡΠΊΡΠΈΠΏΡΡ": "3.4.1",
"ΠΌΠ°ΡΠΈΠ½ΠΎΠΏΠΈΡΡ": "^3.7.5",
"webpack-bundle-analyzer": "^3.8.0"
},
"ΡΠΊΡΠΈΠΏΡΡ": {
"start": "Π·Π°ΠΏΡΡΠΊ ΡΠ΅Π°Π³ΠΈΡΡΡΡΠΈΡ
ΡΠΊΡΠΈΠΏΡΠΎΠ²",
"build": "ΡΠ±ΠΎΡΠΊΠ° ΡΠ΅Π°Π³ΠΈΡΡΡΡΠΈΡ
ΡΠΊΡΠΈΠΏΡΠΎΠ²",
"test": "ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅Π°Π³ΠΈΡΡΡΡΠΈΡ
ΡΠΊΡΠΈΠΏΡΠΎΠ²",
"eject": "ΠΈΠ·Π²Π»Π΅ΡΡ ΡΠΊΡΠΈΠΏΡΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ",
"analyze": "source-map-explorer 'build/static/js/*.js'"
},
"eslintConfig": {
Β«ΡΠ°ΡΡΠΈΡΡΠ΅ΡΒ»: Β«ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Β»
},
"ΡΠΏΠΈΡΠΎΠΊ Π±ΡΠ°ΡΠ·Π΅ΡΠΎΠ²": {
"ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ": [
Β«>0,2%Β»,
"Π½Π΅ ΡΠΌΠ΅Ρ",
"Π½Π΅ Π²ΡΠ΅ op_mini"
],
"ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°": [
"ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ 1 Π²Π΅ΡΡΠΈΡ Ρ
ΡΠΎΠΌΠ°",
"ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ 1 Π²Π΅ΡΡΠΈΡ Firefox",
"ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ 1 Π²Π΅ΡΡΠΈΡ ΡΠ°ΡΠ°ΡΠΈ"
]
}
}
ΠΡΠΎ Π²Π°ΠΆΠ½ΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ, ΠΈ ΠΎΠ½ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ²ΠΎΠ΄ΠΈΡ ΠΌΠ΅Π½Ρ Ρ ΡΠΌΠ°.
ΠΡΠ»ΠΈ ΠΊΡΠΎ-ΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΌΠΎΡΡ ΠΡΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π·Π΄ΠΎΡΠΎΠ²ΠΎ.
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ.
@Brotipok ΠΊΠ°ΠΊΠ°Ρ Π²Π΅ΡΡΠΈΡ next.js? (ΠΠΈΠΆΡ ΠΏΠΎΡ ΠΎΠΆΠΈΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π΅ Π½Π° 9.5 Ρ 9.4.Π₯)
ΠΠΎΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ
"Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ": {
"ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ": "9.4.4",
"ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ": "^1.4.0",
"ΡΠ·Π΅Π»-Π΄Π΅ΡΠ·ΠΎΡΡΡ": "^4.14.1",
"ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ": "16.13.1",
"ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ-Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ-ΠΌΠ΅ΡΠ°": "^3.0.0-Π±Π΅ΡΠ°.2",
"ΡΠ΅Π°ΠΊΡΠΈΡ-Π΄ΠΎΠΌ": "16.13.1",
"ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ-Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΡΠ½Π°Ρ-Π²ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΠΊΠ°Π»Π°": "^ 1.5.3",
"ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ-ΠΌΠ΅ΡΠ°-ΡΠ΅Π³ΠΈ": "^0.7.4",
"ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ Π½Π° ΠΊΠ»ΠΈΠΊ ΡΠ½Π°ΡΡΠΆΠΈ": "^6.9.0"
},
"devDependencies": {
"@ΡΠΈΠΏΡ/ΡΠ·Π΅Π»": "^14.0.23",
"@types/ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ": "^16.9.43",
"ΠΌΠ°ΡΠΈΠ½ΠΎΠΏΠΈΡΡ": "^ 3.9.7"
}
Π― ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡ Ρ ΡΠΎΠΉ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ ΠΏΡΠΈ ΠΈΠΌΠΏΠΎΡΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² material-ui/core/Dialog
, Ρ Π½Π°ΡΡΡΠΎΠΈΠ» ΡΠ²ΠΎΠΉ package.json
Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅Π°ΠΊΡΠΈΠΈ 16.8.0
ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ Π΄Π»Ρ react
ΠΈ react-dom
ΠΈΠΌΠΏΠΎΡΡ.
Π― Π·Π°ΠΏΡΡΠΊΠ°Π» npm ls react
ΠΈ npm ls react-dom
ΡΠΎΠ»ΡΠΊΠΎ Ρ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠΌΠΏΠΎΡΡΠΎΠΌ. Π― ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΎΠ±ΠΎΠ²Π°Π» ΡΠ΅ΡΡ, ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠΉ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ:
// Add this in node_modules/react-dom/index.js
window.React1 = require('react');
// Add this in your component file
require('react-dom');
window.React2 = require('react');
console.log(window.React1 === window.React2);
Π§ΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ false
, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΊΠ°ΠΊ ΠΌΠ½Π΅ ΠΎΡΡΠ»Π΅Π΄ΠΈΡΡ Β«Π΄ΡΡΠ³ΡΡΒ» Π²Π΅ΡΡΠΈΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΡΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΡ? ΠΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Ρ ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Material UI , ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ, ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ Π½Π°ΠΆΠΌΠΈΡΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ Π΅Π³ΠΎ Π΄Π»Ρ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π°. Π― ΠΌΠΎΠ³Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ List
ΠΈ ListItems
ΠΈ Ρ. Π΄.
Π― ΠΏΡΠΎΠ±ΠΎΠ²Π°Π» ΡΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ , ΠΈ ΡΡΠΎ ΡΠΎΠΆΠ΅ Π½Π΅ ΠΈΡΠΏΡΠ°Π²ΠΈΠ»ΠΎ.
Π― Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅Ρ (Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΏΡΠΎΠ΅ΠΊΡ), ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ±ΠΎΡΠΊΠ° ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ Ρ react-scripts build
, Π΅ΡΠ»ΠΈ ΡΡΠΎ ΠΈΠΌΠ΅Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅.
ΠΠ΅ΡΠ΅ΠΏΠΈΡΠ°ΡΡ: Ρ ΠΏΡΠΎΡΡΠΎ Π·Π°ΠΌΠ΅Π½Ρ ΡΠ²ΠΎΠΉ Π²ΠΎΠΏΡΠΎΡ ΡΡΡΠ»ΠΊΠΎΠΉ Π½Π° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ (ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π·Π°ΠΏΡΠΎΡ Π½Π° Π΅ΡΠ΅ Π±ΠΎΠ»ΡΡΡΡ ΡΡΠ½ΠΎΡΡΡ ΡΠ΅ΡΠΌΠΈΠ½ΠΎΠ² Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°Ρ Π΄Π»Ρ Π½Π°Ρ, ΡΠ°ΠΉΠ½ΠΈΠΊΠΎΠ²? :))
ΠΠ°Π΄Π½ΠΈΠΉ ΠΏΠ»Π°Π½:
Π― ΠΏΡΡΠ°Π»ΡΡ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ webpack ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Ρ Ρ
ΡΠΊΠ°ΠΌΠΈ Π² Π°ΠΊΡΠΈΠ², Π³Π΄Π΅ ΡΡΠΎΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π²ΡΠ·Π²Π°ΡΡ ΠΈΠ· vanilla JS Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ,
function Example() {
const [count, setCount] = React.useState(0);
return <button onClick={() => setCount(count + 1)}>
You clicked {count} times
</button>;
}
export default Example;
... ΠΊΠΎΡΠΎΡΡΠΉ Ρ Ρ ΠΎΡΠ΅Π» ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ, ΠΈ ΠΏΠΎΡΠ»Π΅ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΡΠΎΠ³ΠΎ Π°ΠΊΡΠΈΠ²Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΈΠ· HTML, Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ:
<script defer>
ReactDOM.render(
ExportedCompiledExample.default(props),
document.getElementById("my_element")
);
</script>
Π£ ΠΌΠ΅Π½Ρ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π»ΠΎ Π΄Π°Π²Π½ΡΠΌ-Π΄Π°Π²Π½ΠΎ, ΠΏΠΎΠΊΠ° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠ°Π» Ρ ΡΠΊΠΎΠ²_. ΠΠΎ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Ρ ΡΠΊΠΎΠ² Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π» ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡΡ Ρ ΡΡΠΈΠΌ ΡΠΆΠ°ΡΠ½ΡΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅.
ΠΠΎΡΡΡΡΠ°ΡΡΠ΅ ΠΏΡΠΎΡΡΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅
Π― ΡΠ»Π΅Π΄ΠΎΠ²Π°Π» _ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Ρ_ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΡ
ΠΎΡΠ²Π»Π΅ΠΊΠ°ΡΡΠΈΡ
ΠΌΠ°Π½Π΅Π²ΡΠΎΠ² (Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²Π΅ΡΡΠΈΠΉ/ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² react/reactDOM, ΠΈΠΌΠΏΠΎΡΡ npm ΠΈ ΡΠΊΡΡΡΡΠ΅ Π²ΡΠΎΡΠΈΡΠ½ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ, react-hot-loader, Π½Π°ΡΡΡΠΎΠΉΠΊΠ° webpack, Π²Π½Π΅ΡΠ½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ, ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΡ ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ°Ρ
/ΠΌΠΎΠ΄ΡΠ»ΡΡ
/Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°Ρ
, ΡΡΡΡΠΊΡΡΡΠ° ΠΏΠΎΡΠ»Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ.. .), ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΡΡΠΎ, ΡΡΠΎ ΡΡΠ°Π±ΠΎΡΠ°Π»ΠΎ:
export default () => <Example />;
(ΠΈΠ»ΠΈ export default props => <Example {...props} />
, Π³Π΄Π΅ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ).
ΠΡΠΌΠ°Ρ, Π² ΡΠ΅ΡΡΠΎΡΠΏΠ΅ΠΊΡΠΈΠ²Π΅ 20/20 ΡΡΠΎ ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ».
ΠΠΎ ΠΏΡΠΎΡΡΠΎ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠΊΠ°Π·Π°ΡΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ ΠΏΡΡΠ°Π½ΠΈΡΡ Π½Π° ΡΠ»ΡΡΠ°ΠΉ, Π΅ΡΠ»ΠΈ ΡΡΠΎ ΠΊΠΎΠΌΡ-ΡΠΎ Π΅ΡΠ΅ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ: Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°Ρ ΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π°Ρ Ρ ΡΠΊΠΎΠ² Π³ΠΎΠ²ΠΎΡΠΈΡΡΡ: _ΠΡΠ·ΠΎΠ²ΠΈΡΠ΅ ΠΈΡ Π½Π° Π²Π΅ΡΡ Π½Π΅ΠΌ ΡΡΠΎΠ²Π½Π΅ Π² ΡΠ΅Π»Π΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°_. Π§ΡΠΎ Ρ ΠΈ ΡΠ΄Π΅Π»Π°Π», ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΡΠ°Π²ΠΈΠ» ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΡΠΌΠΎ Π² ΡΠ²ΠΎΡ ΡΡΡΡΠΊΡΡΡΡ.
ΠΠΎΡ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΈΡ ΡΠ°ΠΊΠΎΠ²Π°, ΡΡΠΎ ΡΡΠΎ , ΠΈΠ· ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ²...
function Example() {
// Declare a new state variable, which we'll call "count"
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
... ΡΠ°ΠΌ ΠΏΠΎ ΡΠ΅Π±Π΅ ΠΠ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠΌ ? ΠΡΠΎ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΡΠ°ΠΊ Π² ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ Π²ΡΠ·ΠΎΠ²Π° (ΡΠ°ΠΊ ΡΡΠΎ Π½Π΅ Example()
, Π° <Example />
).
Π― ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ, ΡΡΠΎ ΠΌΠΎΠ³ ΠΏΡΠΎΠΏΡΡΡΠΈΡΡ ΡΡΠΎ Π³Π΄Π΅-ΡΠΎ Π΅ΡΠ΅ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ, Π½ΠΎ Π΅ΡΠ»ΠΈ Π½Π΅Ρ: ΡΡΠΎ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΠ»ΠΎ Π±Ρ ΠΌΠ½Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, Π΅ΡΠ»ΠΈ Π±Ρ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ (ΠΈΠ»ΠΈ ΠΏΡΠΎΡΡΠΎ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΠΌΠΎΠ΄ΡΠ»Ρ ES) Π±ΡΠ»ΠΎ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΎ/ΡΠΏΠΎΠΌΡΠ½ΡΡΠΎ/ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ Π½ΠΈΠΌ. :) Π’Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅, ΡΡΠΎ ΠΏΡΡΠΌΠ°Ρ Π²Π΅ΡΡΠΈΡ export default Example
ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π±Π΅Π· Ρ
ΡΠΊΠΎΠ².
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° ΡΠ°Π±ΠΎΡΠ΅Π΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ @apieceofbart! ΠΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π±ΡΠ»Π° ΡΠ²ΡΠ·Π°Π½Π° ΡΠΎ ΡΡΡΠ»ΠΊΠΎΠΉ npm.
ΠΠΎΡ ΠΊΠ°ΠΊ Ρ Π·Π°ΡΠ°Π±ΠΎΡΠ°Π» Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Create React, Π³Π΄Π΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Webpack ΡΠΊΡΡΡΠ° ΠΏΠΎ Π΄ΠΈΠ·Π°ΠΉΠ½Ρ. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈ Π²Π°ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ @florianzemma?
npm install -D react-app-rewired
// config-overrides.js
module.exports = function override(config, env) {
const path = require('path');
return {
...config,
resolve: {
...config.resolve,
alias: {
...config.resolve.alias,
react: path.resolve('./node_modules/react')
}
}
};
}
react-scripts ...
Π² package.json Π½Π° react-app-rewired ...
.Π― Π½Π°Π΄Π΅ΡΡΡ, ΡΡΠΎ ΡΡΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ
Π― ΠΏΠΎΠ»ΡΡΠΈΠ» ΡΡΡ ΠΎΡΠΈΠ±ΠΊΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Ρ Π·Π°Π³ΡΡΠ·ΠΈΠ» ΠΏΠ°ΠΊΠ΅ΡΡ 2 ΡΠ°Π·Π°.
Π ΠΌΠΎΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»ΠΎ ΠΈΠ·-Π·Π° ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΡΠ°Π±Π»ΠΎΠ½ nunjucks, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΡΡΠΈΡΠΎΠ²ΡΠ²Π°Π»ΠΈΡΡ ΡΠ΅Π³ΠΈ script, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΡΡ 2 ΡΠ°Π·Π° - Π² ΡΠ°ΠΌΠΎΠΌ ΠΌΠ°ΠΊΠ΅ΡΠ΅ ΠΈ Π² ΠΎΠ±ΡΠ΅ΠΌ ΡΠ°Π±Π»ΠΎΠ½Π΅ Π΄Π»Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ ΡΠ΅Π³Π° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°,
Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Yarn ΠΈ ΠΈΡΠΏΡΠ°Π²ΠΈΠ» ΡΡΠΎ, Π·Π°Π΄Π°Π² ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π² ΠΌΠΎΠ΅ΠΌ
package.json
:"resolutions": { "**/react": "16.7.0-alpha.2", "**/react-dom": "16.7.0-alpha.2" },
ΠΠΎΠΌΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ Π² ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ (ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ), Ρ ΠΎΠ±Π½ΠΎΠ²ΠΈΠ» Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄:
yarn add link:/path/to/parent-app/node_modules/react
yarn add link:/path/to/parent-app/node_modules/react-dom
ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Ρ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΡΠ²ΡΠ·Π°Π» Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Π² ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ yarn add link:/path/to/library
ΠΡΠΈΠ²Π΅Ρ
Π― ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡ Ρ ΡΠΎΠΉ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ Ρ ΡΠ°Π±ΠΎΡΠΈΠΌΠΈ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π°ΠΌΠΈ ΠΏΡΡΠΆΠΈ.
Π£ ΠΌΠ΅Π½Ρ ΡΠ°ΠΊΠΎΠΉ ΠΌΠ°ΠΊΠ΅Ρ:
Π Π°Π±ΠΎΡΠ΅Π΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ/
βββ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°/
βββ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅1/
βββ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅2/
app1 ΠΈ app2 ΠΈΠΌΠ΅ΡΡ ΠΏΡΡΠΌΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π΄Π»Ρ ΡΠ΅Π°ΠΊΡΠΈΠΈ v16.9.0, react-dom v16.9.0 ΠΈ Β«Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈΒ».
Β«Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°Β» ΠΈΠΌΠ΅Π΅Ρ ΠΎΠ΄Π½ΠΎΡΠ°Π½Π³ΠΎΠ²ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ ΠΎΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ v16.9.0, Π½ΠΎ ΡΠ°ΠΊΠΆΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΠΎΡ ΡΠ±ΠΎΡΠ½ΠΈΠΊΠ° ΡΠ°ΡΡΠΊΠ°Π·ΠΎΠ².
ΠΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΠΈΠ· ΡΠ±ΠΎΡΠ½ΠΈΠΊΠ° ΡΠ°ΡΡΠΊΠ°Π·ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ v16.13.1.
ΠΠ΄Π½Π°ΠΊΠΎ, ΠΊΠΎΠ³Π΄Π° Ρ Π·Π°ΠΏΡΡΠΊΠ°Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΡ ΠΏΡΡΠΆΠΈ, Ρ ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΠ΅Π°ΠΊΡΠΈΡ 16.13.1 Π² ΠΌΠΎΠΈΡ
ΡΠ·Π»Π°Ρ
Π²Π΅ΡΡ
Π½Π΅Π³ΠΎ ΡΡΠΎΠ²Π½Ρ node_modules ΠΈ ΡΠ΅Π°ΠΊΡΠΈΡ 16.9.0 Π² Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ
ΡΠ·Π»Π°Ρ
_ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ app1 ΠΈ app2.
ΠΠΎΠ³Π΄Π° Ρ Π·Π°ΠΏΡΡΠΊΠ°Ρ app1 (ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ CRA), ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ²ΠΎΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΡΠ΅Π°ΠΊΡΠΈΡ v16.9.0, Π½ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΈΠ· Β«Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈΒ» ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ React v16.13.1.
ΠΠ½Π΅ ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ ΠΏΠΎΠ΄ΡΠ΅ΠΌΠ° ΠΏΡΡΠΆΠΈ, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° create-ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΠΈ ΡΠ΅ΠΌ, ΠΈ Π΄ΡΡΠ³ΠΈΠΌ?
ΠΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ Π·Π½Π°Π΅Ρ ΠΎΠ±Ρ
ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡΡΡ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΡΠ΅Π½Π°ΡΠΈΡ?
ΠΡΠΈΠ²Π΅Ρ
Π― ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡ Ρ ΡΠΎΠΉ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ Ρ ΡΠ°Π±ΠΎΡΠΈΠΌΠΈ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π°ΠΌΠΈ ΠΏΡΡΠΆΠΈ.
Π£ ΠΌΠ΅Π½Ρ ΡΠ°ΠΊΠΎΠΉ ΠΌΠ°ΠΊΠ΅Ρ:Π Π°Π±ΠΎΡΠ΅Π΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ/
βββ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°/
βββ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅1/
βββ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅2/app1 ΠΈ app2 ΠΈΠΌΠ΅ΡΡ ΠΏΡΡΠΌΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π΄Π»Ρ ΡΠ΅Π°ΠΊΡΠΈΠΈ v16.9.0, react-dom v16.9.0 ΠΈ Β«Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈΒ».
Β«Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°Β» ΠΈΠΌΠ΅Π΅Ρ ΠΎΠ΄Π½ΠΎΡΠ°Π½Π³ΠΎΠ²ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ ΠΎΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ v16.9.0, Π½ΠΎ ΡΠ°ΠΊΠΆΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΠΎΡ ΡΠ±ΠΎΡΠ½ΠΈΠΊΠ° ΡΠ°ΡΡΠΊΠ°Π·ΠΎΠ².
ΠΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΈΠ· ΡΠ±ΠΎΡΠ½ΠΈΠΊΠ° ΡΠ°ΡΡΠΊΠ°Π·ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ v16.13.1.
ΠΠ΄Π½Π°ΠΊΠΎ, ΠΊΠΎΠ³Π΄Π° Ρ Π·Π°ΠΏΡΡΠΊΠ°Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΡ ΠΏΡΡΠΆΠΈ, Ρ ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΠ΅Π°ΠΊΡΠΈΡ 16.13.1 Π² ΠΌΠΎΠΈΡ ΡΠ·Π»Π°Ρ Π²Π΅ΡΡ Π½Π΅Π³ΠΎ ΡΡΠΎΠ²Π½Ρ node_modules ΠΈ ΡΠ΅Π°ΠΊΡΠΈΡ 16.9.0 Π² Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΡΠ·Π»Π°Ρ _ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ app1 ΠΈ app2.ΠΠΎΠ³Π΄Π° Ρ Π·Π°ΠΏΡΡΠΊΠ°Ρ app1 (ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ CRA), ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ²ΠΎΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΡΠ΅Π°ΠΊΡΠΈΡ v16.9.0, Π½ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΈΠ· Β«Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈΒ» ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ React v16.13.1.
ΠΠ½Π΅ ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ ΠΏΠΎΠ΄ΡΠ΅ΠΌΠ° ΠΏΡΡΠΆΠΈ, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° create-ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΠΈ ΡΠ΅ΠΌ, ΠΈ Π΄ΡΡΠ³ΠΈΠΌ?
ΠΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ Π·Π½Π°Π΅Ρ ΠΎΠ±Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡΡΡ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΡΠ΅Π½Π°ΡΠΈΡ?
ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Ρ Π½Π°ΡΠ΅Π» Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ, ΡΠΎΡΡΠΎΡΠ»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ yarn run eject
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ CRA ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΡΠ°Π·Π΄Π΅Π»Π° resolve
Ρ:
```javascript
ΠΌΠΎΠ΄ΡΠ»ΠΈ: ['node_modules', paths.appNodeModules].concat(
modules.additionalModulePaths || []
),
````
ΠΊ
```javascript
ΠΌΠΎΠ΄ΡΠ»ΠΈ: [paths.appNodeModules, 'node_modules'].concat(
modules.additionalModulePaths || []
),
````
ΠΠ½Π΅ ΠΊΠ°ΠΆΠ΅ΡΡΡ ΡΡΡΠ°Π½Π½ΡΠΌ, ΡΡΠΎ Β«appNodeModulesΒ» Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ Π½Π°ΠΈΠ²ΡΡΡΠ΅Π³ΠΎ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ° β ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΎΡΠ»ΠΎΠΆΠΈΡΡ, ΠΊΠΎΠ³Π΄Π° Π΄Π΅Π»ΠΎ Π΄ΠΎΡ ΠΎΠ΄ΠΈΡ Π΄ΠΎ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ?
Π― ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ Β«Ρ ΡΠΊΠΎΠ²Β» Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ , ΡΠ²ΡΠ·Π°Π½Π½ΡΡ Ρ Webpack ΠΈ Electron. ΠΠΎΠΉ ΠΏΡΠΎΠ΅ΠΊΡ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΌΠΎΠ΄ΡΠ»Ρ A, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°ΠΌ Π²Ρ ΠΎΠ΄ΠΈΡ Π² ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ Webpack (ΠΈ ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΡΠΎΠ·Π΄Π°Π» ΡΠ°ΠΌ). Π― Π²Π½Π΅Π΄ΡΠΈΠ» React ΠΈΠ· A (ΠΎΠ±ΡΡΠ²ΠΈΠ² Π΅Π³ΠΎ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ commonjs2). ΠΡΠΎ ΠΈΡΠΊΠ»ΡΡΠ°Π΅Ρ ΡΠ°ΠΉΠ»Ρ React ΠΈΠ· ΠΏΠ°ΠΊΠ΅ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ.
ΠΠΎΡ ΠΎΡΠ½ΠΎΠ²Π½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΡΠ°Π±ΠΎΡΠ°ΡΡΠ°Ρ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ Electron Renderer, ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ React. Π― ΠΏΠΎΠΏΡΠΎΡΠΈΠ» Webpack Π²ΠΊΠ»ΡΡΠΈΡΡ React Π² ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ (Π±Π΅Π· ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ).
ΠΠ΄Π½Π°ΠΊΠΎ ΡΡΠΎ ΠΏΡΠΈΠ²Π΅Π»ΠΎ ΠΊ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ΅ Β«ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠΈΠΊΠΎΠ²Β» ΠΈΠ·-Π·Π° Π΄Π²ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² React Π² ΡΡΠ΅Π΄Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ.
ΠΡΠΎ Π²ΡΠ·Π²Π°Π½ΠΎ ΡΠ°ΠΊΠΈΠΌΠΈ ΡΠ°ΠΊΡΠ°ΠΌΠΈ:
ΠΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΡΡΠΎΡΠ»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ Π²ΡΠ²Π΅ΡΡΠΈ React ΠΈΠ· ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΈ ΠΎΡΠ½ΠΎΠ²Π½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ A ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΡΠ²ΠΎΠΉ React ΠΎΡ Electron β Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ.
Π― ΠΏΡΠΎΠ±ΠΎΠ²Π°Π» Π»ΡΠ±ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΠΎΠ², Π½ΠΎ ΡΡΠΎ Π½Π΅ ΡΠ΅ΡΠ°Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Webpack, Π³Π΄Π΅ Π½Π°ΠΉΡΠΈ ΠΊΠΎΠ΄ ΠΌΠΎΠ΄ΡΠ»Ρ. ΠΡΠΎ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΡΠ΅ΡΠ°Π΅Ρ Π² ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΡ ΠΊΠ΅ΡΠ΅ΠΉ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ!
ΠΡΠ»ΠΈ Π²Ρ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΠΈΡΡ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ Ρ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ Π²Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠΎΠ²Π°ΡΡ, ΡΠ·Π½Π°ΠΉΡΠ΅, ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈ React ΡΠΊΡΡΠ΅ΡΠ½Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΌ ΠΈ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ. ΠΡΠ»ΠΈ ΡΡΠΎ Π½Π΅ ΡΠΊΡΡΠ΅ΡΠ½Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ, Ρ Π΄ΡΠΌΠ°Ρ, Π²Ρ Π½Π΅ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ΅ΡΠΈΡΡ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ ΠΠ»Π΅ΠΊΡΡΠΎΠ½Π°. ΠΡΠ»ΠΈ ΠΎΠ½ ΠΏΡΠΎΡΡΠΎ ΡΠΊΡΡΠ΅ΡΠ½Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠΉ, ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΠ΅ React Π² ΡΠ²ΠΎΠΉ .html-ΡΠ°ΠΉΠ» ΠΈ ΡΠ΄Π΅Π»Π°ΠΉΡΠ΅ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ Π²Π°ΡΠ° ΠΎΡΠ½ΠΎΠ²Π½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π·Π°Π²ΠΈΡΠ΅Π»Π° ΠΎΡ Π½Π΅Π³ΠΎ.
ΠΡ Π½Π°ΠΊΠΎΠ½Π΅Ρ ΡΠΎ...
//webpack.config.js
module.exports = {
...
externals: {
react: 'react',
},
}
Π£ Vue3 ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°
Π― ΡΠ΅ΡΠΈΠ» ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΏΠΎΡΡΠ°Π²ΠΈΠ² react
ΠΈ react-dom
ΠΊΠ°ΠΊ peerDependencies
Π² ΠΌΠΎΠ΅ΠΌ package.json ΠΌΠΎΠ΅ΠΉ Π²Π½Π΅ΡΠ½Π΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ React.
"peerDependencies": {
"react": "^16.13.1",
"react-dom": "^16.13.1"
},
Π― ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ, ΡΡΠΎ ΠΌΠΎΠ³ ΠΏΡΠΎΠΏΡΡΡΠΈΡΡ ΡΡΠΎ Π³Π΄Π΅-ΡΠΎ Π΅ΡΠ΅ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ, Π½ΠΎ Π΅ΡΠ»ΠΈ Π½Π΅Ρ: ΡΡΠΎ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΠ»ΠΎ Π±Ρ ΠΌΠ½Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, Π΅ΡΠ»ΠΈ Π±Ρ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ (ΠΈΠ»ΠΈ ΠΏΡΠΎΡΡΠΎ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΠΌΠΎΠ΄ΡΠ»Ρ ES) Π±ΡΠ»ΠΎ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΎ/ΡΠΏΠΎΠΌΡΠ½ΡΡΠΎ/ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ Π½ΠΈΠΌ. :) Π’Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅, ΡΡΠΎ ΠΏΡΡΠΌΠ°Ρ Π²Π΅ΡΡΠΈΡ
export default Example
ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π±Π΅Π· Ρ ΡΠΊΠΎΠ².
ΠΡΠΈΠ²Π΅Ρ @espen42 ,
Π― ΠΎΡΠ΅Π½Ρ Π½Π°Π΄Π΅ΡΠ»ΡΡ, ΡΡΠΎ Π²Π°ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ Π½Π°ΠΌ. ΠΡ Π±ΡΠΊΠ²Π°Π»ΡΠ½ΠΎ ΠΏΡΠΎΠ±ΠΎΠ²Π°Π»ΠΈ _Π²ΡΠ΅_, ΠΊΠ°ΠΊ Π²Ρ ΡΠΏΠΎΠΌΡΠ½ΡΠ»ΠΈ.
Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Π²Π°ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠΆΠ΅ Π½Π΅ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ. ΠΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ, ΠΌΠΎΠΆΠ΅Ρ Ρ ΠΏΡΠΎΡΡΠΎ ΡΡΠΎ-ΡΠΎ ΠΏΡΠΎΠΏΡΡΡΠΈΠ»?
ΠΡΠ°ΠΊ, Π² ΠΏΠ°ΠΊΠ΅ΡΠ΅ (Ρ Π½Π°Π·ΠΎΠ²Ρ Π΅Π³ΠΎ @bla/bla) Ρ Π½Π°Ρ Π΅ΡΡΡ index.js
, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π΅ΡΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Ρ Ρ
ΡΠΊΠ°ΠΌΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ
function Bla = ({...props]) => {
const [bla, setBla] = useState(false);
return bla ? <div {...props} /> : 'no luck';
}
ΠΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΠΌ ΠΏΠ°ΠΊΠ΅Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ npx babel
.
ΠΡ ΡΠ²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠΎΡ ΠΏΠ°ΠΊΠ΅Ρ Ρ npm link
, Π° Π·Π°ΡΠ΅ΠΌ Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ Π΅Π³ΠΎ Π² ΠΏΡΠΎΠ΅ΠΊΡ ΠΊΠ°ΠΊ npm link @bla/bla
.
Π ΠΏΠ°ΠΊΠ΅Ρ, ΠΈ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΎΠ΄Π½Ρ ΠΈ ΡΡ ΠΆΠ΅ Π²Π΅ΡΡΠΈΡ React ΠΈ react-dom.
Π ΠΏΡΠΎΠ΅ΠΊΡ Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΡΠ°ΠΊΠΎΠΉ ΠΏΠ°ΠΊΠ΅Ρ:
import Bla from `@bla/bla`
const RenderBla = ({...props}) => <Bla {...props} />
export default RenderBla
Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΠΎΡΠΈΠ±ΠΊΠ° Π²ΡΠ΅ Π΅ΡΠ΅ ΡΠΎΡ
ΡΠ°Π½ΡΠ΅ΡΡΡ.
Invalid hook call. Hooks can only be called inside of the body of a function component.
Π§ΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΏΡΡΡΠΈΡΡ?
"externals": { "react": "react", "react-dom": "react-dom" }
ΠΡΠΎ ΡΠ΅ΡΠΈΠ»ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π΄Π»Ρ ΠΌΠ΅Π½Ρ, Π±ΠΎΠ»ΡΡΠΎΠ΅ ΡΠΏΠ°ΡΠΈΠ±ΠΎ, ΡΡΠ²Π°ΠΊ β€οΈ
ΠΡΠΈΠ±ΠΊΠ° Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΠΎΠ»Ρ ΠΏΡΠΈ Π΄ΠΎΡΡΡΠΏΠ΅ ΠΏΠΎ Π²Π½Π΅ΡΠ½Π΅ΠΉ ΡΡΡΠ»ΠΊΠ΅ (Sharepoint Online)
Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π°ΡΡΡΠΎΠΉΡΠΈΠΊΠ° ΠΏΠΎΠ»Ρ spfx Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Fabric, ΠΏΡΠΈ Π΄ΠΎΡΡΡΠΏΠ΅ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅, ΠΏΠΎΠ»ΡΡΠ°ΡΡΠ΅Π΅ ΠΎΠ΄Π½Ρ ΠΈΠ· ΡΠ»Π΅Π΄ΡΡΡΠΈΡ
ΠΎΡΠΈΠ±ΠΎΠΊ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π²Π΅ΡΡΠΈΠΈ FabricUI:
https://reactjs.org/docs/error-decoder.html/?invariant=321 ,
https://reactjs.org/docs/error-decoder.html/?invariant=290&args []=A.%20ΠΠ±ΡΠΈΠ΅
ΠΏΡΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ ΡΡΡΠ°Π½ΠΈΡΡ Π²ΡΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ.
Π― Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» Π² ΠΊΠΎΠ΄Π΅ Π½ΠΈΠΊΠ°ΠΊΠΈΡ
React Hooks, ΡΠΎΠ»ΡΠΊΠΎ React Components.
Π Π΅ΡΠ°ΠΌΠΈ ΡΠΎΠΆΠ΅ Π½Π΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΡΡ.
Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΠ·-Π·Π° ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Fabric ΡΠ΄Π°Π»ΡΠ΅Ρ Π²ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Fabric, ΠΎΡΠΈΠ±ΠΊΠΈ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ.
ΠΡΠΎΠ±ΠΎΠ²Π°Π»ΠΈ ΡΠ°Π·Π½ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ fabic ui, 6.189.2, 6.214.0 ΠΈ 7.114.1, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΡΠ°Π»ΠΈΡΡ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ Π²ΡΠ΅ ΡΡΡΠ»ΠΊΠΈ Π½Π° Fabric-UI Π½Π° Fluent UI, Π½ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π½Π΅ ΡΡΡΡΠ°Π½Π΅Π½Π°.
ΠΏΡΠΎΠ²Π΅ΡΠΈΠ» Π²Π΅ΡΡΠΈΠΈ ΡΠ΅Π°ΠΊΡΠΈΠΈ, Π²ΠΎΡ Π²ΡΠ²ΠΎΠ΄
Π½ΠΏΠΌ Π»Ρ ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ
+-- @microsoft/sp- webpart [email protected]
| +-- @microsoft/ [email protected]
| | -- [email protected] deduped
| +-- @microsoft/[email protected]
| |
-- ΡΠ΅Π°ΠΊΡΠΈΡ@16.8.5 Π΄Π΅Π΄ΡΠΏΠ»ΠΈΡΠΈΡΠΎΠ²Π°Π½Π°
| +-- @microsoft/sp-property-pane@ 1.9.1
| | -- [email protected] deduped
|
-- [email protected] Π΄Π΅Π΄ΡΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ
`-- ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ@16.8.5
ΠΡΠ΅ΠΌ ΠΏΡΠΈΠ²Π΅Ρ,
Π― ΡΠ°ΠΊΠΆΠ΅ Π½Π°ΡΠΊΠ½ΡΠ»ΡΡ Π½Π° ΡΡΡ Π΄ΠΎΡΠ°Π΄Π½ΡΡ ΠΎΡΠΈΠ±ΠΊΡ. Π ΠΌΠΎΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ ΡΠ°ΠΊΠΆΠ΅ Π±ΡΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΌΠΎΠ΅ΠΉ ΡΠ±ΠΎΡΠΊΠΈ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° Π² ΠΊΠΎΠ½ΡΠ΅. ΠΠΎ Π½ΠΈ ΠΎΠ΄Π½Π° ΠΈΠ· ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΡΡ
Π²Π΅ΡΠ΅ΠΉ Π² ΡΡΠΎΠΌ Π²ΡΠΏΡΡΠΊΠ΅ Π½Π΅ ΡΡΠ°Π±ΠΎΡΠ°Π»Π° Π΄Π»Ρ ΠΌΠ΅Π½Ρ. Π’Π°ΠΊ ΡΡΠΎ ΡΠΎΠΆΠ΅ Ρ
ΠΎΡΡ ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ ΡΠ²ΠΎΠΈΠΌ ΠΎΠΏΡΡΠΎΠΌ.
ΠΠΎΡ ΡΡΡΠ°Π½ΠΈΡΠ° Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΎΡΠ΅ΠΊ Π²Ρ ΠΎΠ΄Π°, Π° ΠΏΠ»Π°Π³ΠΈΠ½ SplitChunkPlugin ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π³Π΅ΠΌ rails-webpacker, ΠΎΠ½ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π½Π°ΡΡΡΠΎΠ΅Π½ Π½Π° ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΡΠ΅Π΄Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ°. ΠΠΎ webpack ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π΅Π»Π°Π΅Ρ ΡΡΠΎ-ΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅, ΠΎΠ½ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ ΡΡΠ΅Π΄Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²Π½ΡΡΡΠΈ ΡΠ°Π½ΠΊΠΎΠ².
ΠΠΎΠ½Π΅ΡΠ½ΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π°Π΅Ρ ΠΎΠ± ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π½ΠΎ Π½Π°Π΄ΠΎ Π½Π°ΠΉΡΠΈ. Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° optimization.runtimeChunk
Π² single
ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΡΡΠ΅Π΄Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. ΠΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π²Π°ΡΠ΅ΠΉ ΡΠ±ΠΎΡΠΊΠΎΠΉ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΠΊΠΎΠΏΠΈΠΉ ΡΠ΅Π°ΠΊΡΠΈΠΈ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ΅Π°ΠΊΡΠΈΠΈ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΡΠΎΡΠ΅ΠΊ Π²Ρ
ΠΎΠ΄Π°.
Π‘ΠΌ. https://webpack.js.org/configuration/optimization/#optimizationruntimechunk .
ΠΡΠ΅ΠΌ ΠΏΡΠΈΠ²Π΅Ρ,
Π£ ΠΌΠ΅Π½Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠΎΠΌ, ΡΡΠΎ Ρ Ρ
ΠΎΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²Π½Π΅ΡΠ½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΡΡΡΠΏΠ°Π΅Ρ ΠΈΠ· CDN ΠΈ Π²ΠΊΠ»ΡΡΠ΅Π½Π° Π² ΡΠ΅Π³ <script>
, ΠΏΠΎΡΡΠΎΠΌΡ Ρ ΠΌΠ°Π»ΠΎ ΡΡΠΎ ΠΌΠΎΠ³Ρ ΡΠ΄Π΅Π»Π°ΡΡ Ρ ΡΠ°ΠΌΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ. Π Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ ΠΈ Ρ
ΡΠΊΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ Ρ ΠΏΠΎΠ»ΡΡΠ°Ρ
ΠΡΠΈΠ±ΠΊΠ° 3. You might have more than one copy of React in the same app
.
Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Π΄Π»Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π½Π΅Ρ ΠΏΠ°ΠΊΠ΅ΡΠ° NPM: https://github.com/Anyline/anyline-ocr-anylinejs-module
Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ CRA, ΠΈ ΠΏΡΠΎΠ΅ΠΊΡ Π½Π΅ Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΡΡΡ.
Π‘ΠΎΠ·Π΄Π°Π» Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ Sandbox .
ΠΠ½ Π²ΡΠ΄Π°Π΅Ρ ΡΡ ΠΆΠ΅ ΠΎΡΠΈΠ±ΠΊΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠ°ΠΊΠ΅Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Ρ ΡΠΊΠΈ, Π½ΠΎ ΡΠΎ ΡΠ²ΠΎΠΈΠΌ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΌ React. ΠΠ½Π΅ ΠΏΡΠΈΡΠ»ΠΎΡΡ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΠΉ ΠΏΠ°ΠΊΠ΅Ρ Π² NPM, Π° Π·Π°ΡΠ΅ΠΌ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π½Π°ΠΏΡΡΠΌΡΡ ΠΈΠ· NPM. ΠΡΠΎ
ΠΠ΅Π΄Π°Π²Π½ΠΎ Ρ ΠΏΡΠΈΡΠ΅Π» ΠΊ ΡΡΠΎΠΌΡ Π²ΠΎΠΏΡΠΎΡΡ ΠΈ ΡΠ΄ΠΈΠ²Π»ΡΡΡΡ, ΠΏΠΎΡΠ΅ΠΌΡ.
Π― ΡΠ΅ΡΠΈΠ» ΡΡΠΎ, Π·Π°Π³ΡΡΠ·ΠΈΠ² Π΅Π³ΠΎ Π² GitLab ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ² ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ.
Π ΡΠ΅ΠΌ ΡΠ°Π·Π½ΠΈΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠ°ΠΊΠ΅ΡΠΎΠΌ ΠΈ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΌ ΠΏΠ°ΠΊΠ΅ΡΠΎΠΌ?
Π― ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ», ΡΡΠΎ ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Β«ΠΠ΅Π²Π΅ΡΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² ΠΎΡΠ±ΠΎΡΒ». ΠΊΠΎΠ³Π΄Π° Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ Π·Π°Π³ΡΡΠΆΠ°Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ·ΡΠ²Π°Π΅Ρ Ρ ΡΠΊ.
ΠΠΎΠ΄ΠΎΠ²Π°Ρ ΠΏΠ΅ΡΠΎΡΠ½ΠΈΡΠ°
Π’Π΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°Π³ΡΡΠΆΠ°Π΅Ρ Β«ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Β», ΠΏΡΠΎΡ
ΠΎΠ΄ΠΈΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ. ΠΠ²Π° ΡΠ΅ΡΡΠ°, ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π°Π³ΡΡΠΆΠ°ΡΡ Π΅Π³ΠΎ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ (ΠΎΠ΄ΠΈΠ½ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ require
, Π΄ΡΡΠ³ΠΎΠΉ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ import
Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ), ΠΎΠ±Π° Π΄Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΡ.
ΠΠΎΡΠ΅ΠΌΡ ΠΌΠ΅Π½Ρ ΡΡΠΎ Π²ΠΎΠΎΠ±ΡΠ΅ Π²ΠΎΠ»Π½ΡΠ΅Ρ: Ρ ΠΏΡΡΠ°ΡΡΡ Π½Π°ΠΏΠΈΡΠ°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΡΠΎΠ², Π² ΠΊΠΎΡΠΎΡΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ jest.doMock Π΄Π»Ρ ΠΈΠΌΠΈΡΠ°ΡΠΈΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ Π²Π΅ΡΠ΅ΠΉ, Π° Π·Π°ΡΠ΅ΠΌ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ Π·Π°Π³ΡΡΠΆΠ°Ρ ΠΌΠΎΠ΄ΡΠ»Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΠΎΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ, Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅ΠΉ . Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ doMock Π²ΠΌΠ΅ΡΡΠΎ Mock, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΌΠ½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΈΠΌΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠΎ-ΡΠ°Π·Π½ΠΎΠΌΡ ΠΈΠ·Π΄Π΅Π²Π°ΡΡΡΡ Π½Π°Π΄ ΡΠ°Π·Π½ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ. ΠΡ Π·Π°ΠΌΠ΅ΡΠΈΡΠ΅, ΡΡΠΎ ΠΎΡΠΈΠ±ΠΊΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ -Π»ΠΈΠ±ΠΎ Π½Π°ΡΠΌΠ΅ΡΠ΅ΠΊ.
ΠΠ½ Π²ΡΠ΄Π°Π΅Ρ ΡΡ ΠΆΠ΅ ΠΎΡΠΈΠ±ΠΊΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠ°ΠΊΠ΅Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Ρ ΡΠΊΠΈ, Π½ΠΎ ΡΠΎ ΡΠ²ΠΎΠΈΠΌ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΌ React. ΠΠ½Π΅ ΠΏΡΠΈΡΠ»ΠΎΡΡ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΠΉ ΠΏΠ°ΠΊΠ΅Ρ Π² NPM, Π° Π·Π°ΡΠ΅ΠΌ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π½Π°ΠΏΡΡΠΌΡΡ ΠΈΠ· NPM. ΠΡΠΎ
ΠΠ΅Π΄Π°Π²Π½ΠΎ Ρ ΠΏΡΠΈΡΠ΅Π» ΠΊ ΡΡΠΎΠΌΡ Π²ΠΎΠΏΡΠΎΡΡ ΠΈ ΡΠ΄ΠΈΠ²Π»ΡΡΡΡ, ΠΏΠΎΡΠ΅ΠΌΡ.
Π― ΡΠ΅ΡΠΈΠ» ΡΡΠΎ, Π·Π°Π³ΡΡΠ·ΠΈΠ² Π΅Π³ΠΎ Π² GitLab ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ² ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ.
Π ΡΠ΅ΠΌ ΡΠ°Π·Π½ΠΈΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠ°ΠΊΠ΅ΡΠΎΠΌ ΠΈ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΌ ΠΏΠ°ΠΊΠ΅ΡΠΎΠΌ?
@catsheue Π±ΡΠ» Π΄Π»Ρ ΡΠ΅Π±Ρ React1 === React2
true
?
Ρ Π½Π΅ ΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π» ΡΠ²ΠΎΠΉ Π² npm, Π½ΠΎ Ρ
ΠΎΡΠ΅Π» Π·Π½Π°ΡΡ, Π² ΡΡΠΎΠΌ Π»ΠΈ ΠΏΡΠΈΡΠΈΠ½Π°
ΠΌΠΎΠΉ ΠΊΠ°ΠΆΠ΅ΡΡΡ React1 === React2 = true
ΠΈ Π½Π΅ Π½Π°ΡΠ΅Π» ΡΠ΅ΡΠ΅Π½ΠΈΡ, ΠΏΠΎΡΠ΅ΠΌΡ ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ, ΠΊΠΎΠ³Π΄Π° Ρ ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΡ ΡΠ²ΠΎΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π² ΠΏΡΠΎΠ΅ΠΊΡ
ΠΡΠ»Π° ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ yarn link
Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ. ΠΠΎΡ ΠΎΡΠΈΠ±ΠΊΠ° Π·Π°ΠΊΠ»ΡΡΠ°Π»Π°ΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Ρ ΡΠΊΠ°Π·ΡΠ²Π°Π» react
ΠΈ react-dom
ΠΊΠ°ΠΊ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ², Π° Π½Π΅ ΠΎΠ΄Π½ΠΎΡΠ°Π½Π³ΠΎΠ²ΡΠ΅.
Π’Π°ΠΊ ΡΡΠΎ Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΠ» ΡΠ΄Π΅Π»Π°ΡΡ yarn add --peer react react-dom
. ΠΠ°ΠΊΠΎΠ½Π΅Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Ρ ΡΠΆΠ΅ ΡΠΎΠ²Π΅ΡΡΠΈΠ» ΠΎΡΠΈΠ±ΠΊΡ, Π·Π°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π² React ΠΊΠ°ΠΊ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ ΠΎΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ², ΠΌΠ½Π΅ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ node_modules ΠΈΠ· ΠΌΠΎΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ. rm -rf node_modules; yarn
ΡΠ΅ΡΠΈΠ» ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π΄Π»Ρ ΠΌΠ΅Π½Ρ.
Π― ΡΠΎΠΆΠ΅ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ. Π ΠΌΠΎΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ Π±ΡΠ»ΠΎ Π²ΡΠ·Π²Π°Π½ΠΎ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ React ΠΈΠ· Storybook (v6.0.28). Π― ΡΡΠΈΡΠ°Ρ, ΡΡΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΠΉΡΠΈ Π±ΠΎΠ»ΡΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π·Π΄Π΅ΡΡ .
Π― ΡΠ΄Π°Π»ΠΈΠ» Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Storybook, ΡΠ΄Π°Π»ΠΈΠ» node_modules
ΠΈ ΡΠ½ΠΎΠ²Π° Π·Π°ΠΏΡΡΡΠΈΠ» yarn install
. ΠΡΠΎ ΡΡΠ°Π±ΠΎΡΠ°Π»ΠΎ Π΄Π»Ρ ΠΌΠ΅Π½Ρ. Π― Π½Π°Π΄Π΅ΡΡΡ, ΡΡΠΎ ΡΡΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ ΠΊΠΎΠΌΡ-ΡΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΡΠ»Π΅Π· ΠΈ ΠΏΠΎΡΡΠ°ΡΠ΅Π½Π½ΡΡ
Π²ΠΏΡΡΡΡΡ ΡΠ°ΡΠΎΠ² Π½Π° ΡΡΠΎ.
ΠΡΠΎΡ ΠΎΠ±Ρ
ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡΡΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΈ Π΄Π»Ρ ΠΌΠ΅Π½Ρ. Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ Firebase ΠΈ ΠΈΠΌΠ΅Ρ ΠΏΠ°ΠΏΠΊΡ node_modules
ΠΊΠ°ΠΊ Π² ΠΊΠΎΡΠ½Π΅ ΠΌΠΎΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°, ΡΠ°ΠΊ ΠΈ Π² ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅ /functions/
. ΠΡΠ»ΠΈ Ρ ΡΠ΄Π°Π»Ρ /functions/node_modules
, ΠΌΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ. ΠΡΠΎ ΠΎΠ±Ρ
ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡΡΡ, Π½ΠΎ ΠΎΠ½ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΠ°Π·Π΄ΡΠ°ΠΆΠ°Π΅Ρ. ΠΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ Π½Π°ΡΠ΅Π» ΠΎΠ±Ρ
ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡΡΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΎΠ±Π΅ΠΈΠΌ ΠΏΠ°ΠΏΠΊΠ°ΠΌ node_modules
?
ΠΠ»Ρ ΠΏΠΎΡΠΎΠΌΠΊΠΎΠ² ΠΈ Π²ΡΠ΅Ρ
, ΠΊΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠΎΠ»ΠΊΠ½ΡΡΡΡΡ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ mdbootstrap Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΡ create-react-app
.
Π― Π²ΠΈΠ΄Π΅Π» ΡΡΡ ΠΎΡΠΈΠ±ΠΊΡ ΠΏΡΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² mdbootstrap, ΡΠ°ΠΊΠΈΡ
ΠΊΠ°ΠΊ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΊΠ°ΡΡ. ΠΡΠ²ΠΎΠ΄ ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡΠΉ Π² index.js Π΄Π»Ρ ΡΡΡΡΠ°Π½Π΅Π½ΠΈΡ Π½Π΅ΠΏΠΎΠ»Π°Π΄ΠΎΠΊ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ ΡΠΎ ΡΡΠ°ΡΡΠ΅ΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ React, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π» true
ΠΏΡΠΈ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΈ Π²Π΅ΡΡΠΈΠΉ. ΠΠΎΡΡΠΎΠΌΡ ΠΌΠ½Π΅ ΠΏΡΠΈΡΠ»ΠΎΡΡ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΡΡΠΎ-ΡΠΎ Π΅ΡΠ΅.
ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΎΡΡΠΎΡΠ»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ Π·Π°ΠΏΡΡΡΠΈΡΡ npm dedupe
npm ls react
+-- [email protected]
| `-- [email protected]
`-- [email protected]
npm dedupe
npm ls react
+-- [email protected]
| `-- [email protected] deduped
`-- [email protected]
ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π²ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π·Π°ΡΠ°Π±ΠΎΡΠ°Π»ΠΈ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ. Π‘ΡΠ°ΡΡΠ»ΠΈΠ²ΡΠ΅ Π΄Π½ΠΈ.
Π― ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ», ΡΡΠΎ ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Β«ΠΠ΅Π²Π΅ΡΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² ΠΎΡΠ±ΠΎΡΒ». ΠΊΠΎΠ³Π΄Π° Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ Π·Π°Π³ΡΡΠΆΠ°Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ·ΡΠ²Π°Π΅Ρ Ρ ΡΠΊ.
ΠΠΎΠ΄ΠΎΠ²Π°Ρ ΠΏΠ΅ΡΠΎΡΠ½ΠΈΡΠ°
Π’Π΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°Π³ΡΡΠΆΠ°Π΅Ρ Β«ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Β», ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ. ΠΠ²Π° ΡΠ΅ΡΡΠ°, ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π°Π³ΡΡΠΆΠ°ΡΡ Π΅Π³ΠΎ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ (ΠΎΠ΄ΠΈΠ½ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ
require
, Π΄ΡΡΠ³ΠΎΠΉ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌimport
Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ), ΠΎΠ±Π° Π΄Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΡ.ΠΠΎΡΠ΅ΠΌΡ ΠΌΠ΅Π½Ρ ΡΡΠΎ Π²ΠΎΠΎΠ±ΡΠ΅ Π²ΠΎΠ»Π½ΡΠ΅Ρ: Ρ ΠΏΡΡΠ°ΡΡΡ Π½Π°ΠΏΠΈΡΠ°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΡΠΎΠ², Π² ΠΊΠΎΡΠΎΡΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ jest.doMock Π΄Π»Ρ ΠΈΠΌΠΈΡΠ°ΡΠΈΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ Π²Π΅ΡΠ΅ΠΉ, Π° Π·Π°ΡΠ΅ΠΌ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ Π·Π°Π³ΡΡΠΆΠ°Ρ ΠΌΠΎΠ΄ΡΠ»Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΠΎΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ, Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅ΠΉ . Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ doMock Π²ΠΌΠ΅ΡΡΠΎ Mock, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΌΠ½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΈΠΌΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠΎ-ΡΠ°Π·Π½ΠΎΠΌΡ ΠΈΠ·Π΄Π΅Π²Π°ΡΡΡΡ Π½Π°Π΄ ΡΠ°Π·Π½ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ. ΠΡ Π·Π°ΠΌΠ΅ΡΠΈΡΠ΅, ΡΡΠΎ ΠΎΡΠΈΠ±ΠΊΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ -Π»ΠΈΠ±ΠΎ Π½Π°ΡΠΌΠ΅ΡΠ΅ΠΊ.
@ miket01 miket01 ΠΠΌΠ΅Π½Π½ΠΎ ΡΠΎ, ΡΡΠΎ Ρ ΠΏΡΡΠ°ΡΡΡ ΡΠ΄Π΅Π»Π°ΡΡ (Π½ΠΎ Π±Π΅Π· Π½Π°ΡΠΌΠ΅ΡΠ΅ΠΊ). ΠΡ Π½Π°ΡΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠ΅-Π½ΠΈΠ±ΡΠ΄Ρ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅?
Π‘ΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ Ρ ΡΡΠΈΠΌ:
function HeadedSection (props) {
if (!ReactDOMServer.renderToStaticMarkup(props.children))
return null;
const [hidden, set_hidden] = useState(props.hidden);
ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΎ ΠΏΡΡΠ΅ΠΌ Π²ΡΠ·ΠΎΠ²Π° useState
ΡΠ½Π°ΡΠ°Π»Π°:
function HeadedSection (props) {
const [hidden, set_hidden] = useState(props.hidden);
if (!ReactDOMServer.renderToStaticMarkup(props.children))
return null;
Π― Π²ΡΠ΅ Π΅ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΡΡ ΠΎΡΠΈΠ±ΠΊΡ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΡΠ»ΠΎΠΆΠΈΠ» Π΅Π΅ Π² ΡΡΠΎΡΠΎΠ½Ρ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΡΠ΅Π².
Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π½ΡΠ»Π΅Π²ΡΠ΅ Ρ
ΡΠΊΠΈ Π² ΡΠ²ΠΎΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅. Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠΎΠ²Π½ΠΎ ΠΎΠ΄Π½Π° ΠΊΠΎΠΏΠΈΡ react
ΠΈ ΠΎΠ΄Π½Π° ΠΊΠΎΠΏΠΈΡ react-dom
, ΠΈ ΡΡΠΎ ΠΎΠ΄Π½Π° ΠΈ ΡΠ° ΠΆΠ΅ Π²Π΅ΡΡΠΈΡ. ΠΠ΅Ρ ΡΡΡΠ»ΠΎΠΊ.
ΠΡΠΎ ΡΠ°ΡΡΠΈΡΠ½ΠΎ ΡΡΠ°Π±ΠΎΡΠ°Π»ΠΎ Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ Π½Π΅Π΄Π°Π²Π½ΠΎ ΠΏΠΎΠΏΡΡΠ°Π»ΡΡ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ², ΡΡΠΎΠ±Ρ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡΡ. Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ next.js, ΠΈ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π·Π°ΠΊΠ»ΡΡΠ°Π»ΠΎΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΈΡΠΊΠ»ΡΡΠΈΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ΄ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΈΠ· ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Π²Π΅ΡΡ
Π½Π΅Π³ΠΎ ΡΡΠΎΠ²Π½Ρ, ΠΎΠ±Π΅ΡΠ½ΡΠ² ΠΈΡ
Π² {typeof window !== 'undefined'
, Π½ΠΎ ΡΠ΅ΠΏΠ΅ΡΡ ΡΡΠΎ ΡΠΎΠΆΠ΅ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
[18:50:42] (master) questions
// β₯ npm ls react
[email protected] /Users/Dan/work/b/questions
βββ [email protected]
[22:46:34] (master) questions
// β₯ npm ls react-dom
[email protected] /Users/Dan/work/b/questions
βββ [email protected]
[22:46:55] (master) questions
// β₯ npm dedupe
removed 55 packages, moved 46 packages and audited 1712 packages in 65.449s
33 packages are looking for funding
run `npm fund` for details
found 26 vulnerabilities (15 low, 3 moderate, 8 high)
run `npm audit fix` to fix them, or `npm audit` for details
ΠΡΠΈΠ±ΠΊΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ReactCurrentDispatcher.current === null
, Π½ΠΎ Ρ Π½Π΅ ΠΌΠΎΠ³Ρ Π½Π°ΠΉΡΠΈ Π½ΠΈΠ³Π΄Π΅ Π² /node_modules/react/cjs/react.development.js
, Π³Π΄Π΅ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ ΡΡΠΎ-ΡΠΎ.
ΠΠΎΠΆΠ΅Ρ Π»ΠΈ ΠΊΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ ΡΠΊΠ°Π·Π°ΡΡ ΠΌΠ½Π΅, Π³Π΄Π΅ ReactCurrentDispatcher.current
Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅?
https://github.com/facebook/react/search?p=2&q=%22ReactCurrentDispatcher.current+%3D%22&type=code
ΠΡΠΎ ΠΏΠΎΡ
ΠΎΠΆΠ΅ Π½Π° ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠ°, Π½ΠΎ ΡΡΠΎΡ ΠΊΠΎΠ΄ Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡΡΡ Π² ΠΌΠΎΠ΅ΠΌ react-development.js
. ΠΠΎΠ»ΠΆΠ½ΠΎ Π»ΠΈ ΡΡΠΎ Π±ΡΡΡ?
const prevPartialRenderer = currentPartialRenderer;
setCurrentPartialRenderer(this);
const prevDispatcher = ReactCurrentDispatcher.current;
ReactCurrentDispatcher.current = Dispatcher;
Π― ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΡΡ ΠΎΡΠΈΠ±ΠΊΡ ΠΏΡΠΈ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π΅ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΡΠ΅ΡΠ²Π΅ΡΠ° Π½Π° next.js
, ΠΈ ΡΡΠΎΡ ΠΊΠΎΠ΄ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π² ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΠΏΠΎΠ΄ react-dom/server
. ΠΠ°ΠΊ Ρ ΠΌΠΎΠ³Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π»ΠΈ /node_modules/react/cjs/react-development.js
?
ΠΠΠΠΠΠΠΠΠΠ: ΠΡΠΎ Π±ΡΠ»Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°. Π― ΠΎΡΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π» webpack.config.externals
Π² ΡΠ²ΠΎΠ΅ΠΌ ΡΠ°ΠΉΠ»Π΅ next.config.js
https://github.com/vercel/next.js/issues/17592#issuecomment-712443172
ΠΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΡΠ΄Π°Π΅Ρ ΠΌΠ°ΡΡΠΎΠ²ΡΡ ΠΎΡΠΈΠ±ΠΊΡ (Π½Π΅Π²Π΅ΡΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² Π»ΠΎΠ²ΡΡΠΊΠΈ) ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° Ρ ΠΏΡΡΠ°ΡΡΡ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°ΡΡ Π² Π½Π΅Π³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π°. Π― ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ Π½ΠΎΠ²ΠΈΡΠΎΠΊ Π² React, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΠ½Π΅ Π½ΡΠΆΠ½Π° ΠΏΠΎΠΌΠΎΡΡ.
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
Π£ ΠΌΠ΅Π½Ρ Π±ΡΠ»Π° ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΈ Ρ ΡΠ΅ΡΠΈΠ» Π΅Π΅, Π΄ΠΎΠ±Π°Π²ΠΈΠ²:
to ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ
resolve
Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π²Π΅Π±-ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΌΠΎΠ΅Π³ΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ Π±ΡΠ»Π° ΠΌΠΎΡ ΠΎΡΠΈΠ±ΠΊΠ°, ΠΊΠΎΠ³Π΄Π° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» Π΄Π²Π΅ ΠΊΠΎΠΏΠΈΠΈ React, Π½ΠΎ Ρ ΡΠΎΠ³Π»Π°ΡΠ΅Π½, ΡΡΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π·Π΄ΠΎΡΠΎΠ²ΠΎ, Π΅ΡΠ»ΠΈ Π±Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ Π±ΡΠ»ΠΎ Π»ΡΡΡΠ΅. Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΡ ΠΎΠΆΠ΅ Π½Π°: https://github.com/facebook/react/issues/2402