Feliz: React ๊ตฌ์„ฑ ์š”์†Œ ์ด๋ฆ„ ๋ณ€๊ฒฝ ํ›„ ์˜ค๋ฅ˜: ์žกํžˆ์ง€ ์•Š์€ ์˜ค๋ฅ˜: ์š”์†Œ ์œ ํ˜•์ด ์ž˜๋ชป๋จ: ๋ฌธ์ž์—ด์ด ํ•„์š”ํ•จ

์— ๋งŒ๋“  2021๋…„ 03์›” 16์ผ  ยท  13์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: Zaid-Ajaj/Feliz

Feliz ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ npm start ๋กœ ์‹คํ–‰ํ•œ ๋‹ค์Œ App.fs ์— ์žˆ๋Š” HelloWorld React Component์˜ ์ด๋ฆ„์„ HelloWorlds ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ฒฐ๊ณผ์ ์œผ๋กœ Fable์€ ๊ฒฝ๊ณ  ์—†์ด ์ž˜ ์ปดํŒŒ์ผ๋˜์ง€๋งŒ React๋Š” ๋Ÿฐํƒ€์ž„์— ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค(์•„๋ฌด๊ฒƒ๋„ ๋ Œ๋”๋ง๋˜์ง€ ์•Š์Œ).

Uncaught Error: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined. You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.
    at createFiberFromTypeAndProps (react-dom.development.js?61bb:25058)
    at createFiberFromElement (react-dom.development.js?61bb:25086)
    at reconcileSingleElement (react-dom.development.js?61bb:14052)
    at reconcileChildFibers (react-dom.development.js?61bb:14112)
    at reconcileChildren (react-dom.development.js?61bb:16997)
    at updateHostRoot (react-dom.development.js?61bb:17599)
    at beginWork (react-dom.development.js?61bb:19077)
    at HTMLUnknownElement.callCallback (react-dom.development.js?61bb:3945)
    at Object.invokeGuardedCallbackDev (react-dom.development.js?61bb:3994)
    at invokeGuardedCallback (react-dom.development.js?61bb:4056)

์ผ์ข…์˜ ์บ์‹ฑ ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์šฐํ™” ์ž์ฒด์— ์žˆ๋Š”์ง€ ๋˜๋Š” feliz ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. .fable ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ง€์šด ํ›„ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  13 ๋Œ“๊ธ€

์•ˆ๋…•ํ•˜์„ธ์š” @theimowski ์ €๋„ ์ตœ๊ทผ์— ์ด ๋ฌธ์ œ๋ฅผ ์ ‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์กฐ์‚ฌํ•ด์•ผ ํ•˜์ง€๋งŒ @alfonsogarciacaro ๊ฐ€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋” ๋งŽ์ด ์•Œ๊ณ  ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ตœ์‹  Fable v3.1.10์„ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๊นŒ? ํ…œํ”Œ๋ฆฟ์€ 3.1.5์— ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐํ™”๋ฌธ์ œ์ธ๋“ฏ

3.1.11๋กœ ์‹œ๋„ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ์•„๋งˆ๋„ https://github.com/fable-compiler/Fable/issues/2413 ๊ณผ ๊ด€๋ จ์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

v3.1.11์—์„œ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ ๊ฒƒ์œผ๋กœ ํ™•์ธ๋˜์—ˆ์œผ๋ฏ€๋กœ @theimowski ๋„ ์‹œ๋„ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฌ์ „ํžˆ Fable 3.1.11์—์„œ ์˜ˆ์ƒํ•œ ๋Œ€๋กœ ์™„์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ์กฐ๊ธˆ ๋” ์กฐ์‚ฌํ•˜๋ ค๊ณ :

  1. HelloWorld ๋ณ€๊ฒฝ -> HelloWorlds ํ•˜์ง€๋งŒ App.fs ์—์„œ๋งŒ ๋ณ€๊ฒฝ:
Compiling src/App.fsproj...
F# compilation finished in 17ms

