Dor e lágrimas em Svelte 3

Em vez do prefácio


O artigo será útil para aqueles que, assim como decidimos experimentar o Svelte em um projeto ao vivo. Nossa pequena empresa recebeu um pedido para desenvolver um administrador da web para um serviço com back-end no Mongodb Stitch. Nos últimos dois anos, o front-end Nós escrevemos em React ou Vue (dependendo do tamanho do projeto e se o ReactNative é necessário), mas depois de ouvir sobre a beleza de Svelte, decidimos tentar entender por nós mesmos se é bom. E talvez devêssemos usá-lo em vez de Vue ou React?

Quem é Svelte?


imagem

Em poucas palavras - esse é o novo framework js (mas ele não se considera assim), que é o assassino de React e Vue, e blá, blá, blá ... No meu artigo, quero considerar Svelte não apenas o quão legal é "sob o capô", mas a partir do ponto visão da facilidade de uso em um projeto real.
Nós não fabricamos carros, nós os dirigimos e temos clientes maus com termos menos maus.

Tutorial


A primeira coisa que você começa a aprender sobre um novo idioma ou estrutura é um tutorial no site. No Svelte, este é Svelte.dev/Tutorial .

Infelizmente, parte dos tutoriais simplesmente não funciona no site na visualização, enquanto não está totalmente claro se funciona na realidade ou não. Você precisa gastar tempo e verificá-lo manualmente, porque não está claro se o tutorial está desatualizado ou se algo deu errado no site da Svelte. E isso realmente leva muito tempo.

Estilos e kit de interface do usuário


imagem

Encontrar um kit de interface do usuário para o Svelte foi uma dor à parte para todos nós. Eu queria exclamar: "Pelo menos Material, Bootstrap ... pelo menos alguma coisa ...".

Apenas sveltematerialui.com e svelteui.js.org foram encontrados, que no momento pareciam muito cru.

Com uma importação simples de <Button/> , ocorreu um erro no pacote durante a montagem, não houve tempo para resolver o erro do kit da interface do usuário.

Após analisar rapidamente a documentação, decidi abandoná-la em favor da importação de baunilha da CDN.

Eu queria usar a interface do usuário do material no projeto, pois é possível que o painel de administração também seja usado em um dispositivo móvel, e o material é muito adequado para isso (na minha opinião, parece ainda pior na área de trabalho).

O uso de JS sem um kit de interface do usuário me trouxe mentalmente de volta há 10 anos) (locomotivas de classe e nostalgia amável).

Devido ao fato de o Svelte trabalhar com o DOM "de uma maneira diferente", o MaterialUI começou a divulgar todo tipo de coisas desagradáveis ​​relacionadas à maneira como os componentes da interface do usuário que são adicionados via js ao dom são exibidos. Por exemplo, um simples controle giratório é exibido sempre:

imagem

Após uma longa pesquisa, o que deu errado, verificou-se que o botão giratório na UI do material é adicionado via JS após o documento estar pronto (onLoad), mas após esse evento, o Svelte inicia sua adição ao DOM e o script JS Material simplesmente não o vê desde o evento. antes.

Isso teve que ser tratado adicionando ao componente pai do Svelte:

  afterUpdate(() => { componentHandler.upgradeDom(); }); 

Estilização


Com estilos, tudo fica muito claro, nós enfeitamos todos os estilos como no Vue. Você escreve o estilo e está tudo bem e, em seguida, escreve o componente da interface do usuário (já que não possui o UIKit), que deve usar parâmetros de adereços, por exemplo, largura e altura, e fazer logicamente da seguinte maneira:

 <script> export let width = '20px'; export let height = '20px'; </script> <style> .loader { width: { width }, height: { height }, } </style> 

E ... não, no estilo você não pode inserir variáveis. Você pode sair dessa situação através do “ReactWay” e criar estilos dinâmicos no “script” como variáveis ​​ou funções com retorno de estilo.

Como resultado, novamente temos mingau, parte do estilo na parte do estilo no script . O código puro será obtido apenas se você não tiver parâmetros nos estilos ou apenas parâmetros dinâmicos e eles estiverem apenas no script .

Roteamento e roteadores


Sem um roteador normal, você não pode nem criar um aplicativo de uma página.

Reaja, o Vue ao dimensionar o projeto 'Hello World' já vem com um roteador na caixa (ou você pode selecioná-lo). Mas como tudo no Svelte, isso não é fácil.

