Aggiornamento di Discourse a Ember 4

Vogliamo aggiornare la versione di Ember utilizzata in Discourse.

Al momento siamo alla versione 3.15 e vorremmo arrivare alla 4.1.

Ci siamo prefissati l’obiettivo di completare questo lavoro entro la fine dell’anno. Si prega di notare che questo argomento è una roadmap e tutti i piani e le stime sono provvisori. Questo argomento non è inteso per ospitare discussioni significative su aggiornamenti o modifiche specifiche. Quindi, manteniamo la conversazione qui un po’ focalizzata. Le domande su come questi aggiornamenti influenzeranno il tuo sito/plugin/tema sono fuori argomento. Le modifiche pianificate sono al 100% sul front-end (app Ember).

Saremo estremamente attenti alle modifiche che introduciamo. Tutti i plugin/temi ufficiali verranno aggiornati (incluso qualsiasi lavoro personalizzato che CDCK abbia svolto per i suoi clienti). Invieremo anche PR per aggiornare tutti i plugin/temi non ufficiali popolari.

Nessun problema se hai un plugin/tema personalizzato che hai creato per il tuo sito. Aggiungeremo avvisi di deprecazione e creeremo gli annunci necessari in modo tempestivo per darti abbastanza tempo per apportare le modifiche richieste. Cercheremo anche di guidarti attraverso queste modifiche se necessario.

Iniziamo con gli obiettivi. Ovviamente vogliamo arrivare alla versione più alta disponibile, ma dobbiamo fissare obiettivi intermedi tra ora e la nostra destinazione finale.

Pianeggiamo di fare aggiornamenti incrementali. Invece di un grande aggiornamento alla 4.1, divideremo questo lavoro in sei fasi. Ogni fase si concentra su un aggiornamento di Ember.

Fase Dimensione Aggiornamenti
1 size-l Ember 3.15 → Ember 3.16
2 size-m Ember 3.16 → Ember 3.25
3 size-xl Ember 3.25 → Ember 3.26 (Parte 1 - Generale)
Ember 3.25 → Ember 3.26 (Parte 2 - Template)
Ember 3.25 → Ember 3.26 (Parte 3 - jQuery)
Ember 3.25 → Ember 3.26 (Parte 4 - Lavori preparatori Octane)
Ember 3.25 → Ember 3.26 (Parte 5 - Octane)
4 size-l Ember 3.26 → Ember 3.27 (Parte 1 - Generale)
Ember 3.26 → Ember 3.27 (Parte 2 - RenderTemplate)
Ember 3.26 → Ember 3.27 (Parte 3 - Componenti built-in legacy)
5 size-s Ember 3.27 → Ember 3.28
6 size-s Ember 3.28 → Ember 4.1

La scelta di quelle versioni specifiche si basa interamente sulle deprecazioni e sulla quantità di lavoro che introducono - e sul rischio implicito.

Quindi, analizziamole più nel dettaglio per maggiore chiarezza.

Deprecazioni per aggiornamento

Fase 1 (size-l)

Ember 3.15 → Ember 3.16

Questo aggiornamento introduce solo una deprecazione.

  1. Utilizzare il resolver di ember-CLI invece del resolver globale legacy :link: - fino a: 4.0.0 - size-l

    Discourse ha il proprio resolver personalizzato che attualmente estende Ember.DefaultResolver.

    La correzione consigliata è eliminare qualsiasi resolver personalizzato e utilizzare il resolver di Ember-CLI. È più facile a dirsi che a farsi perché abbiamo una buona quantità di logica personalizzata per gestire plugin e temi.

    Un compromesso che funziona è estendere il resolver di Ember-CLI invece di estendere Ember.DefaultResolver.

Fase 2 (size-m)

Ember 3.16 → Ember 3.25