Fable compilation finished in 31ms
/Users/theimowski/sandbox/feliz/rename/src/Main.fs(9,1): (12,2) error FSHARP: A unique overload for method 'render' could not be determined based on type information prior to this program point. A type annotation may be needed.

Known types of arguments: 'a * Browser.Types.HTMLElement

Candidates:
 - static member ReactDOM.render : element:(unit -> Fable.React.ReactElement) * container:Browser.Types.HTMLElement -> 'a0
 - static member ReactDOM.render : element:Fable.React.ReactElement * container:Browser.Types.HTMLElement -> 'a (code 41)
/Users/theimowski/sandbox/feliz/rename/src/Main.fs(10,9): (10,19) error FSHARP: The value, constructor, namespace or type 'HelloWorld' is not defined. Maybe you want one of the following:
   HelloWorlds (code 39)
Watching src
โ„น ๏ฝขwdm๏ฝฃ: Compiling...
โš  ๏ฝขwdm๏ฝฃ: assets by status 3.64 MiB [cached] 1 asset
assets by path *.js 71.9 KiB
  asset app.js 66.3 KiB [emitted] (name: app)
  asset app.cf083007398aca78c7c4.hot-update.js 5.54 KiB [emitted] [immutable] [hmr] (name: app)
asset app.cf083007398aca78c7c4.hot-update.json 27 bytes [emitted] [immutable] [hmr]
Entrypoint app 3.71 MiB = vendors.js 3.64 MiB app.js 66.3 KiB app.cf083007398aca78c7c4.hot-update.js 5.54 KiB
cached modules 1.38 MiB [cached] 74 modules
runtime modules 29.3 KiB 13 modules
./src/App.fs.js 2.75 KiB [built] [code generated]

WARNING in ./src/Main.fs.js 8:35-45
export 'HelloWorld' (imported as 'HelloWorld') was not found in './App.fs.js' (possible exports: HelloWorlds)

webpack 5.14.0 compiled with 1 warning in 139 ms
โ„น ๏ฝขwdm๏ฝฃ: Compiled with warnings.

FSHARP ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์ง€๋งŒ webpack์€ ์˜ค๋ฅ˜๋ฅผ ์ปดํŒŒ์ผํ•˜๊ณ  ๊ฒฝ๊ณ ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  WDS๋Š” ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ ๊ณ ์นจํ•˜๊ณ  ํ™”๋ฉด์— ๋ Œ๋”๋ง๋œ ์ฃผ์ œ์—์„œ React ์˜ค๋ฅ˜๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. HelloWorld ๋ณ€๊ฒฝ -> HelloWorlds in Main.fs : ์ปดํŒŒ์ผ์€ ์„ฑ๊ณตํ–ˆ์ง€๋งŒ React๋Š” ์‹คํŒจํ•˜๊ณ  ์˜ค๋ฅ˜๋Š” ๊ฐœ๋ฐœ ์ฝ˜์†”์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

  2. ํŽ˜์ด์ง€ ์ƒˆ๋กœ ๊ณ ์นจ - ๋‚˜์ค‘์— ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ผ์ข…์˜ ๊ฒฝ์Ÿ ์กฐ๊ฑด ๋ฌธ์ œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Feliz ํ…œํ”Œ๋ฆฟ์—์„œ ๋‘ ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ๋™์‹œ์— ๋ฐ”๊พธ๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ์•ฝ๊ฐ„ ๋” ํฐ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ด๋ฆ„์„ ๋ฐ”๊ฟ€ ๋•Œ ๋กœ๊ทธ์—์„œ ๋‹ค์Œ ๋™์ž‘์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ฐธ๊ณ  ์ค‘๊ฐ„์— ๊ฒฝ๊ณ ):

Compiling src/Client/Client.fsproj...
F# compilation finished in 67ms
Compiled src/Client/App.fsโ„น ๏ฝขwdm๏ฝฃ: Compiling...
โš  ๏ฝขwdm๏ฝฃ: Hash: 615d2643d48416b2ff41
Version: webpack 4.43.0
Time: 456ms
Built at: 03/17/2021 9:30:04 PM
                                 Asset       Size  Chunks                               Chunk Names
