Atualizando o Discourse para Ember 4

Queremos atualizar a versão do Ember usada no Discourse.

No momento, estamos na versão 3.15, e gostaríamos de chegar à 4.1.

Definimos como meta concluir esse trabalho até o final deste ano. Por favor, note que este tópico é um roteiro (roadmap), e todos os planos e estimativas são provisórios. Este tópico não tem a intenção de abrigar discussões significativas sobre upgrades ou mudanças específicas. Então, vamos manter a conversa aqui um pouco focada. Perguntas sobre como essas atualizações afetarão seu site/plugin/tema estão fora do assunto. As mudanças planejadas são 100% no front-end (app Ember).

Vamos ser muito cuidadosos com as mudanças que introduzirmos. Todos os plugins/temas oficiais serão atualizados (incluindo qualquer trabalho personalizado que a CDCK tenha feito para seus clientes). Também enviaremos PRs para atualizar todos os plugins/temas não oficiais populares.

Não se preocupe se você tiver um plugin/tema personalizado que construiu para seu site. Adicionaremos avisos de depreciação e faremos os anúncios necessários em tempo hábil para lhe dar tempo suficiente para fazer as mudanças necessárias. Também tentaremos guiá-lo por essas mudanças, se necessário.

Vamos começar com as metas. Obviamente, queremos chegar à versão mais alta disponível, mas precisamos definir metas intermediárias entre agora e nosso destino final.

Planejamos fazer atualizações incrementais. Em vez de uma grande atualização para a 4.1, vamos dividir esse trabalho em seis etapas. Cada etapa foca em uma atualização do Ember.

Etapa Tamanho Atualizações
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 - Geral)
Ember 3.25 → Ember 3.26 (Parte 2 - Templates)
Ember 3.25 → Ember 3.26 (Parte 3 - jQuery)
Ember 3.25 → Ember 3.26 (Parte 4 - Preparação para Octane)
Ember 3.25 → Ember 3.26 (Parte 5 - Octane)
4 size-l Ember 3.26 → Ember 3.27 (Parte 1 - Geral)
Ember 3.26 → Ember 3.27 (Parte 2 - RenderTemplate)
Ember 3.26 → Ember 3.27 (Parte 3 - Componentes embutidos legados)
5 size-s Ember 3.27 → Ember 3.28
6 size-s Ember 3.28 → Ember 4.1

A escolha dessas versões específicas é baseada inteiramente nas depreciações e na quantidade de trabalho que elas introduzem - e no risco implícito.

Então, vamos detalhar ainda mais para maior clareza.

Depreciações por atualização

Etapa 1 (size-l)

Ember 3.15 → Ember 3.16

Esta atualização introduz apenas uma depreciação.

  1. Use o resolver do ember-CLI em vez do resolver global legado :link: - até: 4.0.0 - size-l

    O Discourse tem seu próprio resolver personalizado que atualmente estende Ember.DefaultResolver.

    A correção recomendada é eliminar qualquer resolver personalizado e usar o resolver do Ember-CLI. É mais fácil dizer do que fazer, pois temos bastante lógica personalizada para lidar com plugins e temas.

    Um compromisso que funciona é estender o resolver do Ember-CLI em vez de estender Ember.DefaultResolver.

Etapa 2 (size-m)

Ember 3.16 → Ember 3.25