Você precisa escolher um roteador e até mesmo soluções muito semelhantes. Na verdade, existem apenas dois roteadores github.com/EmilTholin/svelte-routing e github.com/kazzkiq/svero até agora.

Ambos são muito parecidos, mas eu escolhi o primeiro, escolhi pelo número de estrelas (sim, eu sei, sou uma pessoa terrível).

Então, vamos começar a incorporá-lo em nossa MDL.

Coloque tudo em <Router url = "{url}"> e adicione <Link /> para os links da navegação.

imagem

Vá para a pré-visualização e veja o que aconteceu.

Mas as doenças da infância de Svelte continuam e as aulas não podem ser transferidas para <Link />. Uma pergunta razoável surgiu e como você a estilizará?

Aparentemente, isso ainda está em problemas para o roteador.

Felizmente, podemos vincular nosso a href = '' habitual ao roteador especificando use: link pelo qual agradecimentos especiais.

Erros


Ao contrário do React, que simplesmente não permite criar um pacote e grita fortemente sobre um erro, o Svelte coleta perfeitamente tudo com um erro. Ao mesmo tempo, se você esqueceu algo, instale o npm install ou exporte, tudo ficará bem e apenas mostrará uma tela branca (aliás, esse foi o caso nas primeiras versões do React).

No React e no Vue, costumávamos ver esses erros no estágio de compilação ou fiapos.

Como resultado, você terá que detectar erros em dois lugares. Para ser justo - isso ocorre no React e no Vue, mas com muito menos frequência e esses erros óbvios são detectados no estágio do fiapo.

Svelte só precisa de uma convenção de nomenclatura


Você encontrará esse problema com bastante frequência - com a ausência de uma convenção de nomenclatura.

Por exemplo, de volta ao roteador.

Existe essa importação:

     import { Router, link, Link ,Route } from "svelte-routing"; 

O que é esse link e link ? Mesmo em um projeto tão pequeno como o meu, já havia confusão com a falta de convenções de nomenclatura nos projetos usados ​​no Svelte.

Obviamente, deveria ter sido assim nos olhos do ReactMan:

 import { Router, useLink, LinkComponent ,RouteComponent } from "svelte-routing"; 

No Svelte, há uma semelhança com ref e no react, esta é uma referência a um elemento ou componente dom.
O tutorial oficial nos diz para fazer assim:

 <script> let dialog; </script> <dialog bind:this={dialog} class="mdl-dialog» /> 

E se você tiver 15 variáveis ​​no componente?

 <script> let loading; let pins; let dialog; let stitch; </script> <dialog bind:this={dialog} class="mdl-dialog» /> 

Onde e quais são realmente variáveis ​​e onde estão os links para componentes ou elementos?
Eu modificaria o tutorial e tornaria os exemplos mais corretos do ponto de vista dos iniciantes e de suas convenções de variáveis ​​(consulte o Tutorial do React para obter um bom exemplo). Se você deixar o vinagrete fazer variáveis, seria bom se o linter ou o bundler jurassem esse vinagrete, como por exemplo, isso foi feito pela golang.

 <script> let dialogElement; </script> <dialog bind:this={dialogElement} class="mdl-dialog» /> 

Outro exemplo de "vida" quando você recebe alguns dados na função de componente e esses dados devem ser enviados para a sua View , onde alguma variável é parafusada na parte do elemento da interface do usuário. E parece conosco (ou melhor, com nosso programador) assim:

  async function ReloadPins() {        loading =  true;        pins = await getAllPins();        status = 0;    } 

Quando abri seu código, imediatamente "ficou claro" para mim que há uma variável que estado e qual está anexado à nossa interface do usuário .

Brincadeirinha, é claro, nada está claro. Além disso, o estado nem é claro ou é apenas uma variável auxiliar. No React, isso é decidido por estado, o que de alguma forma traz clareza.

O que mudou onde e quem fez isso?


As variáveis ​​dentro do componente Svelte são globais e mudam em todos os lugares (olá Angular).
Mas há boas notícias, elas são globais em um componente (enquanto Angular), portanto, essa mudança de todos e de todos não é tão assustadora dentro de um componente.

Ao mesmo tempo, você economiza tempo com a "beleza" do código e não pensa no que precisa para tornar o estado uma variável, mas no que deixar dentro da função (oi React) - você tem tudo e em qualquer lugar.