app.e781f5f7185376d5a0d3.hot-update.js    9.4 KiB     app  [emitted] [immutable] [hmr]  app
                                app.js   4.69 MiB     app  [emitted]                    app
  e781f5f7185376d5a0d3.hot-update.json   45 bytes          [emitted] [immutable] [hmr]
                            index.html  670 bytes          [emitted]
 + 1 hidden asset
Entrypoint app = vendors~app.js app.js app.e781f5f7185376d5a0d3.hot-update.js
[./src/Client/App.fs.js] 1.32 KiB {app} [built]
    + 382 hidden modules

WARNING in ./src/Client/App.fs.js 28:21-32
"export 'HelloWorlds' was not found in './Index.fs.js'
Child html-webpack-plugin for "index.html":
     1 asset
    Entrypoint undefined = index.html
       4 modules
โ„น ๏ฝขwdm๏ฝฃ: Compiled with warnings.

Fable compilation finished in 1635ms
Compiled src/Client/Index.fsWatching src
โ„น ๏ฝขwdm๏ฝฃ: Compiling...
โ„น ๏ฝขwdm๏ฝฃ: Hash: 837f9683f0ac04dcc729
Version: webpack 4.43.0
Time: 820ms
Built at: 03/17/2021 9:30:06 PM
                                 Asset       Size  Chunks                               Chunk Names
  615d2643d48416b2ff41.hot-update.json   45 bytes          [emitted] [immutable] [hmr]
app.615d2643d48416b2ff41.hot-update.js    141 KiB     app  [emitted] [immutable] [hmr]  app
                                app.js   4.69 MiB     app  [emitted]                    app
                            index.html  670 bytes          [emitted]
 + 1 hidden asset
Entrypoint app = vendors~app.js app.js app.615d2643d48416b2ff41.hot-update.js
[./src/Client/Index.fs.js] 29.5 KiB {app} [built]
    + 382 hidden modules
Child html-webpack-plugin for "index.html":
     1 asset
    Entrypoint undefined = index.html
       4 modules
โ„น ๏ฝขwdm๏ฝฃ: Compiled successfully.

@theimowski ์ €๋Š” ์ด๊ฒƒ์ด ์ง„์ž…์  ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•  ๋•Œ ์ „์ฒด ํŽ˜์ด์ง€ ์ƒˆ๋กœ ๊ณ ์นจ์„ ํŠธ๋ฆฌ๊ฑฐํ•ด์•ผ ํ•˜๋Š” ๋น ๋ฅธ ์ƒˆ๋กœ ๊ณ ์นจ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๊ฒฝ์šฐ ์‹ค์ œ๋กœ ์ด๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์–ธ์  ๊ฐ€ ์ด๋ก ์„ ํ™•์ธํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐธ์กฐ๋œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ง„์ž…์  ํŒŒ์ผ์— ์—†์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ App.fs -> Middle.fs -> Main.fs(์ง„์ž…์ )๊ฐ€ ์žˆ๊ณ  App.fs ๋˜๋Š” Middle.fs๋งŒ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ

๋‹น์‹ ๋„ ์ด๊ฒƒ์„ ์‹œ๋„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@theimowski ๋‚˜๋Š” react-refresh#330 ์— ๋ฌธ์ œ๋ฅผ ๊ต์ฐจ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.

