Ember.js: 3.22μ—μ„œ "더 곡격적인" μ£Όμž₯ 역좔적

에 λ§Œλ“  2020λ…„ 10μ›” 12일  Β·  47μ½”λ©˜νŠΈ  Β·  좜처: emberjs/ember.js

🐞 버그 μ„€λͺ…

autotracking.mutation-after-consumption μ‚¬μš© 쀑단은 κ²½κ³  λŒ€μ‹  앱을 μ€‘λ‹¨μ‹œν‚€λŠ” 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€.

πŸ”¬ μ΅œμ†Œν•œμ˜ 볡제

https://ember-twiddle.com/c677ed60d39938c97ea7438d177c0ef3?openFiles=controllers.application%5C.js%2C

였λ₯˜λ₯Ό 보렀면 μ½˜μ†”μ„ μ—΄μ–΄μ•Ό ν•©λ‹ˆλ‹€.

πŸ˜• μ‹€μ œ 행동

지원 쀑단은 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€.

πŸ€” μ˜ˆμƒλ˜λŠ” 행동

지원 쀑단은 κ²½κ³ μž…λ‹ˆλ‹€.

🌍 ν™˜κ²½

  • 엠버: 3.22.0
  • Node.js/npm: -
  • 운영 체제: -
  • λΈŒλΌμš°μ €: -
Needs Reproduction

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

μ—¬κΈ°μ—μ„œ λΉ λ₯Έ μ—…λ°μ΄νŠΈ, 3.23.1이 μˆ˜μ • 사항과 ν•¨κ»˜ λ¦΄λ¦¬μŠ€λ©λ‹ˆλ‹€. λ‚˜λŠ” 내일 3.22.xλ₯Ό μ™„μ„±ν•˜λ €κ³  λ…Έλ ₯ν•  κ²ƒμž…λ‹ˆλ‹€(체리 λ”°κΈ° λ¬Έμ œμ— λΆ€λ”ͺμ³€μŠ΅λ‹ˆλ‹€).

λͺ¨λ“  47 λŒ“κΈ€

흠, λ‚˜λŠ” 당신이 μ—¬κΈ°μ„œ μ˜λ―Έν•˜λŠ” λ°”λ₯Ό μ™„μ „νžˆ μ΄ν•΄ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€. λ˜μ Έμ§„ 였λ₯˜λŠ” μ£Όμž₯(지원 쀑단이 μ•„λ‹˜)이며 ν•΄κ²°ν•˜κΈ° μœ„ν•œ 것이 μ•„λ‹™λ‹ˆλ‹€...

μ§€κΈˆμ€ λ‹«μœΌλ €κ³  ν•˜λŠ”λ° μ—¬κΈ°μ—μ„œ λ­”κ°€ 잘λͺ» μ΄ν•΄ν•œ 뢀뢄이 있으면 λ‹€μ‹œ μ—΄κ²Œ λ˜μ–΄ κΈ°μ©λ‹ˆλ‹€...

https://github.com/emberjs/ember.js/blob/c5bbf863af7cd8f6f92a97f2b777ff857bf9a9f4/packages/%40ember/-internals/glimmer/lib/environment.ts#L65

이것은 μ‹€ν–‰λ˜μ–΄μ•Ό ν•˜λŠ” μ‚¬μš© μ€‘λ‹¨μœΌλ‘œ κ°„μ£Όλ˜μ§€λ§Œ κ²½κ³ λ₯Ό ν‘œμ‹œν•˜λŠ” λŒ€μ‹  μ–΄μ„€μ…˜μ΄ 였λ₯˜λ₯Ό μΌμœΌν‚€λŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ? 였λ₯˜λ‘œ 인해 앱을 λ¦¬νŒ©ν„°λ§ν•˜λΌλŠ” κ²½κ³ λ₯Ό ν‘œμ‹œν•˜λŠ” λŒ€μ‹  앱이 μ€‘λ‹¨λ©λ‹ˆλ‹€.

λ§ν¬ν•œ 지점은 Emberκ°€ λ Œλ”λ§ 엔진을 κ΅¬μ„±ν•˜λŠ” 곳으둜 μ–΄μ„€μ…˜ 및 μ‚¬μš© 쀑단 λͺ¨λ‘μ— λŒ€ν•œ 후크λ₯Ό μ œκ³΅ν•˜λ©° λ Œλ”λ§ 엔진은 μ‹œλ‚˜λ¦¬μ˜€μ— 따라 μ‚¬μš©ν•  것을 μ„ νƒν•©λ‹ˆλ‹€.

μ΄λŸ¬ν•œ κ΅¬μ„±λœ μ˜΅μ…˜μ€ glimmer-vmμ—μ„œ λ‹€μŒ 쀑 ν•˜λ‚˜λ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.


이 νŠΉμ • 사둀가 μ£Όμž₯이 μ•„λ‹ˆλΌ μ‚¬μš© μ€‘λ‹¨λ˜μ–΄μ•Ό ν•˜λŠ” 이유λ₯Ό 더 μžμ„Ένžˆ μ„€λͺ…ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? twiddleμ—μ„œ μˆ˜ν–‰λ˜λŠ” νŠΉμ • μž‘μ—…μ€ 항상 λ°©μ§€ν•˜κΈ° μœ„ν•œ κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€(였λ₯˜ λ©”μ‹œμ§€κ°€ μ„€λͺ…ν•˜λŠ” λŒ€λ‘œ).

export default class ApplicationController extends Controller {
  <strong i="18">@tracked</strong> appName = 'Ember Twiddle';

  get name() {
    this.appName = "Test"

    if (this.appName === "Test") {
      this.appName = "test"
    }

    return this.appName
  }
}

특히 이 경우 μΆ”μ λœ κ°’ 을 읽은