imagem

Como resultado, você escreve componentes rapidamente, mas é muito difícil entender o que um júnior escreveu nesta “salada” alguns dias depois, quando ele próprio já se esqueceu (às vezes até o nome). Por causa disso, será impossível entender o que há dentro sem uma organização clara do código dentro do projeto ou equipe.

Bind Stitch


Stitch é uma coisa ótima, e definitivamente vou contar mais sobre isso e compará-lo com colegas, medir os testes em produção no meu próximo artigo e agora mais sobre Svelte.

Para usar o Stitch, você terá que seguir o caminho "Vanilla" e inserir:

 <script src="https://s3.amazonaws.com/stitch-sdks/js/bundles/4.4.0/stitch.js"></script> 

Como ao usar o npm e um pacote de importação normal, o problema com o erro do buffer começa.

Não sei se isso está relacionado ao coletor Svelte ou ao próprio Stitch, ou qualquer outra coisa, mas não tive tempo de escolher e só precisei adicionar um script com importação, após o qual tudo funcionou com êxito.

Estes são os principais problemas que encontramos ao trabalhar com o Svelte. E para ser honesto - em geral, nós não gostamos, e ninguém ...

Qual é o resultado:

Por que você precisa do Svelte?


  • Se você trabalha sozinho e precisa urgentemente fazer o MVP ou um pequeno painel de administração. Haverá problemas com um grande painel de administração, porque quando você escreve um novo código, esquece o antigo ou deve escrever um código auto-documentado, pois o Svelte não o "força" a fazer isso.
  • Se o tamanho do pacote for muito importante para você. Por exemplo, você está criando um aplicativo da web para um país em que ainda não há 3G ou a Internet é muito lenta e muito cara. Na maioria das partes do mundo, programadores caros, não a Internet, portanto, o tamanho do pacote dentro de limites razoáveis ​​não será um problema real em 99% dos casos.
  • Se você está apenas começando a aprender a escrever em JS e fazendo um front-end, o Svelte lhe dará toda a liberdade para “dar um tiro no pé”, em um vizinho da mesa ou organizar tiros em massa nas pernas. Na verdade, você não precisará aprender JSX ou entender as convenções de código por um longo tempo; poderá fazer imediatamente seu primeiro projeto de front-end e verificar se já conseguiu e que alguma coisa está funcionando.

Com base no último, eu realmente não entendo por que os mantenedores do Svelte farão o suporte ao TypeScript? Adoramos o Svelte apenas por “atirar nas pernas” e, na minha opinião, o TypeScript é como as pistas todo-o-terreno do carro esportivo Svelte. E você sabe, depois de trabalhar com o Svelte, percebi o quanto o JS mudou nos últimos anos e que não é mais o JS.

O Svelte oferece a oportunidade de trabalhar no mesmo JS antigo e de lâmpada, sem PropTypes, Flow e TypeScript.

Do que eu gostei?


  • Bem legível se / else, que não está no Vue. Eu realmente gostaria de ver algo semelhante no Vue.
  • Você pode criar seu evento em componentes e livrar-se de passar retornos de chamada para funções em filho, para comunicação entre filho> pai.

Por que não usar o Svelte?


  • Não existe um único kit de interface do usuário totalmente funcional. É difícil imaginar um aplicativo da Web sem o UIKit; apenas grandes projetos para os quais o Svelte não é adequado podem escrever o próprio Kit da UI. Transar com algo baunilha vai para a criação de seus próprios componentes de interface do usuário (seu Kit de interface do usuário) ou na luta contra erros e classes "locomotivas".
  • A natureza implícita de alguns erros simples e sua captura apenas no estágio de teste.
  • Se você for criar um aplicativo multiplataforma (e agora todo mundo estiver móvel primeiro), terá que reescrever tudo no ReactNative ou finalizar o NativeScript gerado com as mãos (existe um gerador NS da Svelte). Para ser justo, o Vue com desenvolvimento móvel também não está indo muito bem, mas também possui alguns recursos de trabalho.
  • Você precisará escrever uma convenção de código muito clara para seus desenvolvedores no projeto, pois o tutorial e os exemplos não foram feitos para o desenvolvimento da equipe.

Source: https://habr.com/ru/post/pt469361/


All Articles