์ตœ์‹  ์›นํŒฉ์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐ˜์‘ ์ƒˆ๋กœ ๊ณ ์นจ์ด ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ๋•Œ๊นŒ์ง€ ์›นํŒฉ v4๋กœ ๋กค๋ฐฑํ•˜๊ณ  v3.6์—์„œ ์ž‘๋™ํ•˜๋Š” Feliz ํ…œํ”Œ๋ฆฟ(์ด์ œ ๋” ๋งŽ์€ ์˜ˆ์ œ ๊ตฌ์„ฑ ์š”์†Œ ํฌํ•จ)์„ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ, ์‹ค์ œ๋กœ ์ƒˆ๋กœ์šด feliz ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ƒˆ๋กœ ๊ณ ์นจ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
F# ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ์›นํŒฉ ์ƒˆ๋กœ ๊ณ ์นจ์— ์‹คํŒจํ–ˆ๋‹ค๋ฉด ๋” ์ข‹์ง€ ์•Š์•˜์„๊นŒ? ์•„๋‹ˆ๋ฉด ๋‹ฌ์„ฑํ•˜๊ธฐ ์–ด๋ ค์šด ์ผ์ž…๋‹ˆ๊นŒ?
Fable 2.* ๋ฐ webpack dev ์„œ๋ฒ„๋กœ ๋Œ์•„๊ฐ€์„œ F# ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ƒˆ๋กœ ๊ณ ์นจ์ด ํŠธ๋ฆฌ๊ฑฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

F# ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ์›นํŒฉ ์ƒˆ๋กœ ๊ณ ์นจ์— ์‹คํŒจํ–ˆ๋‹ค๋ฉด ๋” ์ข‹์ง€ ์•Š์•˜์„๊นŒ? ์•„๋‹ˆ๋ฉด ๋‹ฌ์„ฑํ•˜๊ธฐ ์–ด๋ ค์šด ์ผ์ž…๋‹ˆ๊นŒ?

๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค: ์•„๋งˆ๋„ _์˜๋„์ ์œผ๋กœ_ ์›นํŒฉ์ด ํ•˜๋Š” ์ผ์„ ๊นจ๋œจ๋ฆฌ๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ๊ตฌ๋ฌธ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” JS ์ฝ”๋“œ๋ฅผ ๋‚ด๋ณด๋‚ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ƒํ™ฉ์€ ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์›นํŒฉ์ด ๊ฒฝ๊ณ ๋ฅผ ๋‚ด๋ณด๋‚ด๊ณ  ์žˆ์„ ๋•Œ Fable์ด ์˜ค๋ฅ˜๋ฅผ ๋‚ด๋ณด๋‚ด๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋” ๋†’๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Fable(์ปดํŒŒ์ผ) ์˜ค๋ฅ˜๊ฐ€ ์ˆ˜์ •๋˜๋ฉด ์›นํŒฉ ๊ฒฝ๊ณ ๋„ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด ๊ฐœ์ธ์ ์ธ ์ทจํ–ฅ์€ ์‹คํŒจํ•œ ๋‹จ๊ณ„๋กœ ์ธํ•ด ๋‹ค์Œ ๋‹จ๊ณ„๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ƒˆ๋กœ๊ณ ์นจ๋˜๋Š” ๋‚ด์šฉ์„ ๋ณผ ์ˆ˜ ์žˆ๊ณ  F# ์ฝ”๋“œ๊ฐ€ ์‹ค์ œ๋กœ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š๋Š” ๋™์•ˆ ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์ด๋ผ๊ณ  ์†์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ react-refresh๋Š” ํ„ฐ๋ฏธ๋„์— ์›นํŒฉ ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋˜๋”๋ผ๋„ ๋ธŒ๋ผ์šฐ์ €์— ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ๋นจ๊ฐ„์ƒ‰ ์˜ค๋ฅ˜ ํŽ˜์ด์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.
์œ ์ผํ•œ ๋ฌธ์ œ๋Š” https://github.com/pmmmwh/react-refresh-webpack-plugin/issues/330 ์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰

๊ด€๋ จ ๋ฌธ์ œ

Zaid-Ajaj picture Zaid-Ajaj  ยท  8์ฝ”๋ฉ˜ํŠธ

cmeeren picture cmeeren  ยท  13์ฝ”๋ฉ˜ํŠธ

cmeeren picture cmeeren  ยท  13์ฝ”๋ฉ˜ํŠธ

Dzoukr picture Dzoukr  ยท  9์ฝ”๋ฉ˜ํŠธ

cmeeren picture cmeeren  ยท  6์ฝ”๋ฉ˜ํŠธ