@rwjblue μ—¬κΈ°μ„œ λ¬Έμ œλŠ” Ember의 λΆ€ 릴리슀둜 인해 이전에 λ¬΄μ˜μ‹μ μœΌλ‘œ 이 μ£Όμž₯을 μœ„λ°˜ν–ˆλ˜ 앱이 이제 역좔적 μ—…λ°μ΄νŠΈκ°€ 해결될 λ•ŒκΉŒμ§€ μ—…κ·Έλ ˆμ΄λ“œκ°€ μ°¨λ‹¨λœλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 제 κ²½μš°μ—λŠ” μ‚¬μš©ν•˜λŠ” μ• λ“œμ˜¨μ΄ 이 μ–΄μ„€μ…˜μ„ μœ„λ°˜ν•˜κΈ° λ•Œλ¬Έμ— μœ μ§€ κ΄€λ¦¬ν•˜λŠ” 앱이 3.22둜 μ—…κ·Έλ ˆμ΄λ“œλ˜μ§€ μ•Šλ„λ‘ μ°¨λ‹¨λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ 역좔적 μ–΄μ„€μ…˜μ΄ 였λ₯˜ λŒ€μ‹  경고둜 λ„μž…λœ 경우 μ΄λŸ¬ν•œ 문제λ₯Ό 좔적할 μ‹œκ°„μ΄ 주어지기 λ•Œλ¬Έμ— λ‚˜μ™€ 같은 앱이 μ΅œμ‹  μƒνƒœλ₯Ό μœ μ§€ν•˜λŠ” 더 μ‰¬μš΄ 경둜λ₯Ό μ œκ³΅ν•  κ²ƒμž…λ‹ˆλ‹€. ν˜„μž¬ μƒνƒœμ—μ„œ λ‚΄ 앱은 이 μƒˆλ‘œμš΄ μ£Όμž₯을 μœ„λ°˜ν•˜λŠ” μœ„μΉ˜/이유λ₯Ό 좔적할 λŒ€μ—­ν­μ΄ 확보될 λ•ŒκΉŒμ§€ 3.21을 μœ μ§€ν•΄μ•Ό ν•©λ‹ˆλ‹€.

λ‚΄κ°€ 버그라고 μƒκ°ν•˜λŠ” μ΄μœ λŠ” ember-gesturesκ°€ Ember 3.22μ—μ„œ μž‘λ™μ„ λ©ˆμ·„κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.
그듀은 뢄해에 이 κΈ°λŠ₯을 μ‚¬μš©ν•˜κ³  있으며 이전 λ²„μ „μ—μ„œ μž‘λ™ν–ˆμŠ΅λ‹ˆλ‹€.
__instance λ³€μˆ˜λ₯Ό 읽은 λ‹€μŒ μ—…λ°μ΄νŠΈν•˜λ―€λ‘œ 더 이상 μž‘λ™ν•˜μ§€ μ•Šκ³  이제 μ£Όμš” 버전 변경이 μ•„λ‹ˆλ”λΌλ„ 앱이 μ€‘λ‹¨λ©λ‹ˆλ‹€.

  __teardownRecognizers: on('willDestroyElement', function() {
    let instance = this.get('__instance');
    if (instance) {
      //instance.off();
      instance.destroy();
      this.set('__instance', null);
    }
  }),

μ—¬κΈ°μ—μ„œ λ¬Έμ œλŠ” Ember의 λΆ€ 릴리슀둜 인해 이전에 λ¬΄μ˜μ‹μ μœΌλ‘œ 이 μ£Όμž₯을 μœ„λ°˜ν–ˆλ˜ 앱이 이제 역좔적 μ—…λ°μ΄νŠΈκ°€ 해결될 λ•ŒκΉŒμ§€ μ—…κ·Έλ ˆμ΄λ“œκ°€ μ°¨λ‹¨λœλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 제 κ²½μš°μ—λŠ” μ‚¬μš©ν•˜λŠ” μ• λ“œμ˜¨μ΄ 이 μ–΄μ„€μ…˜μ„ μœ„λ°˜ν•˜κΈ° λ•Œλ¬Έμ— μœ μ§€ κ΄€λ¦¬ν•˜λŠ” 앱이 3.22둜 μ—…κ·Έλ ˆμ΄λ“œλ˜μ§€ μ•Šλ„λ‘ μ°¨λ‹¨λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

이것은 ν›Œλ₯­ν•©λ‹ˆλ‹€! μ›λž˜ λ³΄κ³ μ„œμ—λŠ” twiddle의 μ½”λ“œκ°€ μ‹€μ œλ‘œ μž‘λ™ν•œ 적이 μžˆλŠ”μ§€(λ˜λŠ” 였λ₯˜κ°€ λ°œμƒν•œ μ΄μœ μ— λŒ€ν•œ μΆ”λ‘ ) ν‘œμ‹œλ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

@kpfefferle - μ–΄λ–€ λ²„μ „μ—μ„œ μ—…κ·Έλ ˆμ΄λ“œν•©λ‹ˆκΉŒ? κ·€ν•˜μ˜ 경우 μ£Όμž₯을 μΌμœΌν‚€λŠ” λŒμ—°λ³€μ΄μ˜ 원인은 λ¬΄μ—‡μž…λ‹ˆκΉŒ?

λͺ…ν™•νžˆ ν•˜μžλ©΄, μ €λŠ” 주둜 여기에 보고된 λ‚΄μš©(λ²”μœ„, μ‚¬μš© νŒ¨ν„΄ λ“±)을 μ΄ν•΄ν•˜λ €κ³  λ…Έλ ₯ν•˜κ³  있으며 특히 SemVer에 λŒ€ν•΄ ν•©λ¦¬ν™”ν•˜κ±°λ‚˜ λ…ΌμŸν•˜λ €λŠ” 것이 μ•„λ‹™λ‹ˆλ‹€. 😸

