Construa
Portar a partir de React
Leve uma interface React existente para o NoWayOS: meça-a com o relatório de cobertura do Screen Compiler, veja o que é convertido como está escrito, o que mudar e o que passa para a sua aplicação, e leia cada erro que ele pode dar.
Você não começa do zero. A maior parte de uma tela React é convertida como está escrita: o layout, os textos, os botões e campos, as condições e listas, os seus próprios componentes pequenos. O resto é uma reescrita curta ou um trabalho que passa para a sua aplicação, e é lá que ele deve ficar num computador com uma só tarefa.
Meça primeiro
Antes de mudar uma linha, pergunte ao Screen Compiler até onde o seu código já chega. Clone a sua aplicação ao lado dos dois repositórios de Telas a partir de React, para que o contêiner de desenvolvimento a veja, e rode o relatório de cobertura sobre o código-fonte:
cd nowayos-work # holds nowayos and screen-compiler
git clone https://example.com/your-app.git my-app
cd screen-compiler
make run ARGS="audit ../my-app/src"
O relatório lê cada arquivo .tsx dessa pasta e conta cada construção que encontra: elementos, props, propriedades de estilo, hooks, listas, condições, operadores e imports. Cada uma recebe um veredito:
- no subconjunto: é convertida, onde é usada como o subconjunto permite;
- no caminho: ainda não é convertida, e o relatório nomeia o passo que vai convertê-la;
- fora por projeto: nunca será convertida, e o relatório diz por quê;
- desconhecida: o Screen Compiler não a reconhece. O desconhecido nunca conta como convertido.
Depois vêm os passos do caminho, com quantas vezes cada um é necessário, e cada arquivo com o seu resultado. Um arquivo "é convertido" só se o check o aceitar, então o número no topo é o verdadeiro. O relatório nomeia construções e nunca cita o seu código, então você pode compartilhá-lo com segurança. Como o próprio compilador, rode-o só em código em que você confia.
O que corresponde a quê
| No React DOM | No subconjunto |
|---|---|
Um <div> com layout flexbox |
<Column> ou <Row>, com gap, padding e um style declarado |
<h1>, <p>, <span>, <label> |
<Text> num papel: title, heading, body, label, caption ou display |
<button onClick={…}> |
<Button onClick={props.onSave}>: uma prop de callback vira uma ação |
<input>, uma caixa de seleção, botões de opção, <select> |
<TextInput>, <Checkbox>, <RadioGroup>, <Select>, cada um com um id pelo qual a aplicação lê e define o valor |
{ready && <X/>}, ? :, !ready, step === "review" |
grupos e chaves que a aplicação define |
items.map(…) |
linhas: uma lista que o arquivo contém, ou a lista de uma prop limitada a um máximo, props.items.slice(0, 5) |
Hello, {name}! |
palavras literais compiladas em volta de um slot que a aplicação preenche |
| Os seus próprios componentes e fragmentos, no arquivo da tela ou em um ao lado dele | expandidos em tempo de build, como se a tela fosse escrita de forma plana |
style={{ padding: "16px" }}, color: "var(--text-muted)" |
as propriedades de estilo declaradas, comprimentos em unidades de layout, cores do tema |
As tabelas de Telas a partir de React mostram exatamente o que cada componente aceita. Elas vêm das próprias tabelas do Screen Compiler, então não podem se afastar do que ele aceita.
O que passa para a sua aplicação
Não há JavaScript no dispositivo. Uma tela é uma árvore fixa que a sua aplicação controla por ações, campos, slots, grupos e chaves numerados. Por isso algumas coisas ficam de fora por projeto, cada uma por um motivo:
- Estado e hooks (
useState,useEffect, contexto). A aplicação guarda o estado e define o que uma tela mostra. value,checkedeonChangede um campo. A aplicação lê e define um campo pelo seuid.- Props espalhadas (spread). O que contêm só se sabe quando o código roda.
- Estilos calculados, valores de cor e folhas de estilo globais. Um estilo é estático, as cores são as do tema, para que o tema de letra grande possa trocar as cores de cada tela e o contraste seja verificado, e não há cascata.
- Animação.
- Uma lista sem máximo. Limite-a,
.slice(0, 5), para que a tela saiba quantas linhas pode mostrar. - Comparações além de uma prop
===uma string, eifouswitchna função de uma tela. Calcule a resposta na aplicação e passe-a como prop. - Componentes de pacotes e arquivos fora da pasta da tela. Uma tela lê apenas a própria pasta e o que há dentro dela: coloque os seus componentes ao lado dela,
./parts/header. - Um handler que faz mais do que chamar uma prop.
onClick={() => props.onSave()}é convertido; o resto é trabalho da aplicação.
O que o caminho traz a seguir
O relatório de cobertura nomeia estes passos previstos quando o seu código precisa deles:
- mais layout CSS: crescimento flex,
alignSelf, alturas mínima e máxima, padding em cada lado e margens; - elementos HTML comuns, cada um por uma regra fixa;
- módulos CSS, uma classe por elemento;
- camadas: elementos sobrepostos;
- imagens e entrada mascarada.
Até um passo chegar, as suas construções são recusadas em vez de adivinhadas. Cada passo mantém a mesma regra: exato, ou nada.
Ler um erro
Um erro dá o arquivo, a linha e a coluna, um código, o que está errado e uma linha de ajuda:
web-search.tsx:16:28: error[unknown-name]: `query` is not a prop of the component
help: text from the application must be a prop: take it as one, function Screen({ query }) { … }
Com qualquer erro, nada é escrito. Os códigos:
| Código | O que significa | O que fazer |
|---|---|---|
syntax |
O arquivo não é TSX válido, ou quebra uma regra que todo módulo segue. | Corrija o código na posição indicada. |
unsupported |
Uma construção fora do subconjunto. | Siga a ajuda: reescreva-a no subconjunto, ou passe o trabalho para a aplicação. |
unknown-element |
Um elemento que não é do kit, ou não foi importado. | Importe-o de "nowayos:kit", ou use o elemento do kit. |
unknown-prop |
Uma prop ou propriedade de estilo que o elemento não aceita. | Use uma das que as tabelas listam para ele. |
invalid-value |
Uma prop que o elemento aceita, com um valor que ele não aceita. | Dê um valor do tipo que as tabelas listam. |
missing-prop |
Falta uma prop de que o elemento precisa. | Dê-a: as tabelas mostram essas em negrito. |
invalid-children |
Um elemento contém o que não pode, como dois filhos em <Screen> ou texto numa <Column>. |
Agrupe-os, ou coloque o texto num <Text>. |
unknown-name |
Um nome que não é uma prop, um design token nem um import. | Receba-o como prop, ou declare-o. |
duplicate-name |
Duas coisas ganhariam o mesmo nome no código gerado, como isReady e is_ready. |
Renomeie uma. |
reserved-name |
Um nome que o Rust ou o código gerado reservam, como type. |
Renomeie-o. |
limit |
Um limite de tamanho, profundidade ou quantidade foi ultrapassado. | Encurte, ou divida em componentes. |
no-screen |
O arquivo não tem componente de tela: uma função que retorna <Screen>. |
Exporte um. |
internal |
Uma falha do próprio Screen Compiler. | Informe-a, com a entrada que a causou. |
Se uma construção de que você precisa está no caminho e ainda não foi construída, avise, com o relatório: ele mostra quais passos importam mais.