Esta atualização introduz oito depreciações.

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

  2. Sem “for” - depreciação embutida do Ember :link: até: 4.0.0 - :heavy_check_mark:

  3. Sem “since” - depreciação embutida do Ember :link: até: 4.0.0 - :heavy_check_mark:

  4. tryInvoke de @ember/utils :link: até: 4.0.0 - :heavy_check_mark:

  5. APIs de Destruição de Meta :link: - até: 3.25.0 - :heavy_check_mark:

    Não usamos nenhuma dessas, então não há nada a fazer aqui.

  1. Use getter do Ember e verifique explicitamente por undefined :link: - até: 4.0.0 - size-s

    Esta é uma depreciação simples. Precisamos apenas remover getWithDefault em nossa base de código, e há apenas alguns lugares onde o usamos.

  2. Extensões de protótipo de String :link: - até: 4.0.0 - size-m

    Esta também é uma troca simples e de baixo risco, mas usamos o protótipo de string estendido do Ember em vários lugares. Por uma verificação rápida, acho que temos cerca de < 100 lugares onde fazemos isso entre o núcleo e plugins/temas. Depois de atualizarmos isso, também devemos impedir que o Ember estenda esse protótipo com algo como isso.

    EXTEND_PROTOTYPES: {
       String: false
    }
    

    em nosso arquivo environment.

  3. Importando htmlSafe e isHTMLSafe de @ember/string :link: - até: 4.0.0 - size-m

    Há muita sobreposição entre isso e #7 nesta atualização, e deve ser direto e de baixo risco.

Etapa 3 (size-xl)

A atualização de 3.25 para 3.26 é bastante complexa. É aqui que fazemos a maior parte do “atraso acumulado”. Há dezesseis depreciações no total. Vamos dividir esta atualização em cinco partes - onde apenas faremos um aumento de versão depois que todas as depreciações forem tratadas.

Ember 3.25 → Ember 3.26 (Parte 1 - Geral)

Esta parte lida com nove depreciações que são relativamente mais fáceis de lidar.

  1. Observadores de Array :link: - até: 4.0.0 - :heavy_check_mark:

  2. Capacidades do Gerenciador de Componentes :link: - até: 4.0.0 - :heavy_check_mark:

  3. Capacidades do Gerenciador de Modificadores :link: - até: 4.0.0 - :heavy_check_mark:

  4. Recursos Opcionais: application-template-wrapper :link: - até: 4.0.0 - :heavy_check_mark:

  5. classBinding e classNameBindings como args em templates :link: - até: 4.0.0 - :heavy_check_mark:

    Nada a fazer aqui; não usamos essas.

  1. Métodos de transição de rotas e controladores :link: - até: 5.0.0 - size-m

    Esta depreciação remove alguns métodos de routes e controllers. Pode parecer uma mudança complexa, mas deve ser direta. Precisaremos apenas injetar o Router como um serviço e chamá-lo daí - quando necessário. A parte complicada é que usamos isso em muitos lugares, e todos precisam ser atualizados.

  2. Política de Suporte a Navegadores :link: - até: 4.0.0 - size-s

    ~~Esta deve ser uma mudança relativamente simples. O Ember não suportará IE11 a partir da 4.0. A boa notícia aqui é que não o suportamos há muito tempo de qualquer maneira. A única coisa que precisamos mudar é parar de transpilar para IE11 em produção.
    discourse/app/assets/javascripts/discourse/config/targets.js at 1472e47aae5bfdfb6fd9abfe89beb186c751f514 · discourse/discourse · GitHub

    Fiz alguns testes básicos, e esta mudança nos economizará cerca de 60kb (gzip) ou ~6% de nossos bundles principais e de vendor em instalações Ember-CLI de produção.

  3. {{hasBlock}} e {{hasBlockParams}} :link: - até: 4.0.0 - size-s

    Usamos isso em alguns lugares. Esta é uma renomeação simples e de baixo risco.

  4. Helper {{with}} :link: - até: 4.0.0 - size-s

    Raramente usamos isso, mas ainda precisa ser corrigido. Precisamos apenas substituí-los e usar {{let}} ou uma combinação de {{if}} / {{else}}

Ember 3.25 → Ember 3.26 (Parte 2 - Templates)