Questo aggiornamento introduce otto deprecazioni.

  1. @ember/string#loc e {{loc}} :link: fino a: 4.0.0 - :heavy_check_mark:

  2. Senza “for” - deprecazione integrata di Ember :link: fino a: 4.0.0 - :heavy_check_mark:

  3. Senza “since” - deprecazione integrata di Ember :link: fino a: 4.0.0 - :heavy_check_mark:

  4. tryInvoke da @ember/utils :link: fino a: 4.0.0 - :heavy_check_mark:

  5. API di distruzione Meta :link: - fino a: 3.25.0 - :heavy_check_mark:

    Non utilizziamo nessuno di questi, quindi non c’è nulla da fare qui.

  1. Utilizzare getter Ember e verificare esplicitamente l’undefined :link: - fino a: 4.0.0 - size-s

    Questa è una deprecazione semplice. Dobbiamo solo rimuovere getWithDefault dalla nostra codebase e ci sono solo pochi punti in cui lo utilizziamo.

  2. Estensioni del prototipo String :link: - fino a: 4.0.0 - size-m

    Anche questo è uno scambio semplice e a basso rischio, ma utilizziamo il prototipo stringa esteso di Ember in diversi punti. Da un controllo rapido, penso che ci siano circa < 100 punti in cui lo facciamo tra core e plugin/temi. Una volta aggiornati, dovremmo anche impedire a Ember di estendere quel prototipo con qualcosa del genere.

    EXTEND_PROTOTYPES: {
       String: false
    }
    

    nel nostro file environment.

  3. Importazione di htmlSafe e isHTMLSafe da @ember/string :link: - fino a: 4.0.0 - size-m

    C’è molta sovrapposizione tra questo e il punto #7 in questo aggiornamento, e dovrebbe essere diretto e a basso rischio.

Fase 3 (size-xl)

L’aggiornamento da 3.25 a 3.26 è piuttosto complesso. È qui che facciamo la maggior parte del “recupero”. Ci sono sedici deprecazioni in totale. Divideremo questo aggiornamento in cinque parti - dove faremo un aumento di versione solo dopo che tutte le deprecazioni sono state gestite.

Ember 3.25 → Ember 3.26 (Parte 1 - Generale)

Questa parte si occupa di nove deprecazioni relativamente più facili da gestire.

  1. Osservatori di Array :link: - fino a: 4.0.0 - :heavy_check_mark:

  2. Capacità del Manager dei Componenti :link: - fino a: 4.0.0 - :heavy_check_mark:

  3. Capacità del Manager dei Modifier :link: - fino a: 4.0.0 - :heavy_check_mark:

  4. Funzionalità opzionale: application-template-wrapper :link: - fino a: 4.0.0 - :heavy_check_mark:

  5. classBinding e classNameBindings come argomenti nei template :link: - fino a: 4.0.0 - :heavy_check_mark:

    Nulla da fare qui; non utilizziamo quelli.

  1. Metodi di transizione di route e controller :link: - fino a: 5.0.0 - size-m

    Questa deprecazione rimuove un paio di metodi da routes e controllers. Potrebbe sembrare una modifica complessa, ma dovrebbe essere diretta. Dovremmo solo iniettare il Router come servizio e chiamarli da lì - quando necessario. La parte difficile è che li utilizziamo in molti punti e tutti devono essere aggiornati.

  2. Politica di supporto del browser :link: - fino a: 4.0.0 - size-s

    ~~Questo dovrebbe essere un cambiamento relativamente semplice. Ember non supporterà IE11 a partire da 4.0. La cosa positiva è che non lo supportiamo da molto tempo comunque. L’unica cosa che dobbiamo cambiare è smettere di traspilare per IE11 in produzione.
    discourse/app/assets/javascripts/discourse/config/targets.js at 1472e47aae5bfdfb6fd9abfe89beb186c751f514 · discourse/discourse · GitHub

    Ho fatto alcuni test basici e questo cambiamento ci farà risparmiare circa 60kb (gzip) o ~6% dei nostri bundle principali e vendor nelle installazioni di Ember-CLI in produzione.

  3. {{hasBlock}} e {{hasBlockParams}} :link: - fino a: 4.0.0 - size-s

    Li utilizziamo in un paio di punti. Questo è un semplice rinominamento a basso rischio.

  4. Helper {{with}} :link: - fino a: 4.0.0 - size-s

    Lo utilizziamo raramente, ma ha comunque bisogno di essere corretto. Dobbiamo solo sostituirli e utilizzare {{let}} o una combinazione di {{if}} / {{else}}