@rwjblue Dependabot PR이 3.21.3μ—μ„œ 3.22.0으둜 μΆ©λŒν•˜λŠ” 데 μ‹€νŒ¨ν•œ 두 개의 앱이 μžˆμŠ΅λ‹ˆλ‹€. λ‘˜ λ‹€ μ‹€νŒ¨ν•œ λͺ¨λ“  ν…ŒμŠ€νŠΈμ— λŒ€ν•΄ λ‹€μŒκ³Ό 같은 μœ μ‚¬ν•œ 였λ₯˜ λ©”μ‹œμ§€λ₯Ό ν‘œμ‹œν•©λ‹ˆλ‹€.

        actual: >
            [object Object]
        stack: >
            Error: Assertion Failed: You attempted to update `_errors` on `changeset:[object Object]`, but it had already been used previously in the same computation.  Attempting to update a value after using it in a computation can cause logical errors, infinite revalidation bugs, and performance issues, and is not supported.

            `_errors` was first used:

            - While rendering:
              application
                forms
                  forms.form
                    form-workflow
                      form-workflow/form
                        form-for

            Stack trace for the update:
                at setter ([...]/assets/vendor.js:56179:9)
                at EmberChangeset.set [as _errors] ([...]/assets/vendor.js:17775:7)
                at EmberChangeset.BufferedChangeset.set (webpack://__ember_auto_import__/./node_modules/validated-changeset/dist/validated-changeset.es5.js?:2674:17)
                at Object.set ([...]/assets/vendor.js:104899:22)
                at Proxy.BufferedChangeset._handleValidation (webpack://__ember_auto_import__/./node_modules/validated-changeset/dist/validated-changeset.es5.js?:2447:18)
                at Proxy.BufferedChangeset._validateKey (webpack://__ember_auto_import__/./node_modules/validated-changeset/dist/validated-changeset.es5.js?:2425:23)
                at eval (webpack://__ember_auto_import__/./node_modules/validated-changeset/dist/validated-changeset.es5.js?:2211:24)
        message: >
            Assertion Failed: You attempted to update `_errors` on `changeset:[object Object]`, but it had already been used previously in the same computation.  Attempting to update a value after using it in a computation can cause logical errors, infinite revalidation bugs, and performance issues, and is not supported.

            `_errors` was first used:

            - While rendering:
              application
                forms
                  forms.form
                    form-workflow
                      form-workflow/form
                        form-for

이것은 일뢀 였λ₯˜ μž¬κ³„μ‚°μ„ μˆ˜ν–‰ν•˜λŠ” ember-changeset-validations의 내뢀인 것 κ°™μ§€λ§Œ 아직 νŒŒν—€μΉ  λŒ€μ—­ν­μ΄ μ—†μ—ˆμŠ΅λ‹ˆλ‹€. μ–΄μ„€μ…˜μ΄ μ •ν™•ν•˜κ³  μœ νš¨ν•œ κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ λ‚΄ ν…ŒμŠ€νŠΈ μŠ€μœ„νŠΈλ₯Ό ν­νŒŒμ‹œν‚€λŠ” 것은 무슨 일이 μΌμ–΄λ‚˜κ³  μžˆλŠ”μ§€ μ•Œμ•„λ‚Ό 수 μžˆμ„ λ•ŒκΉŒμ§€ 3.22둜 μ—…κ·Έλ ˆμ΄λ“œν•  수 μ—†λ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

μž‘μ•˜λ‹€. FWIW 였λ₯˜ λ©”μ‹œμ§€λŠ” 디버깅에 도움이 λ˜λŠ” μ΅œμ†Œν•œ "μœ μš©ν•œ" κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€.

@Yelinz - 보고된 μ›λž˜ 문제( twiddleμ—μ„œ )κ°€ @kpfefferle 이 λ³΄κ³ ν•˜λŠ” 것과 λ™μΌν•œ μ˜μ—­(μ΅œμ†Œν•œ 3.16 μ΄ν›„μ˜

λ‚΄ 이전 μ˜κ²¬μ—μ„œ λ§ν–ˆλ“―μ΄ 3.21μ—μ„œ 3.22κΉŒμ§€μ΄λ©° 상황은 λ‹€λ₯Έ μ• λ“œμ˜¨μ„ μ‚¬μš©ν•˜λŠ” @kpfefferle 와 λΉ„μŠ·ν•©λ‹ˆλ‹€. λ‚΄κ°€ λ§Œλ“  λΉ„ν‹€κΈ°λŠ” κ·Έ 였λ₯˜λ₯Ό λΆˆλŸ¬μΌμœΌν‚€κΈ° μœ„ν•œ κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€. 원인이 λ˜λŠ” μ‹€μ œ μ½”λ“œλŠ” 이전에 κ²Œμ‹œν•œ μ½”λ“œμž…λ‹ˆλ‹€.

2020-10-12T09:38:40.7310067Z         actual: >
2020-10-12T09:38:40.7310575Z             [object Object]
2020-10-12T09:38:40.7311080Z         stack: >
2020-10-12T09:38:40.7314024Z             Error: Assertion Failed: You attempted to update `__instance` on `<ember-caluma<strong i="7">@component</strong>:x-toggle-switch::ember726>`, but it had already been used previously in the same computation.  Attempting to update a value after using it in a computation can cause logical errors, infinite revalidation bugs, and performance issues, and is not supported.
2020-10-12T09:38:40.7315638Z             
2020-10-12T09:38:40.7316183Z             `__instance` was first used:
2020-10-12T09:38:40.7316698Z             
2020-10-12T09:38:40.7317709Z             - While rendering:
2020-10-12T09:38:40.7318285Z               application
2020-10-12T09:38:40.7318787Z                 demo
2020-10-12T09:38:40.7319293Z                   application
2020-10-12T09:38:40.7319772Z             
2020-10-12T09:38:40.7320295Z             Stack trace for the update:
2020-10-12T09:38:40.7321118Z                 at dirtyTagFor (http://localhost:7357/assets/vendor.js:74216:9)
2020-10-12T09:38:40.7322185Z                 at markObjectAsDirty (http://localhost:7357/assets/vendor.js:31365:32)
2020-10-12T09:38:40.7323337Z                 at notifyPropertyChange (http://localhost:7357/assets/vendor.js:31403:5)
2020-10-12T09:38:40.7324352Z                 at _set2 (http://localhost:7357/assets/vendor.js:32379:9)
2020-10-12T09:38:40.7325263Z                 at Class.set (http://localhost:7357/assets/vendor.js:45923:29)
2020-10-12T09:38:40.7326501Z                 at Class.__teardownRecognizers (http://localhost:7357/assets/vendor.js:165238:14)
2020-10-12T09:38:40.7327580Z                 at sendEvent (http://localhost:7357/assets/vendor.js:30998:14)

μŠ€νƒ 좔적은 λ˜ν•œ 그의

λ‚΄κ°€ λ§Œλ“  twiddle은 κ·Έ 였λ₯˜λ₯Ό 뢈러 μΌμœΌν‚€κΈ°μœ„ν•œ κ²ƒμž…λ‹ˆλ‹€.

예, ν•˜μ§€λ§Œ ν•΄λ‹Ή 였λ₯˜κ°€ λ°œμƒ ν•΄μ•Ό ν•˜λŠ” μ‹œλ‚˜λ¦¬μ˜€κ°€ 많이 μžˆμŠ΅λ‹ˆλ‹€. μš°λ¦¬κ°€ νŒŒμ•…ν•΄μ•Ό ν•  것은 이전 에 μΆ”μ λ˜μ§€

μ‚¬μš© νŒ¨ν„΄μ΄ 무엇인지 μ•Œκ²Œ 되면 μ£Όμž₯ λŒ€μ‹  λΉ„μΆ”μ²œμ„ 내도둝 λ³€κ²½ν•  수 μžˆλŠ”μ§€ μ•Œμ•„λ‚Ό 수 μžˆμ§€λ§Œ ν˜„μž¬λ‘œμ„œλŠ” μ—¬λŸ¬λΆ„μ΄ λΆ€λ”ͺμΉ˜λŠ” μ‹€μ œ 문제λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μž¬μƒμ‚°μ΄ 아직 μ—†μŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ μš°λ¦¬κ°€ μ£Όμž₯을 λΉ„μΆ”μ²œμœΌλ‘œ μ‘°μ •ν•  수 μžˆλŠ”μ§€ μ •λ§λ‘œ 말할 수 μ—†μŠ΅λ‹ˆλ‹€...

여기에 μ˜€λŠ” λ‹€λ₯Έ μ‚¬λžŒλ“€μ„ μœ„ν•΄ μ—¬κΈ°μ—μ„œ 보고 싢은 것은 μ „λ‹¬λ˜λŠ” μž¬μƒμ‚°(일뢀 λ¦¬ν¬μ§€ν† λ¦¬μ—μ„œ ν…ŒμŠ€νŠΈ μ‹€νŒ¨μ˜ ν˜•νƒœλ‘œ μ΄μƒμ μœΌλ‘œλŠ”, μ• λ“œμ˜¨μ΄λ“  이 λͺ©μ μœΌλ‘œ λ§Œλ“€μ–΄μ§„ 데λͺ¨ 앱이든 μƒκ΄€μ—†μŒ)μž…λ‹ˆλ‹€. 3.21 및 3.22μ—μ„œ μ‹€νŒ¨ν•©λ‹ˆλ‹€.

3μ›” 21일에 ν†΅κ³Όν•œ ν…ŒμŠ€νŠΈμž…λ‹ˆλ‹€.
https://github.com/projectcaluma/ember-caluma/pull/1065/checks?check_run_id=1241360614

ν•œνŽΈ λ™μΌν•œ μ½”λ“œλŠ” 3.22μ—μ„œ μ‹€νŒ¨ν•©λ‹ˆλ‹€.
https://github.com/projectcaluma/ember-caluma/pull/1065/checks?check_run_id=1241408429

λ¬Έμ œλŠ” 엠버 μ œμŠ€μ²˜μ™€ 이전에 κ²Œμ‹œν•œ μ½”λ“œ 쑰각으둜 λλ‚˜λŠ” κΈ΄ 쒅속성 λͺ©λ‘μ—μ„œ λ°œμƒν•©λ‹ˆλ‹€.

μ—¬λŸ¬λΆ„μ˜ λͺ¨λ“  도움에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.

곧 패치 λ¦΄λ¦¬μŠ€μ—μ„œ 이λ₯Ό μ œκ³΅ν•˜κΈ° μœ„ν•΄ λ…Έλ ₯ν•  κ²ƒμž…λ‹ˆλ‹€.

@rwjblue 문제λ₯Ό _ 좔적 _ν•΄ @pzuraq μ—κ²Œ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€!

:wave: @rwjblue , 이 μˆ˜μ • 사항이 ν¬ν•¨λœ 3.22.1 패치λ₯Ό λ¦΄λ¦¬μŠ€ν• 

ember-changeset-validations μ£Όμœ„μ— μ„€μ •λœ νŒ¨ν„΄μœΌλ‘œ 인해 λ§Žμ€ μ•±μ—μ„œ 이 λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. λ‹€μŒμ€ μš°λ¦¬κ°€ μ‚¬μš©ν•˜λŠ” νŒ¨ν„΄μ˜ μ˜ˆμž…λ‹ˆλ‹€.

import Component from '@glimmer/component';
import Changeset from 'ember-changeset';
import lookupValidator from 'ember-changeset-validations';
import OrderValidations from '../validations/order';

export default class OrderFormComponent extends Component {
  constructor() {
    super(...arguments);

    let model = this.args.model;
    this.changeset = new Changeset(
      model,
      lookupValidator(OrderValidations),
      OrderValidations
    );
    this.changeset.validate();
  }
}

this.changeset.validate() λŠ” 3.22.0μ—μ„œ μ–΄μ„€μ…˜ μ‹€νŒ¨λ₯Ό νŠΈλ¦¬κ±°ν•©λ‹ˆλ‹€.

방금 v3.22.1(https://github.com/emberjs/ember.js/releases/tag/v3.22.1)의 릴리슀λ₯Ό νŠΈλ¦¬κ±°ν–ˆμœΌλ©°, 곧 NPM에 κ²Œμ‹œλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€(CIκ°€ μ™„λ£Œλ˜λ©΄).

이 μˆ˜μ • 사항이 μ‹€μ œλ‘œ v3.22.1 λ¦΄λ¦¬μŠ€μ— ν¬ν•¨λ˜μ—ˆμŠ΅λ‹ˆκΉŒ? μ•„λ‹ˆλ©΄ κ΄€λ ¨ PR이 이 문제λ₯Ό μ™„μ „νžˆ μˆ˜μ •ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆκΉŒ? 릴리슀 λ…ΈνŠΈμ—μ„œ https://github.com/emberjs/ember.js/pull/19193 을 λ³Ό 수 μžˆμ§€λ§Œ λ‚΄ ν”„λ‘œμ νŠΈλŠ” μ—¬μ „νžˆ 이전과 λ™μΌν•œ ν…ŒμŠ€νŠΈ μ‹€νŒ¨λ₯Ό 보여주고 μžˆμŠ΅λ‹ˆλ‹€ πŸ€”

확인됨, 3.22.1μ—μ„œλ„ μ—¬μ „νžˆ ν‘œμ‹œλ¨

μž¬μ‘°μ‚¬λ₯Ό μœ„ν•΄ μž¬κ°œν•©λ‹ˆλ‹€. λ‹¨μˆœν™”λœ/μ΅œμ†Œν•œμ˜ 데λͺ¨(3.20에 ν†΅κ³Όν•˜κ³  3.22에 μ‹€νŒ¨)λŠ” 정말 도움이 될 κ²ƒμž…λ‹ˆλ‹€.

λ‹€μŒμ€ 3.22.1 μ—μ„œ 였λ₯˜λ₯Ό μƒμ„±ν•˜μ§€λ§Œ 3.21 μ—μ„œ μž‘λ™ν•˜λŠ” κ°„λ‹¨ν•œ 예 μž…λ‹ˆλ‹€.

export default class ExampleComponent extends Component {
  <strong i="9">@tracked</strong> count = 0;

  constructor() {
    super(...arguments);

    this.count++; // this fails in 3.22.1
  }
}

3.21 :

Screenshot 2020-11-16 at 10 34 57

3.22.1 :

Screenshot 2020-11-16 at 10 34 30

μƒμ„±μžμ—μ„œ 좔적 속성을 읽고 μ—…λ°μ΄νŠΈν•˜λŠ” 데 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆκΉŒ? λ‚΄ μ •μ‹  λͺ¨λΈμ€ 속성이 ꡬ성 μš”μ†Œμ— 둜컬이고 아직 DOM에 아무 것도 λ Œλ”λ§ν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— 이것이 λ¬Έμ œκ°€ μ—†μ–΄μ•Ό ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

μœ„μ˜ μ˜ˆλŠ” λ˜ν•œ μ΅œκ·Όμ— νƒœκ·Έκ°€ μ§€μ •λœ 3.23 에 λŒ€ν•œ μ£Όμž₯을 μ œκΈ°ν•©λ‹ˆλ‹€.

@GavinJoyce κ°€ Glimmer μ»΄ν¬λ„ŒνŠΈμ™€ ν•¨κ»˜ μ œκ³΅ν•œ μ˜ˆμ‹œμΈκ°€μš”? μš°λ¦¬λŠ” 이전 λ²„μ „κ³Όμ˜ ν˜Έν™˜μ„±μ„ μœ„ν•΄ Classic ꡬ성 μš”μ†Œμ—μ„œλ§Œ 이 버그λ₯Ό μˆ˜μ •ν•˜λ €κ³  ν–ˆμŠ΅λ‹ˆλ‹€. Glimmer ꡬ성 μš”μ†Œμ—μ„œλŠ” 일반적으둜 μ•žμœΌλ‘œ _do_ λ Œλ”λ§ 쀑에 이와 같은 λŒμ—°λ³€μ΄κ°€ μ‹€νŒ¨ν•  κ²ƒμœΌλ‘œ μ˜ˆμƒν•©λ‹ˆλ‹€. 일반적으둜 단일 좔적 계산 쀑에 좔적 μƒνƒœλ₯Ό μ•ˆμ „ν•˜κ²Œ 읽은 λ‹€μŒ 좔적 μƒνƒœμ— μ“°λŠ” 것은 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

μ–΄μ„€μ…˜μ΄ μ›λž˜ 3.15μ—μ„œ κ°•ν™”λ˜μ—ˆκΈ° λ•Œλ¬Έμ— μ΄λŸ¬ν•œ μœ ν˜•μ˜ λŒμ—°λ³€μ΄λ₯Ό λͺ¨λ‘ 닀루렀고 ν–ˆμ§€λ§Œ VM이 λ‚΄λΆ€μ μœΌλ‘œ μžλ™ 좔적을 μ‚¬μš©ν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— μƒμ„±μžκ°€ λˆ„λ½λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

deprecateMutationsInAutotrackingFrame λ„μš°λ―Έλ‘œ 이것을 λž˜ν•‘ν•˜μ—¬ 앱이 νšŒκ·€ν•˜λŠ” 것을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ λ‹ΉλΆ„κ°„ μ–΄μ„€μ…˜ λŒ€μ‹  μ‚¬μš© 쀑단을 던질 수 μžˆμŠ΅λ‹ˆλ‹€.

deprecateMutationsInAutotrackingFrame λ„μš°λ―Έλ‘œ 이것을 λž˜ν•‘ν•˜μ—¬ 앱이 νšŒκ·€ν•˜λŠ” 것을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ λ‹ΉλΆ„κ°„ μ–΄μ„€μ…˜ λŒ€μ‹  μ‚¬μš© 쀑단을 던질 수 μžˆμŠ΅λ‹ˆλ‹€.

예, 이것은 μ˜λ―Έκ°€ μžˆμŠ΅λ‹ˆλ‹€. μ§€κΈˆμ€ 차단이 ν•΄μ œλ˜μ§€λ§Œ 근본적인 문제λ₯Ό ν•΄κ²°ν•˜λ €λ©΄ μ—¬μ „νžˆ μ• ν”Œλ¦¬μΌ€μ΄μ…˜/μ• λ“œμ˜¨/등이 ν•„μš”ν•©λ‹ˆλ‹€(좔적 μ»¨ν…μŠ€νŠΈ λ‚΄μ—μ„œ "읽기 ν›„ μ“°κΈ°"λ₯Ό 지원할 수 μ—†μŒ).

Glimmer ꡬ성 μš”μ†Œμ™€ ν•¨κ»˜ μ œκ³΅ν•œ μ˜ˆμ œμž…λ‹ˆκΉŒ?

예, Glimmer ꡬ성 μš”μ†Œμž…λ‹ˆλ‹€.

λ‹€μŒμ€ ν˜„μž¬ μ—…κ·Έλ ˆμ΄λ“œλ₯Ό μ°¨λ‹¨ν•˜κ³  μžˆλŠ” μ‹€μ œ 문제의 μ˜ˆμž…λ‹ˆλ‹€. https://github.com/GavinJoyce/backdrifts/pull/5

μƒμ„±μžμ—μ„œ λͺ¨λΈ 데이터λ₯Ό λ³€κ²½(이 경우 addFragment 호좜)ν•˜λŠ” 것은 ν™•μ‹€νžˆ λ°˜νŒ¨ν„΄μž…λ‹ˆλ‹€. 경둜 λ˜λŠ” μž‘μ—… λ‹¨κ³„μ—μ„œ λͺ¨λΈμ„ 생성할 λ•Œ μ΄λŸ¬ν•œ μ’…λ₯˜μ˜ λͺ¨λΈ λŒμ—°λ³€μ΄λ₯Ό μˆ˜ν–‰ν•  κ°€λŠ₯성이 맀우 λ†’μŠ΅λ‹ˆλ‹€. . μ–΄μ„€μ…˜ λŒ€μ‹  지원 쀑단을 내보내면 이와 같은 λ¬Έμ œκ°€ λ°œμƒν•œ 앱에 이 λ¦¬νŒ©ν† λ§μ„ μˆ˜ν–‰ν•  μ‹œκ°„μ΄ μ£Όμ–΄μ§‘λ‹ˆλ‹€.

μ–΄μ„€μ…˜ λŒ€μ‹  지원 쀑단을 내보내면 이와 같은 λ¬Έμ œκ°€ λ°œμƒν•œ 앱에 이 λ¦¬νŒ©ν† λ§μ„ μˆ˜ν–‰ν•  μ‹œκ°„μ΄ μ£Όμ–΄μ§‘λ‹ˆλ‹€.

μ ˆλŒ€μ μœΌλ‘œ λ™μ˜ν•©λ‹ˆλ‹€! 였늘 아침에 μž‘μ—…ν•΄λ³΄λ €κ³  ν•©λ‹ˆλ‹€.

μ–΄λ–€ 식 μœΌλ‘œλ“  λ„μšΈ 수 μžˆλ‹€λ©΄ LMK κ°μ‚¬ν•©λ‹ˆλ‹€.

이λ₯Ό μœ„ν•΄μ„œλŠ” https://github.com/glimmerjs/glimmer-vm/pull/1205 에 μ œμΆœν•œ glimmer-vm 의 일뢀 변경이 ν•„μš”ν•˜μ§€λ§Œ Ember 톡합(지원 쀑단을 μœ„ν•΄)은 https://github에 μžˆμŠ΅λ‹ˆλ‹€. com/emberjs/ember.js/pull/19282.

ν•„μš”ν•œ Glimmer λ³€κ²½ 사항을 방금 μ°©λ₯™ν–ˆμœΌλ©° 내일 릴리슀λ₯Ό μ–»μœΌλ €κ³  λ…Έλ ₯ν•  κ²ƒμž…λ‹ˆλ‹€.

λͺ¨λ“  개체 μœ ν˜•μ— μ‚¬μš© 쀑단(vs assertion) λ™μž‘μ΄ μžˆλŠ”μ§€ 확인해야 ν•˜κΈ° λ•Œλ¬Έμ— μ›λž˜ μƒκ°ν–ˆλ˜ 것보닀 쑰금 더 λ³΅μž‘ν–ˆμŠ΅λ‹ˆλ‹€. https://github.com/emberjs/ember.js/pull/19282 κ°€ λ§ˆμΉ¨λ‚΄ κ²€ν† ν•  μ€€λΉ„κ°€ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒ λ‹¨κ³„λŠ” λ‹€μ–‘ν•œ λ²„μ „μ—μ„œ glimmer-vm의 λ³€κ²½ 사항을 λ°±ν¬νŠΈν•˜κ³  ν…ŒμŠ€νŠΈν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€(각각 λ‚΄λΆ€μ μœΌλ‘œ μ£Όμš” λ³€κ²½ 사항이 있음).

아직 100% ν™•μ‹ ν•  μˆ˜λŠ” μ—†μ§€λ§Œ 3.23.1+μ—μ„œ λ¦΄λ¦¬μŠ€ν•  κ°€λŠ₯성이 μžˆμŠ΅λ‹ˆλ‹€(3.22λŠ” 더 이상 ν˜„μž¬ λ¦΄λ¦¬μŠ€κ°€ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ—). 3.22μ—μ„œ 이에 λŒ€ν•œ νŠΉμ • μš”κ΅¬ 사항이 있고 λŒ€μ‹  3.23으둜 μ—…λ°μ΄νŠΈν•  수 μ—†λŠ” μ‚¬λžŒμ΄ μžˆμŠ΅λ‹ˆκΉŒ?

3.23으둜 μ—…λ°μ΄νŠΈν•˜κ²Œ λ˜μ–΄ κΈ°μ©λ‹ˆλ‹€.

λ‹€λ₯Έ 컀피가 ν•„μš”ν•  μˆ˜λ„ μžˆμ§€λ§Œ, μš°λ¦¬κ°€ ν”Όν•΄μ•Ό ν•  νŒ¨ν„΄μ„ μ™„μ „νžˆ μ΄ν•΄ν•˜μ§€ λͺ»ν•œλ‹€λŠ” 점을 κ²Έμ†ν•˜κ²Œ μΈμ •ν•©λ‹ˆλ‹€. getterμ—μ„œ 값을 μ„€μ •ν•œ 예λ₯Ό μ΄ν•΄ν•˜μ§€λ§Œ Gavin의 μ˜ˆκ°€ μ™œ λ‚˜μœμ§€ 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€(쑰금 κ³ μ•ˆλœ 것일지라도). λˆ„κ΅°κ°€κ°€ 문제λ₯Ό κ΅μœ‘ν•˜λŠ” 데 도움을 쀄 수 μžˆμŠ΅λ‹ˆκΉŒ?

앱을 3.22 λ˜λŠ” 3.23으둜 μ—…κ·Έλ ˆμ΄λ“œν•˜κΈ° μœ„ν•΄ ν•΄μ•Ό ν•  일이 더 λ§Žμ€μ§€ ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μš°λ¦¬λŠ” 3.22μ—μ„œ 수백 개의 μ‹€νŒ¨ν•œ ν…ŒμŠ€νŠΈλ₯Ό 가지고 있으며, κ·Έ 쀑 압도적 λ‹€μˆ˜λŠ” μ£Όμž₯을 μ—­μΆ”μ ν•˜λŠ” κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€. 이 μ£Όμž₯은 κ·€ν•˜μ˜ λ³€κ²½μœΌλ‘œ μˆ˜μ •λ˜κΈ°λ₯Ό λ°”λžλ‹ˆλ‹€. λ°”λΌκ±΄λŒ€ μš°λ¦¬λŠ” 3.21μ—μ„œ 3.23.1둜 λ°”λ‘œ 이동할 수 μžˆμŠ΅λ‹ˆλ‹€.

μΆ”κ°€ 뢀담이 크지 μ•Šλ‹€λ©΄ 3.22.2도 μΆœμ‹œν•˜λŠ” 것이 쒋지 μ•Šμ„κΉŒμš”? ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ 버전을 μ—…κ·Έλ ˆμ΄λ“œν•˜λŠ” μ‚¬λžŒλ“€μ€ ν–₯ν›„ 골칫거리λ₯Ό 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.

참고둜 μ €λŠ” μ—”μ§„μ—μ„œ ember-beta ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•  λ•Œ 이것을 보고 μžˆμŠ΅λ‹ˆλ‹€.

Screen Shot 2020-11-20 at 11 29 18 AM

μœ„λ°˜ μ½”λ“œ:

<LinkToExternal @route="your-coach">{{@coachUser.firstName}}</LinkToExternal>

@jherdman 이 μ΅œμ‹  ember-engines μ½”λ“œλ₯Ό μ‚¬μš© 쀑인지 ν™•μΈν•˜μ‹­μ‹œμ˜€. link-to-external λŠ” 이 μ£Όμž₯을 ν”Όν•˜κΈ° μœ„ν•΄ μ΅œκ·Όμ— μ—…λ°μ΄νŠΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€(https://github.com/ember-engines/ember-engines/pull/735).

λ‚˜λŠ” μ‹€μ œλ‘œ μ—”μ§„μ˜ v0.8.8에 μžˆλ‹€κ³  λ§ν•˜λŠ” 것을 유감슀럽게 μƒκ°ν•©λ‹ˆλ‹€. 이 문제λ₯Ό νƒˆμ„ μ‹œν‚€κ³  싢지 μ•ŠμŠ΅λ‹ˆλ‹€. κ±°κΈ°μ—μ„œ 문제λ₯Ό μ—΄μ–΄μ•Ό ν•©λ‹ˆκΉŒ?

λ‚˜λŠ” μ‹€μ œλ‘œ μ—”μ§„μ˜ v0.8.8에 μžˆλ‹€κ³  λ§ν•˜λŠ” 것을 유감슀럽게 μƒκ°ν•©λ‹ˆλ‹€. 이 문제λ₯Ό νƒˆμ„ μ‹œν‚€κ³  싢지 μ•ŠμŠ΅λ‹ˆλ‹€. κ±°κΈ°μ—μ„œ 문제λ₯Ό μ—΄μ–΄μ•Ό ν•©λ‹ˆκΉŒ?

예, λΆ€νƒν•©λ‹ˆλ‹€!

λ‹€λ₯Έ 컀피가 ν•„μš”ν•  μˆ˜λ„ μžˆμ§€λ§Œ, μš°λ¦¬κ°€ ν”Όν•΄μ•Ό ν•  νŒ¨ν„΄μ„ μ™„μ „νžˆ μ΄ν•΄ν•˜μ§€ λͺ»ν•œλ‹€λŠ” 점을 κ²Έμ†ν•˜κ²Œ μΈμ •ν•©λ‹ˆλ‹€. getterμ—μ„œ 값을 μ„€μ •ν•œ 예λ₯Ό μ΄ν•΄ν•˜μ§€λ§Œ Gavin의 μ˜ˆκ°€ μ™œ λ‚˜μœμ§€ 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€(쑰금 κ³ μ•ˆλœ 것일지라도). λˆ„κ΅°κ°€κ°€ 문제λ₯Ό κ΅μœ‘ν•˜λŠ” 데 도움을 쀄 수 μžˆμŠ΅λ‹ˆκΉŒ?

μ—¬κΈ°μ„œ κ°œλ…μ  λ¬Έμ œλŠ” ν˜„μž¬ "좔적 ν”„λ ˆμž„"μ—μ„œ 이미 μ½κ±°λ‚˜ μ†ŒλΉ„λœ μΆ”μ λœ 값을 λ³€κ²½ν•  λ•Œ μ΅œμ’… λ Œλ”λ§λœ 값이 μœ νš¨ν•˜λ‹€λŠ” 것을 보μž₯ν•  수 μ—†λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ λ‹€μŒ 섀정을 상상해 λ³΄μ‹­μ‹œμ˜€.

  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 경둜의 무언가가 {{this.someService.randomTrackedProperty}} μ•‘μ„ΈμŠ€ν•©λ‹ˆλ‹€.
  • 그런 λ‹€μŒ λ‚˜μ€‘μ— 쀑첩 경둜의 ν…œν”Œλ¦Ώ μ–΄λ”˜κ°€μ—μ„œ <FooBar /> 와 같은 ꡬ성 μš”μ†Œλ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.
  • FooBar μƒμ„±μžμ—μ„œ this.someService.randomTrackedProperty = "hello!"

이전 읽기 좔적 값을 λ³€κ²½ν•˜λŠ” ν•΄λ‹Ή ꡬ성 μš”μ†ŒλŠ” ν•΄λ‹Ή 값에 λŒ€ν•œ λ‹€λ₯Έ μ°Έμ‘°κ°€ 이제 μœ νš¨ν•˜μ§€ μ•ŠμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.

μœ„μ˜ Gavins μ˜ˆμ—μ„œ κ·ΈλŠ” μΉ΄μš΄ν„°λ₯Ό μ¦κ°€μ‹œμΌ°μŠ΅λ‹ˆλ‹€. 이것은 λ°˜λ“œμ‹œ κΈ°μ‘΄ 값을 읽은 λ‹€μŒ μƒˆ κ°’μœΌλ‘œ μ—…λ°μ΄νŠΈν•œλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. 값이 ꡬ성 μš”μ†Œμ— λŒ€ν•΄ 둜컬이고 이 μ˜ˆμ œμ—μ„œ λ‹€λ₯Έ μ½”λ“œκ°€ "잘λͺ»λœ" 버전(λ³€κ²½ν•˜κΈ° μ „μ˜ 초기 버전)에 μ•‘μ„ΈμŠ€ν•  수 μ—†μ—ˆκΈ° λ•Œλ¬Έμ— 그것이 무해해 λ³΄μΈλ‹€λŠ” 것을 μ•Œκ³  μžˆμ§€λ§Œ μ‹€μ œλ‘œ λŠ” μƒμ„±μžμ— λŒ€ν•΄ νŠΉλ³„ν•œ 것이

μ—¬κΈ°μ—μ„œ λΉ λ₯Έ μ—…λ°μ΄νŠΈ, 3.23.1이 μˆ˜μ • 사항과 ν•¨κ»˜ λ¦΄λ¦¬μŠ€λ©λ‹ˆλ‹€. λ‚˜λŠ” 내일 3.22.xλ₯Ό μ™„μ„±ν•˜λ €κ³  λ…Έλ ₯ν•  κ²ƒμž…λ‹ˆλ‹€(체리 λ”°κΈ° λ¬Έμ œμ— λΆ€λ”ͺμ³€μŠ΅λ‹ˆλ‹€).

μ•Œκ² μŠ΅λ‹ˆλ‹€. 3.22.2에 νƒœκ·Έκ°€ μ§€μ •λ˜μ—ˆμœΌλ©° 곧 NPM에 κ²Œμ‹œλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

3.22.2에 νƒœκ·Έλ₯Ό 지정해 μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. λ¨Όμ € ν•΄λ‹Ή ν•­λͺ©μœΌλ‘œ μ΄λ™ν•˜λŠ” 것이 도움이 될 κ²ƒμž…λ‹ˆλ‹€.

참고둜, 10μ‹œκ°„ 후에 NPM에 κ²Œμ‹œλ˜μ§€ μ•ŠλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. https://www.npmjs.com/package/ember-source/v/3.22.2

방금 μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€. μ£„μ†‘ν•©λ‹ˆλ‹€.

μ’‹μ•„μš”, κ°μ‚¬ν•©λ‹ˆλ‹€!

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