Esta parte focará principalmente em depreciações envolvendo templates .hbs. Há três depreciações nas quais precisamos nos concentrar aqui.

  1. Procura de Fallback de Propriedade :link: - até: 4.0.0 - size-l

    A partir do Ember 4.0, isso não funcionará mais.

    Olá, {{name}}!
    

    Se tivermos uma propriedade em um template, precisamos procurá-la com um this precedendo, assim:

    Olá, {{this.name}}!
    

    Precisaremos fazer isso com todos os nossos templates. Há maneiras de reduzir a dor aqui. Podemos tentar o ember-no-implicit-this-codemod e ver até onde nos leva.

    Sou a favor de limitar as mudanças a 1 arquivo por PR. Isso facilita a revisão - e a reversão se algo der errado.

  2. Acessando args nomeados via {{attrs}} :link: - até: 4.0.0 size-xl

    O objeto {{attrs}} será removido no Ember 4.0. A mudança em si é muito direta, e o exemplo do Ember é bastante bom.

    Antes:

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

    Depois:

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

    Precisaremos fazer isso para todos os nossos templates. Podemos combinar esta mudança com a conversão dos templates para a sintaxe de colchetes angulares. Sou um grande fã de colchetes angulares porque estão muito mais próximos da sintaxe padrão de componentes web personalizados.

    Uma coisa que pode acelerar nosso progresso aqui é o ember-angle-brackets-codemod. Precisaremos experimentar com ele e ver até onde nos leva. Ele lida com a depreciação e nos dá a brilhante sintaxe de colchetes angulares.

    Similar ao #1 nesta parte, também sou a favor de corrigir e testar um template por PR.

  3. Argumentos posicionais <LinkTo> :link: - até: 4.0.0 - size-m

    Esta também é uma depreciação que visa reduzir a confusão. Há alguns lugares onde usamos argumentos posicionais no link-to. Podemos corrigir isso assim:

    Antes:

    {{link-to "Sobre Nós" "about"}}
    {{#link-to "about"}}Sobre Nós{{/link-to}}
    {{#link-to "post" @post}}Leia {{@post.title}}...{{/link-to}}
    

    Depois (com colchetes angulares):

     <LinkTo @route="about">Sobre Nós</LinkTo>
     <LinkTo @route="about">Sobre Nós</LinkTo>
     <LinkTo @route="post" @model={{@post}}>Leia {{@post.title}}...</LinkTo>
    

Ember 3.25 → Ember 3.26 (Parte 3 - jQuery)

Não há muito o que eu possa dizer sobre isso que você já não saiba. Novos apps Ember não usam jQuery, e ele será removido no Ember 4.0.

Nesta parte, focaremos em uma depreciação.

  1. Recurso Opcional: jquery-integration :link: - até: 4.0.0 - size-xl

    Nos últimos anos, fizemos um progresso enorme na redução do uso de jQuery. Ainda há lugares onde precisamos dele, particularmente no compositor e como dependência de algumas bibliotecas de vendor que usamos. Não quero entrar em detalhes sobre esta mudança aqui. Em resumo, devemos nos afastar do uso de jQuery.

    No entanto, gostaria de destacar que, mesmo que nos livremos do jQuery EM TODO LUGAR, ainda devemos manter essa opção definida como true até estarmos prontos para o Ember 4.0. Precisamos de um plano para facilitar a transição para sites com temas/plugins personalizados que não controlamos. Em outras palavras, vamos fazer o trabalho, mas viver com o aviso de depreciação sobre desligar a opção.

Ember 3.25 → Ember 3.26 (Parte 4 - Preparação para Octane)

Nesta parte, devemos focar em preparar nossos arquivos para o Octane. Lidaremos com duas depreciações.

  1. Recurso Opcional: template-only-glimmer-components :link: - até: 4.0.0 - size-m

    Esta é uma mudança simples em teoria, mas há trabalho implícito que precisamos fazer antes de podermos alternar essa opção.

    Precisamos garantir que nossos componentes atuais apenas de template funcionem com a semântica glimmer. Fiz alguns testes, e nossos testes falharam com essa opção ativada. Aqui está uma lista de exemplo de alguns componentes apenas de template que temos no núcleo:

    - 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
    

    Também precisaremos verificar nossos templates de Admin/tema/plugin e garantir que tudo funcione antes de lançar essa opção.

    De primeira vista, não tenho certeza de como nossos templates .hbr brutos se encaixarão nisso. No entanto, @david tem trabalhado em listas de tópicos baseadas em glimmer. Então, talvez possamos nos livrar dos templates brutos completamente.

  2. Injeções Implícitas :link: - até: 4.0.0 size-xl

    Usamos injeções implícitas em todo lugar. Fazemos isso em um inicializador assim:
    discourse/app/assets/javascripts/discourse/app/pre-initializers/inject-discourse-objects.js at ac79c5efc61d259705eeb487ca21d0ec3c535807 · discourse/discourse · GitHub

    O Ember está se afastando das injeções implícitas. O caminho preferido é converter a maioria de nossos objetos em serviços e injetá-los explicitamente onde forem necessários. Claro, pode haver algumas coisas onde um serviço não é ideal. Nesses casos, podemos procurar esses objetos diretamente quando forem necessários, assim:

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

    Outra opção que temos (dependendo das implicações de desempenho) é envolver as Classes Ember com nossa própria Classe Discourse. Usaríamos então nossa Classe em todo o app. Algo como fazemos com a Classe GlimmerComponent
    discourse/app/assets/javascripts/discourse/app/components/glimmer.js at fa0c796baf9a7f64a3b27823b1aa4b370a74c3eb · discourse/discourse · GitHub. Isso tornaria esta tarefa um size-l ou até size-m

    Em qualquer caso, esta mudança precisará de alguma reflexão.

Ember 3.25 → Ember 3.26 (Parte 5 - Octane)

Esta é a reta final da atualização de 3.25 → Ember 3.26. Teremos apenas uma depreciação restante neste ponto, mas é uma grande.

  1. Edição: Classic :link: - até: 4.0.0 - size-xl

    Antes de alternar nossa versão para Octane, gostaria de gastar tempo convertendo nossas Classes para Classes nativas e nossos componentes para componentes Glimmer. Haverá alguma dor envolvida, mas vale a pena. O ember-native-class-codemod deve aliviar parte dessa dor. Precisaremos ver até onde nos leva.

    Há muitas considerações e problemas de fluxo de trabalho a serem lembrados. A única coisa que quero destacar é que seguirá o mesmo fluxo que mencionei para templates - corrigir e testar 1 componente por PR.

Etapa 4

A atualização de Ember 3.26 → Ember 3.27 introduz doze depreciações. Proponho que as dividamos em três partes. Faremos o aumento de versão depois que todas as depreciações forem tratadas.

Ember 3.26 → Ember 3.27 (parte 1 - Geral)

  1. Reabertura da Super Classe de Componente Clássico :link: - até: 4.0.0 - :heavy_check_mark:

  2. Plugins de compilação de template baseados em classe :link: - até: 4.0.0 - :heavy_check_mark:

  3. Argumento LinkTo @disabled-when :link: - até: 4.0.0 - :heavy_check_mark:

    Não acho que usemos nenhuma dessas, então não há nada a fazer aqui.

  1. Depreciar Route#disconnectOutlet :link: - até: 4.0.0 - size-s

    Só fazemos isso em um lugar. É o build-category-route, e deve ser direto corrigir.

  2. Invocar Helpers Sem Argumentos e Parênteses em Posições de Argumento Nomeado :link: - até: 4.0.0 - size-s

    Não acho que façamos isso em nenhum lugar, mas confirmarei quando chegar a hora. Essencialmente, chamar um helper sem passar nenhum argumento.

    Mesmo que usemos algo assim, precisaríamos apenas adicionar parênteses. Então, isso

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

    se torna

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

    note os parênteses ao redor de someHelper

  3. Acesso por ponto em Run loop e computed :link: - até: 4.0.0 - size-m

    Usamos . para acessar funções computed em nosso addon decorators. Eles se parecem com isso, por exemplo:
    discourse/app/assets/javascripts/discourse-common/addon/utils/decorators.js at b05fddaa7ce3968ffc70cd8d4bf290e15d06eb11 · discourse/discourse · GitHub

    Também temos alguns isolados aqui e ali. Pelo que posso ver, corrigir isso é principalmente sobre corrigir como os importamos.

    Então, computed.filter deve ser importado assim, em vez disso.

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

    Nossa versão do addon externo de vendor buffered-proxy usa . para acessar funções computed; precisaríamos atualizá-lo.

    Também usamos . para acessar funções run em alguns lugares. Dito isso, a mesma correção se aplica. Precisamos atualizar a maneira como os importamos. Acho que temas e plugins, em especial, podem ter vários lugares onde fazemos isso com run.

  4. Depreciar o Global Ember :link: - até: 4.0.0 - (#size ?)

    Ember não estará disponível no contexto global após a 4.0. É difícil estimar a quantidade de trabalho/impacto aqui sem uma análise mais profunda. Dito isso, sei que @cvx tem feito muito trabalho para se livrar desse padrão.

Ember 3.26 → Ember 3.27 (parte 2 - renderTemplate)

Esta parte focará apenas em uma depreciação.

  1. Depreciar Route#renderTemplate :link: - até: 4.0.0 - size-l

    Em resumo, não podemos usar outlets nomeados no Ember 4.0. Então, isso não funcionará.

    {{outlet "thing"}}
    

    Usamos renderTemplate em quase 30 lugares apenas no núcleo. A atualização em si parece bastante direta. Podemos usar {{#in-element}} e um elemento HTML vazio simples como placeholder para o que costumávamos renderizar em outlets nomeados.

Ember 3.26 → Ember 3.27 (parte 3 - Componentes embutidos legados)

Esta parte focará em componentes embutidos legados e lidará com quatro depreciações.

  1. Importando Componentes Embutidos Legados :link: - até: 4.0.0
  2. Argumentos Legados de Componentes Embutidos :link: - até: 4.0.0
  3. Argumentos de Atributo HTML Legados de Componentes Embutidos :link: - até: 4.0.0
  4. Reabertura de Componentes Embutidos Legados :link: - até: 4.0.0

Não adicionei tamanhos a esses porque… realmente depende. Deixe-me explicar.

Componentes embutidos legados como Checkbox, TextField, TextArea e LinkComponent serão removidos no Ember 4.0. Usamos-os em vários lugares, e também usamos alguns padrões depreciados neles.

O Ember oferece um caminho de atualização que nos permite continuar usando-os, mas precisamos importá-los de forma diferente. No entanto, eles não receberão atualizações do Ember e permanecerão congelados. Espero que possamos nos livrar de todos eles; no entanto, isso pode ser um pouco complexo. Esta mudança precisará de mais discussão quando chegar a hora.

Etapa 5

Ember 3.27 → Ember 3.28

Esta é uma size-s, pois é apenas um aumento de versão. 3.28 é a última versão LTS no ciclo de desenvolvimento 3.x. Não introduz novas depreciações após a 3.27, e é uma boa versão para pararmos por algumas semanas enquanto as coisas se estabilizam.

A LTS 3.28 é suportada até agosto de 2022 (correções de bugs e patches de segurança)

Esta “pausa” tem alguns benefícios.

  1. Nos dá mais tempo para ver se surgem problemas
  2. quando lançarmos uma versão estável, ela deve ser na 3.28
  3. nos dá tempo para fazer os anúncios necessários sobre temas e plugins mantidos pelo usuário
  4. nos dá tempo para garantir que a transição jQuery → sem jQuery seja o mais suave possível.

Etapa 6

Depois de algumas semanas, finalmente podemos aumentar nossa versão para Ember 4

Ember 3.28 → Ember 4.1

Agora podemos desativar a integração opcional do jQuery como a última depreciação do ciclo 3.x.

Esta atualização introduz duas depreciações menores.

  1. Depreciar Ember.assign :link: - até: 5.0.0 - size-s

    Não usamos isso no núcleo, mas precisaremos verificar temas/plugins. Em qualquer caso, é uma renomeação simples.

  2. Classe AutoLocation :link: - até: 5.0.0 - size-s

    Em teoria, precisaríamos apenas mudar locationType: 'auto' para locationType: 'history' em nosso arquivo de ambiente Ember, e deve funcionar.

Fluxo de Trabalho

Como mencionei no início, seremos muito cuidadosos com essas atualizações. Testaremos/corrigiremos/fixaremos todos os plugins/temas oficiais com cada atualização, e também enviaremos PRs para plugins/temas não oficiais populares.

O objetivo aqui não é desacelerar o desenvolvimento ou criar dores de cabeça. Então, os PRs serão estritamente delimitados, com uma mudança por PR e nada muito grande.

Em um mundo ideal, todas as mudanças aconteceriam em segundo plano sem interromper o trabalho de ninguém. É por isso que planejamos manter os PRs curtos e objetivos. Além disso, não gostamos muito de padrões mistos. Então, não queremos ficar presos em um estado intermediário em base de arquivo por arquivo. Um componente é ou clássico ou Glimmer, e um template usa chaves ou colchetes angulares, nada no meio.

Espero que este roteiro tenha sido claro. Como mencionei no início, esta é apenas uma visão geral geral de alto nível. Se algo estiver claro, incorreto ou não parecer certo para você, por favor, nos avise.

Core: Todos foram :white_check_mark:

Plugins:

discourse-events

discourse-data-explorer


@Johani talvez não seja algo que bloqueie diretamente o Ember 4, mas os mixins podem valer a pena considerar no roadmap também:

Além disso, algumas novas classes de framework, como os componentes Glimmer, não suportam mixins do Ember. No futuro, os mixins serão removidos do framework e não serão substituídos diretamente.

Temos uma ideia de quando as Listas de Tópicos migrarão para Glimmer Components e abandonarão os templates brutos?

Esperando conseguir chegar a isso nos próximos 3 a 6 meses, mas isso não está definido.

No momento, o foco principal de nossa equipe de “modernização de JS” é colocar o Discourse no Ember 4.x+ (o 3.28 já atingiu o fim de vida útil - EOL).

Olá @david,

Por curiosidade, qual seria sua recomendação em relação a temas? Estamos investigando a possibilidade de realizar uma grande reestruturação do tema do Discourse (simplificações, torná-lo mais parecido com “mídias sociais”, menos focado em desenvolvedores, usar posts com comentários em vez de threads).

Dada a quantidade de mudanças previstas no front-end do Discourse nos próximos 6 meses, devemos esperar antes de tentar fazer isso?

Abraços,
Simon

Olá Simon, é difícil dar uma resposta definitiva aqui dada a incerteza sobre o cronograma.

Na CDCK, ainda estamos desenvolvendo novos temas para clientes contra a versão existente do core. Quaisquer grandes alterações (por exemplo, uma reescrita da lista de tópicos) serão opcionais inicialmente, então você terá tempo para adaptar as coisas.

Em geral, você terá um caminho de migração mais fácil se usar APIs “recomendadas” como plugin outlets e evitar substituir quaisquer templates.

Obrigado @david, isso é útil.

Abraços,
Simon

Como vamos lidar com a modificação de modelos, dada a abordagem Glimmer do Octane e “dados para baixo, ações para cima”?

Temos um desafio com os plugin outlets, observo, onde anteriormente tínhamos o two-way binding, mas se anexarmos um Glimmer Component a um outlet, não teremos mais essa opção.

O two-way binding via plugin outlets é um padrão estabelecido, onde em alguns casos queremos atualizar o modelo passado via plugin outlet.

Notei esta recomendação na documentação do Ember:

Notavelmente:

“A segunda opção é que você pode executar o ember-native-class-codemod para todos os componentes restantes. Isso os transformará em componentes que importam de @ember/component, retendo todas as mesmas APIs que os componentes clássicos têm, mas apenas representados em uma sintaxe de Native Class.”

Quaisquer pensamentos aqui são muito bem-vindos.

A alteração de ligação bidirecional refere-se à re-atribuição de argumentos, mas você ainda pode mutá-los.

Por exemplo, isso não é permitido em componentes Glimmer:

this.args.topic = blah

Mas este tipo de coisa:

this.args.topic.title = "blah"

ainda é possível.

Na verdade, não acho que a re-atribuição de argumentos seja atualmente possível em Plugin Outlets devido à forma como usamos um {{hash}} para passar os argumentos. Portanto, não espero nenhuma mudança nessa frente. :crossed_fingers:

Muitos temas/plugins oficiais já estão usando componentes Glimmer como conectores de plugin outlet, e a documentação atual no meta descreve como fazer isso.

Os componentes Glimmer proporcionam uma experiência de desenvolvedor aprimorada e melhor desempenho. Mas vale a pena notar que não há pressa imediata para converter de componentes clássicos para componentes Glimmer. Componentes clássicos ainda são suportados no Ember 5.

A coisa mais importante no momento é resolver quaisquer mensagens de depreciação em temas/plugins. Publicaremos mais sobre estratégias de atualização nas próximas semanas/meses, mas estamos progredindo bem em preparar o core para a atualização. Existe até um Ember 5.3 experimental branch do Discourse que estamos executando em uma instância interna nas últimas semanas com grande sucesso! :tada:

Ah! Isso é muito interessante, obrigado!

Compreensivelmente, há muito escopo na atualização e reconheço que é muito difícil dar um prazo para tudo isso, mas já houve algum avanço nas Listas de Tópicos?

Sim, com certeza! O @cvx está trabalhando ativamente nisso, e já existe uma configuração no site “experimental glimmer topic list groups” se você quiser experimentar.

No entanto, ainda não começamos a explorar o aspecto de personalização disso, então, por favor, não tente criar nenhum tema/plugin com base nisso. Esperamos trabalhar nisso nas próximas semanas.

Excelente progresso!

Sim, manter as opções de personalização o mais abertas possível seria muito apreciado.

Vemos muitas solicitações para layouts muito diferentes para o Item da Lista de Tópicos em relação ao que é regular.

Notei os novos avisos de descontinuação, por exemplo:

“Use o transformador de valor topic-list-columns e outras novas APIs do plugin topic-list em vez disso.”

Haverá alguma comunicação sobre isso (talvez eu tenha perdido alguma? :thinking: )?

Sim, teremos a documentação disponível na próxima semana ou mais!

Ainda não são mensagens de descontinuação ‘adequadas’ - estamos registrando-as usando console.debug em vez de console.warn, então elas nem são visíveis na configuração padrão do Chrome DevTools. (cc @cvx)

Vamos lá @merefield

OOh. Talvez eu queira saber sobre isso. Como você os vê? O console.debug não deixa os linters infelizes?

Eu acho que isso faz parte da minha resposta:

Sim!

O motivo pelo qual os tornamos debug foi para garantir que tudo estivesse pronto antes de abrir as comportamentais de avisos. É que o @merefield foi muito observador e os encontrou de qualquer maneira :wink:

Agora que o tópico foi publicado, atualizaremos para depreciações normais iminentemente :fire:

Mas talvez no meu próprio trabalho de desenvolvimento eu queira usar console.debug em vez de console.log. Como regra, as coisas que estou fazendo, só eu me importo.