Ember 3.25 → Ember 3.26 (Parte 2 - Template)

Questa parte si concentrerà principalmente sulle deprecazioni che coinvolgono i template .hbs. Ci sono tre deprecazioni su cui dobbiamo concentrarci qui.

  1. Ricerca di fallback delle proprietà :link: - fino a: 4.0.0 - size-l

    A partire da Ember 4.0, questo non funzionerà più.

    Ciao, {{name}}!
    

    Se abbiamo una proprietà in un template, dobbiamo cercarla con un this prefisso così

    Ciao, {{this.name}}!
    

    Dovremo farlo con tutti i nostri template. Ci sono modi per ridurre il dolore qui. Possiamo provare il ember-no-implicit-this-codemod e vedere quanto ci porta avanti.

    Sono a favore di limitare le modifiche a 1 file per PR. Questo facilita la revisione - e il rollback se qualcosa va storto.

  2. Accesso agli argomenti nominati tramite {{attrs}} :link: - fino a: 4.0.0 size-xl

    L’oggetto {{attrs}} verrà rimosso in Ember 4.0. La modifica in sé è molto diretta e l’esempio di Ember è piuttosto bello.

    Prima:

    {{attrs.foo}}
    {{this.attrs.foo.bar}}
    {{deeply (nested attrs.foobar.baz)}}
    

    Dopo:

    {{@foo}}
    {{@foo.bar}}
    {{deeply (nested @foobar.baz)}}
    

    Dovremo farlo per tutti i nostri template. Possiamo combinare questa modifica con la conversione dei template nella sintassi a parentesi angolari. Sono un grande fan delle parentesi angolari perché sono molto più vicine alla sintassi standard dei web-component personalizzati.

    Una cosa che potrebbe accelerare i nostri progressi qui è il ember-angle-brackets-codemod. Dovremo sperimentare con esso e vedere quanto ci porta avanti. Gestisce la deprecazione e ci dà una bella sintassi a parentesi angolari.

    Simile al punto #1 in questa parte, sono anche a favore di correggere e testare un template per PR.

  3. Argomenti posizionali <LinkTo> :link: - fino a: 4.0.0 - size-m

    Anche questa è una deprecazione che mira a ridurre la confusione. Ci sono alcuni punti in cui utilizziamo argomenti posizionali su link-to. Possiamo correggerli così

    Prima:

    {{link-to "Chi siamo" "about"}}
    {{#link-to "about"}}Chi siamo{{/link-to}}
    {{#link-to "post" @post}}Leggi {{@post.title}}...{{/link-to}}
    

    Dopo (con parentesi angolari):

     <LinkTo @route="about">Chi siamo</LinkTo>
     <LinkTo @route="about">Chi siamo</LinkTo>
     <LinkTo @route="post" @model={{@post}}>Leggi {{@post.title}}...</LinkTo>
    

Ember 3.25 → Ember 3.26 (Parte 3 - jQuery)

Non c’è molto da dire su questo che tu non sappia già. Le nuove app Ember non utilizzano jQuery e verrà rimosso in Ember 4.0.

In questa parte, ci concentreremo su una deprecazione.

  1. Funzionalità opzionale: jquery-integration :link: - fino a: 4.0.0 - size-xl

    Negli ultimi anni, abbiamo fatto enormi progressi nella riduzione dell’utilizzo di jQuery. Ci sono ancora punti in cui ne abbiamo bisogno, in particolare nel composer e come dipendenza per alcune librerie vendor che utilizziamo. Non voglio entrare nei dettagli di questa modifica qui. Per fare breve, dovremmo allontanarci dall’utilizzo di jQuery.

    Tuttavia, vorrei sottolineare che anche se eliminiamo jQuery OVUNQUE, dovremmo comunque mantenere questa opzione impostata su true fino a quando non saremo pronti per Ember 4.0. Abbiamo bisogno di un piano per facilitare la transizione per i siti con temi/plugin personalizzati che non controlliamo. In altre parole, facciamo il lavoro ma conviviamo con l’avviso di deprecazione sul disattivamento dell’opzione.

Ember 3.25 → Ember 3.26 (Parte 4 - Lavori preparatori Octane)

In questa parte, dovremmo concentrarci sul preparare i nostri file per Octane. Gestiremo due deprecazioni.

  1. Funzionalità opzionale: template-only-glimmer-components :link: - fino a: 4.0.0 - size-m

    Questo è un cambiamento semplice in teoria, ma c’è un lavoro implicito che dobbiamo fare prima di poter attivare quell’opzione.

    Dobbiamo assicurarci che i nostri attuali componenti solo-template funzionino con la semantica glimmer. Ho fatto alcuni test e i nostri test hanno avuto problemi con quell’opzione attivata. Ecco un esempio di elenco di alcuni componenti solo-template che abbiamo nel core

    - app/templates/components/activation-email-form.hbs
    - app/templates/components/cancel-link.hbs
    - app/templates/components/categories-with-featured-topics.hbs
    - app/templates/components/category-name-fields.hbs
    - app/templates/components/color-input.hbs
    - app/templates/components/custom-html-container.hbs
    - app/templates/components/emoji-group-buttons.hbs
    - app/templates/components/emoji-group-sections.hbs
    - app/templates/components/empty-state.hbs
    - app/templates/components/ip-lookup.hbs
    - app/templates/components/modal-footer-close.hbs
    - app/templates/components/popup-menu.hbs
    - app/templates/components/reviewable-created-by-name.hbs
    - app/templates/components/reviewable-created-by.hbs
    - app/templates/components/reviewable-field-editor.hbs
    - app/templates/components/reviewable-field-text.hbs
    - app/templates/components/reviewable-field-textarea.hbs
    - app/templates/components/reviewable-field.hbs
    - app/templates/components/reviewable-flagged-post.hbs
    - app/templates/components/reviewable-post-header.hbs
    - app/templates/components/reviewable-post.hbs
    - app/templates/components/reviewable-scores.hbs
    - app/templates/components/reviewable-tags.hbs
    - app/templates/components/reviewable-topic-link.hbs
    - app/templates/components/score-value.hbs
    - app/templates/components/selected-posts.hbs
    - app/templates/components/subcategories-with-featured-topics.hbs
    - app/templates/components/text-overflow.hbs
    - app/templates/components/user-fields/confirm.hbs
    - app/templates/components/user-fields/dropdown.hbs
    - app/templates/components/user-fields/multiselect.hbs
    - app/templates/components/user-fields/text.hbs
    - app/templates/components/user-profile-avatar.hbs
    - app/templates/components/user-summary-users-list.hbs
    

    Dovremo anche controllare i nostri template Admin/tema/plugin e assicurarci che tutto funzioni prima di rilasciare quell’opzione.

    A prima vista, non sono esattamente sicuro di come i nostri template .hbr grezzi si inseriscano in questo. Tuttavia, @david ha lavorato su liste di topic basate su glimmer. Quindi, forse possiamo fare a meno dei template grezzi del tutto.

  2. Iniezioni implicite :link: - fino a: 4.0.0 size-xl

    Utilizziamo iniezioni implicite ovunque. Lo facciamo in un initializer così
    discourse/app/assets/javascripts/discourse/app/pre-initializers/inject-discourse-objects.js at ac79c5efc61d259705eeb487ca21d0ec3c535807 · discourse/discourse · GitHub

    Ember si sta allontanando dalle iniezioni implicite. La via preferita è convertire il maggior numero possibile dei nostri oggetti in servizi e iniettarli esplicitamente dove sono necessari. Ovviamente, potrebbero esserci alcune cose in cui un servizio non è ideale. In quei casi, possiamo cercare quegli oggetti direttamente quando sono necessari così

    getOwner(this).lookup('thing:main')
    

    Un’altra opzione che abbiamo (a seconda delle implicazioni sulle prestazioni) è avvolgere le Classi Ember con la nostra Classe Discourse. Utilizzeremmo poi la nostra Classe in tutta l’app. Qualcosa come facciamo con la Classe GlimmerComponent
    discourse/app/assets/javascripts/discourse/app/components/glimmer.js at fa0c796baf9a7f64a3b27823b1aa4b370a74c3eb · discourse/discourse · GitHub. Questo renderebbe questo compito un size-l o anche size-m

    In ogni caso, questo cambiamento richiederà qualche riflessione.

Ember 3.25 → Ember 3.26 (Parte 5 - Octane)

Questo è lo sforzo finale dell’aggiornamento 3.25 → Ember 3.26. Avremo solo una deprecazione rimasta a questo punto, ma è una grossa.

  1. Edizione: Classic :link: - fino a: 4.0.0 - size-xl

    Prima di poter attivare la nostra versione su Octane, vorrei dedicare tempo a convertire le nostre Classi in Classi native e i nostri componenti in componenti Glimmer. Ci sarà un po’ di dolore coinvolto, ma ne vale la pena. Il ember-native-class-codemod dovrebbe alleviare parte di quel dolore. Dovremo vedere quanto ci porta avanti.

    Ci sono molte considerazioni e problemi di flusso di lavoro da tenere a mente. L’unica cosa che voglio sottolineare è che seguirà lo stesso flusso che ho menzionato per i template - correggere e testare 1 componente per PR.

Fase 4

L’aggiornamento Ember 3.26 → Ember 3.27 introduce dodici deprecazioni. Propongo di dividerle in tre parti. Faremo l’aumento di versione dopo che tutte le deprecazioni sono state gestite.

Ember 3.26 → Ember 3.27 (parte 1 - Generale)

  1. Riapertura della Super Classe del Componente Classic :link: - fino a: 4.0.0 - :heavy_check_mark:

  2. Plugin di compilazione del template basati su Classe :link: - fino a: 4.0.0 - :heavy_check_mark:

  3. Argomento LinkTo @disabled-when :link: - fino a: 4.0.0 - :heavy_check_mark:

    Non penso che utilizziamo nessuno di questi, quindi non c’è nulla da fare qui.

  1. Deprecazione di Route#disconnectOutlet :link: - fino a: 4.0.0 - size-s

    Lo facciamo solo in un punto. È la build-category-route e dovrebbe essere diretto da correggere.

  2. Invocazione di Helper senza Argomenti e Parentesi in Posizioni di Argomento Nominati :link: - fino a: 4.0.0 - size-s

    Non penso che lo facciamo da nessuna parte, ma lo confermerò quando arriverà il momento. Essenzialmente, chiamare un helper senza passargli alcun argomento.

    Anche se utilizzassimo qualcosa del genere, dovremmo solo aggiungere parentesi. Quindi, questo

    <SomeComponent @arg={{someHelper}} />
    

    diventa

    <SomeComponent @arg={{(someHelper)}} />
    

    nota le parentesi intorno a someHelper

  3. Accesso con punto a run loop e computed :link: - fino a: 4.0.0 - size-m

    Utilizziamo . per accedere alle funzioni computed nel nostro addon decorators. Sembrano così, per esempio
    discourse/app/assets/javascripts/discourse-common/addon/utils/decorators.js at b05fddaa7ce3968ffc70cd8d4bf290e15d06eb11 · discourse/discourse · GitHub

    Abbiamo anche un caso isolato qua e là. Per quanto posso vedere, correggere quelli riguarda principalmente il correggere come li importiamo.

    Quindi, computed.filter dovrebbe essere importato così invece.

    import { filter } from '@ember/object/computed';
    

    La nostra versione dell’addon vendor esterno buffered-proxy utilizza . per accedere alle funzioni computed; dovremmo aggiornarlo.

    Utilizziamo anche . per accedere alle funzioni run in alcuni punti. Detto questo, si applica la stessa correzione. Dobbiamo aggiornare il modo in cui le importiamo. Penso che temi e plugin in particolare potrebbero avere diversi punti in cui lo facciamo con run.

  4. Deprecazione del Globale Ember :link: - fino a: 4.0.0 - (#size ?)

    Ember non sarà disponibile nel contesto globale dopo 4.0. È difficile stimare la quantità di lavoro/impatto qui senza un esame più approfondito. Detto questo, so che @cvx ha fatto un sacco di lavoro per eliminare questo pattern.

Ember 3.26 → Ember 3.27 (parte 2 - renderTemplate)

Questa parte si concentrerà solo su una deprecazione.

  1. Deprecazione di Route#renderTemplate :link: - fino a: 4.0.0 - size-l

    In sintesi, non possiamo utilizzare outlet nominati in Ember 4.0. Quindi, questo non funzionerà.

    {{outlet "thing"}}
    

    Utilizziamo renderTemplate in quasi 30 punti solo nel core. L’aggiornamento in sé sembra piuttosto diretto. Possiamo usare {{#in-element}} e un elemento HTML vuoto come segnaposto per quello che usavamo per rendere negli outlet nominati.

Ember 3.26 → Ember 3.27 (parte 3 - Componenti built-in legacy)

Questa parte si concentrerà sui componenti built-in legacy e gestirà quattro deprecazioni.

  1. Importazione di Componenti Built-in Legacy :link: - fino a: 4.0.0
  2. Argomenti Legacy dei Componenti Built-in :link: - fino a: 4.0.0
  3. Argomenti Attributo HTML Legacy dei Componenti Built-in :link: - fino a: 4.0.0
  4. Riapertura di Componenti Built-in Legacy :link: - fino a: 4.0.0

Non ho aggiunto dimensioni a questi perché… dipende davvero. Lasciate che spieghi.

I componenti built-in legacy come Checkbox, TextField, TextArea e LinkComponent verranno rimossi in Ember 4.0. Li utilizziamo in diversi punti e utilizziamo anche alcuni pattern deprecati su di essi.

Ember offre un percorso di aggiornamento che ci permette di continuare a usarli, ma dobbiamo importarli diversamente. Tuttavia, non riceveranno aggiornamenti da Ember e rimarranno congelati. Spero che possiamo fare a meno di tutti loro; tuttavia, questo potrebbe essere un po’ complesso. Questo cambiamento richiederà più discussione quando arriverà il momento.

Fase 5

Ember 3.27 → Ember 3.28

Questo è un size-s poiché è solo un aumento di versione. 3.28 è l’ultimo rilascio LTS nel ciclo di sviluppo 3.x. Non introduce nuove deprecazioni dopo 3.27 ed è una buona versione su cui fermarci per alcune settimane mentre le cose si stabilizzano.

L’LTS 3.28 è supportato fino ad agosto 2022 (sia correzioni di bug che patch di sicurezza)

Questa “pausa” ha alcuni vantaggi.

  1. Ci dà più tempo per vedere se sorgono problemi
  2. quando rilasciamo una versione stabile, dovrebbe essere sulla 3.28
  3. ci dà tempo per fare qualsiasi annuncio necessario riguardo a temi e plugin mantenuti autonomamente
  4. ci dà tempo per assicurarci che la transizione jQuery → no jQuery sia il più fluida possibile.

Fase 6

Dopo alcune settimane, possiamo finalmente aumentare la nostra versione a Ember 4

Ember 3.28 → Ember 4.1

Possiamo ora disattivare l’integrazione jQuery opzionale come ultima deprecazione del ciclo 3.x.

Questo aggiornamento introduce due deprecazioni minori.

  1. Deprecazione di Ember.assign :link: - fino a: 5.0.0 - size-s

    Non lo utilizziamo nel core, ma dovremo controllare temi/plugin. In ogni caso, è un semplice rinominamento.

  2. Classe AutoLocation :link: - fino a: 5.0.0 - size-s

    In teoria, dovremmo solo cambiare locationType: 'auto' in locationType: 'history' nel nostro file environment Ember e dovrebbe funzionare.

Flusso di lavoro

Come ho menzionato all’inizio, saremo molto attenti con questi aggiornamenti. Testeremo/correggeremo/fisseremo tutti i plugin/temi ufficiali con ogni aggiornamento e invieremo anche PR a plugin/temi non ufficiali popolari.

L’obiettivo qui non è rallentare lo sviluppo o creare mal di testa. Quindi, i PR dovrebbero essere strettamente delimitati, con un cambiamento per PR e nulla di troppo grande.

In un mondo ideale, tutti i cambiamenti accadrebbero in background senza interrompere il lavoro di qualcun altro. Questo è il motivo per cui pianeggiamo di mantenere i PR brevi e dolci. Inoltre, non siamo troppo fan di pattern misti. Quindi, non vogliamo rimanere bloccati in uno stato intermedio su base per file. Un componente è o classic o Glimmer, e un template utilizza o parentesi graffe o parentesi angolari, nulla in mezzo.

Spero che questa roadmap fosse chiara. Come ho menzionato all’inizio, questa è solo una panoramica generale di alto livello. Se qualcosa non è chiaro, errato o non ti convince, per favore faccelo sapere.

Core: Tutti sono stati :white_check_mark:

Plugin:

discourse-events

discourse-data-explorer


@Johani forse non è qualcosa che blocca direttamente Ember 4, ma i mixin potrebbero valere la pena di essere presi in considerazione anche nella roadmap:

Inoltre, alcune nuove classi del framework, come i componenti Glimmer, non supportano affatto i mixin di Ember. In futuro, i mixin verranno rimossi dal framework e non verranno sostituiti direttamente.

Abbiamo un’idea di quando le Liste Argomenti passeranno ai Componenti Glimmer e abbandoneranno i template raw?

Sperando provvisoriamente di arrivarci nei prossimi 3-6 mesi, ma non è scolpito nella pietra.

Al momento, l’obiettivo principale del nostro team “modernizzazione JS” è portare Discourse su Ember 4.x+ (3.28 è ora EOL).

Ciao @david,

Per tua informazione, quale sarebbe la tua raccomandazione dal punto di vista del theming? Stiamo valutando di sottoporre Discourse a un importante retheme (semplificazioni, renderlo più simile ai “social media”, meno focalizzato sugli sviluppatori, usare post con commenti invece di thread).

Dato l’entità delle modifiche previste sul front-end di Discourse nei prossimi 6 mesi, dovremmo potenzialmente aspettare prima di tentare di farlo?

Saluti,
Simon

Ciao Simon, è difficile dare una risposta definitiva qui data l’incertezza sulla tempistica.

In CDCK stiamo ancora sviluppando nuovi temi per i clienti rispetto alla versione esistente di core. Qualsiasi modifica importante (ad esempio, una riscrittura dell’elenco degli argomenti) sarà inizialmente facoltativa, quindi avrai tempo per adattare le cose.

In generale, avrai un percorso di migrazione più semplice se utilizzi API “raccomandate” come i plugin outlet ed eviti di sovrascrivere eventuali modelli.

Grazie @david, è utile.

Saluti,
Simon

Come gestiremo la modifica del modello dato il Glimmer di Octane e l’approccio “data-down, actions up”?

Abbiamo una sfida con le plugin outlets, dove in precedenza avevamo il two-way binding, ma se colleghiamo un Glimmer Component a un outlet, non abbiamo più questa opzione.

Il two-way binding tramite plugin outlets è un pattern consolidato, dove in alcuni casi vogliamo aggiornare il modello passato tramite la plugin outlet.

Ho notato questa raccomandazione nella documentazione di Ember:

In particolare:
“La seconda opzione è eseguire il ember-native-class-codemod per tutti i componenti rimanenti. Questo li trasformerà in componenti che importano da @ember/component, conservando tutte le stesse API dei componenti classici, ma semplicemente rappresentate in una sintassi Native Class.”

Qualsiasi pensiero qui è molto apprezzato.

La modifica del binding bidirezionale si riferisce al riassegnamento degli argomenti, ma è ancora possibile mutarli.

Ad esempio, questo non è consentito nei componenti Glimmer:

this.args.topic = blah

Ma questo tipo di operazione:

this.args.topic.title = "blah"

è ancora possibile.

Infatti, non credo che il riassegnamento degli argomenti sia attualmente possibile nei Plugin Outlet a causa del modo in cui utilizziamo un {{hash}} per passare gli argomenti. Quindi non mi aspetto cambiamenti su questo fronte. :crossed_fingers:

Molti temi/plugin ufficiali utilizzano già i componenti Glimmer come connettori per plugin outlet, e la documentazione attuale su meta descrive come farlo.

I componenti Glimmer offrono un’esperienza di sviluppo migliorata e prestazioni migliorate. Ma vale la pena notare che non c’è fretta immediata di convertire dai componenti classici ai componenti Glimmer. I componenti classici sono ancora supportati in Ember 5.

La cosa più importante al momento è risolvere eventuali messaggi di deprecazione nei temi/plugin. Pubblicheremo ulteriori informazioni sulle strategie di aggiornamento nelle prossime settimane/mesi, ma stiamo facendo buoni progressi nel preparare il core per l’aggiornamento. Esiste persino un ramo sperimentale Ember 5.3 di Discourse che stiamo eseguendo su un’istanza interna da alcune settimane con grande successo! :tada:

Oh! È molto interessante, grazie!

Comprensibilmente c’è molto margine di miglioramento e riconosco che è molto difficile stabilire una tempistica, ma ci sono stati progressi sulle liste di argomenti?

Ce n’est pas tout ! @cvx y travaille activement et il existe déjà un paramètre de site « Groupes de listes de sujets de scintillement expérimentaux » si vous souhaitez l’essayer.

Cependant, nous n’avons pas encore commencé à explorer l’aspect personnalisation de cela, veuillez donc ne pas essayer de créer de thèmes/plugins basés sur cela. Nous espérons travailler là-dessus dans les prochaines semaines.

Ottimo progresso!

Sì, mantenere le opzioni di personalizzazione il più aperte possibile sarebbe molto apprezzato.

Vediamo molte richieste per layout molto diversi per l’Elemento Elenco Argomenti rispetto a quello standard.

Ho notato i nuovi avvisi di deprecazione, ad esempio:

“Utilizza invece il trasformatore di valori topic-list-columns e le nuove API del plugin topic-list.”

Ci sarà una comunicazione a riguardo (forse me ne sono persa una? :thinking: )?

Sì, dovremmo avere la documentazione pronta la prossima settimana circa!

Non si tratta ancora di messaggi di deprecazione “propri” - li stiamo registrando usando console.debug invece di console.warn, quindi non sono nemmeno visibili nella configurazione predefinita di Chrome DevTools. (cc @cvx)

Ci siamo @merefield

Oh. Forse voglio saperne di più. Come fai a vederli? console.debug non fa infuriare i linter?

Penso che questo faccia parte della mia risposta:

Sì!

Il motivo per cui li abbiamo resi debug è che stavamo assicurandoci che tutto fosse pronto prima di aprire le paratie degli avvisi. È solo che @merefield è stato troppo osservatore e li ha trovati comunque :wink:

Ora che l’argomento è stato pubblicato, li aggiorneremo a normali deprecazioni imminente :fire:

Ma forse nel mio lavoro di sviluppo voglio usare console.debug invece di console.log. Come regola, le cose che sto facendo interessano solo a me.