<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Marcos Adriano - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Aprenda a codificar - de graça. Tutoriais de programação em Python, JavaScript, Linux e muito mais. ]]>
        </description>
        <link>https://www.freecodecamp.org/portuguese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Marcos Adriano - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 09 May 2026 13:42:13 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/author/marcos/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Como adicionar TypeScript a um projeto em JavaScript ]]>
                </title>
                <description>
                    <![CDATA[ Eu amo escrever código e quero ser bom nisso. Porém, por algum motivo, programar em JavaScript nunca foi o meu forte. Não importa o quanto eu praticava – os mesmos erros continuavam aparecendo em produção: exceções cannot read property <> of undefined, a famosa string [Object object] e, até mesmo, ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-adicionar-typescript-a-um-projeto-em-javascript/</link>
                <guid isPermaLink="false">6418fe61a2272ae7bb7fb766</guid>
                
                    <category>
                        <![CDATA[ TypeScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Marcos Adriano ]]>
                </dc:creator>
                <pubDate>Mon, 26 Jun 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/1_9XMpTyccrky0eW5Wz6DoWQ.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-add-typescript-to-a-javascript-project/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Add TypeScript to a JavaScript Project</a>
      </p><p>Eu amo escrever código e quero ser bom nisso. Porém, por algum motivo, programar em JavaScript nunca foi o meu forte.</p><p>Não importa o quanto eu praticava – os mesmos erros continuavam aparecendo em produção: exceções <code>cannot read property &lt;&gt; of undefined</code>, a famosa string <code>[Object object]</code> e, até mesmo, chamadas de funções com um número inválido de parâmetros.</p><p><br>Além do mais, a maioria das bases de código em que eu estava trabalhando tinham uma quantidade de JavaScript realmente grande. Então, aqui está um ótimo diagrama que explica como é estar no meu lugar:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/image-1.png" class="kg-image" alt="image-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/06/image-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/06/image-1.png 735w" sizes="(min-width: 720px) 720px" width="735" height="544" loading="lazy"></figure><p>Neste artigo, evitarei explicar por que o TypeScript é incrível (e ele é) e focarei nas tarefas que você precisa completar se você quiser migrar do JavaScript básico para um projeto que mistura TypeScript. </p><p>Até o final do artigo, você será uma pessoa feliz e será capaz de responder às seguintes perguntas:</p><ul><li>Como eu posso adicionar tipos ao meu projeto em JavaScript?</li><li>O que é TypeScript?</li><li>Como eu posso usar TypeScript em um projeto em JavaScript?</li><li>Quais são as etapas para converter uma aplicação do JavaScript para oferecer suporte a TypeScript?</li><li>Como eu posso cuidar do <em>build</em> e do empacotamento?</li><li>Como eu posso tomar conta do <em>lint</em>?</li><li>Como eu posso "vender" o TypeScript para minha organização e desenvolvedores?</li></ul><h2 id="como-eu-posso-adicionar-tipos-ao-meu-projeto-em-javascript"><strong>Como eu posso adicionar tipos ao meu projeto em JavaScript?</strong></h2><p>O JavaScript básico ainda não suporta tipos. Então, precisamos de algum tipo de abstração sobre o JavaScript para fazer isso.</p><p>Algumas abstrações comuns são usar o verificador de tipos estático <a href="https://github.com/facebook/flow" rel="noopener"><code>flow</code></a>, do Facebook, e a linguagem da Microsoft chamada: <a href="https://github.com/microsoft/TypeScript" rel="noopener"><code>TypeScript</code></a>.</p><p>Este artigo tratará do uso e da inclusão do TypeScript ao seu projeto em JavasScript.</p><h2 id="o-que-typescript"><strong>O que é Typescript?</strong></h2><p>TypeScript é um <em>superset</em> tipado do JavaScript, que é compilado para JavaScript puro.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/superset.png" class="kg-image" alt="superset" width="548" height="546" loading="lazy"><figcaption>Se você sabe JavaScript, já percorreu mais da metade do caminho</figcaption></figure><p>O Typescript consiste de algumas partes. A primeira é a linguagem em si — essa é uma nova linguagem que contém todas as features do JavaScript . </p><p>A segunda é o compilador do TypeScript, o <code>tsc</code>, que é o motor do sistema de tipos (do inglês, <em>type system engine</em>) que é um mecanismo de compilação que cria arquivos .ts e gera arquivos .js.</p><h2 id="hello-world-em-typescript"><strong>"Hello world" em TypeScript</strong></h2><p>Como exemplo, estes são os passos que você precisa para escrever sua primeira aplicação em TypeScript:</p><ol><li>instale o TypeScript com o comando <code>npm i typescript</code></li><li>crie uma pasta chamada <code>example</code> e entre nela com o comando <code>cd example</code></li><li>crie um arquivo chamado <code>hello.world.ts</code></li><li>escreva o código a seguir nele:</li></ol><figure class="kg-card kg-code-card"><pre><code class="language-typescript">const firstWords:string = "hello world"
console.info(firstWords);
</code></pre><figcaption>Hello world em TypeScript – Meu primeiro programa em TypeScript!</figcaption></figure><p>Em seguida, salve-o.</p><p>5. &nbsp;execute o comando <code>npx tsc hello.world.ts</code> &nbsp;para rodar o compilador do TypeScript no seu arquivo <code>hello.world.ts</code></p><p>6. &nbsp;perceba que você agora tem um arquivo <code>hello.world.js</code> que você pode executar :)</p><p>7. &nbsp;execute <code>node ./hello.world.js</code></p><h2 id="como-eu-posso-usar-typescript-em-um-projeto-em-javascript"><strong>Como eu posso usar TypeScript em um projeto em JavaScript?</strong></h2><p>Existem algumas estratégias para fazer essa "migração" (em termos de empresa e de código). Listei essas estratégias abaixo de acordo com seu "custo" e com o valor que elas fornecem.</p><p>Eu sugeriria começar com "suporte a TS na aplicação" e seguir em frente depois de provar o valor para sua equipe de desenvolvimento.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/typescript-migration-steps.png" class="kg-image" alt="typescript-migration-steps" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/06/typescript-migration-steps.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/06/typescript-migration-steps.png 960w" sizes="(min-width: 720px) 720px" width="960" height="540" loading="lazy"><figcaption>O processo de migração para o TypeScript. Faça todo o processo somente se provar o valor.</figcaption></figure><h3 id="a-abordagem-um-pequeno-passo-para-o-homem-adicionando-suporte-ao-ts-em-aplica-es-existentes"><strong>A abordagem "um pequeno passo para o homem" – adicionando suporte ao TS em aplicações existentes</strong></h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/small-step.jpeg" class="kg-image" alt="small-step" width="298" height="169" loading="lazy"><figcaption>Um pequeno passo para um desenvolvedor. Tipos são maravilhosos :)</figcaption></figure><p>Minha primeira sugestão é criar uma mistura das duas linguagens em um único projeto e, então, escrever todos os códigos "futuros" em TypeScript.</p><p>A combinação de duas linguagens em um único projeto soa muito ruim no começo, mas funciona muito bem já que o TS foi construído para uso gradual. A princípio, ele pode ser usado apenas como JS com arquivos <code>.ts</code> e linhas de importação estranhas.</p><p>Nessa estratégia, compilaremos os arquivos TypeScript migrados e apenas copiaremos os arquivos JavaScript para uma pasta de saída.</p><p>O grande benefício dessa abordagem é permitir uma curva de aprendizado gradual para a equipe de desenvolvimento (e para você) com a linguagem e seus recursos. Ela também oferece experiência prática e informações sobre seus prós e contras.</p><p>Eu recomendo começar a partir dessa etapa e, em seguida, seguir passo a passo com sua equipe antes de prosseguir. Para saber "como fazer isso" rapidamente, leia abaixo sobre <code>as etapas para converter uma aplicação em JavaScript para que tenha suporte ao TypeScript a parte</code></p><h3 id="a-abordagem-aberta-para-neg-cios-adicionando-suporte-ao-ts-para-bibliotecas-existentes">A abordagem aberta para negócios – adicionando suporte ao TS para bibliotecas existentes</h3><p>Depois de ter alguma experiência prática com o TS e de sua equipe de desenvolvimento concordar que vale a pena seguir em frente, sugiro converter suas bibliotecas e módulos internos para oferecer suporte a TS.</p><p>Isso pode ser feito de duas maneiras:</p><p><strong>A primeira maneira</strong> envolve usar <a href="https://www.typescriptlang.org/docs/handbook/declaration-files/templates/module-d-ts.html">arquivos de declaração</a> (texto em inglês). Uma simples adição de arquivos <code>d.ts</code> ajuda o compilador do TS a verificar o tipo de código em JavaScript existente e fornece suporte de preenchimento automático em seu IDE.</p><p>Essa é a opção "mais barata", pois não requer nenhuma alteração de código na biblioteca. Ela também oferece potência máxima e suporte a tipos em seu código futuro.</p><p><strong>A segunda maneira</strong> é realizar uma reescrita completa do TypeScript, o que pode ser demorado e sujeito a erros. Eu desaconselharia isso, a menos que se prove um retorno digno para sua equipe.</p><h3 id="o-esqueleto-um-passo-para-o-futuro"><strong>O "esqueleto" – um passo para o futuro</strong></h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/future.jpeg" class="kg-image" alt="future" width="236" height="214" loading="lazy"><figcaption>Um esqueleto de código em TypeScript é o caminho para garantir um futuro brilhante!</figcaption></figure><p>Presumo que a maioria dos desenvolvedores seja "preguiçosa" e, geralmente, inicie sua aplicação copiando de um código esqueleto (que geralmente contém registro, métricas, configuração e assim por diante).</p><p>Essa etapa ajuda você a navegar em seu caminho para um futuro brilhante, criando um esqueleto "oficial" para sua empresa. Será 100% TS e aposentará o antigo esqueleto em JS, se existir.</p><p>Esse <a href="https://github.com/microsoft/TypeScript-Node-Starter#getting-started">typescript-node-starter</a> é um bom primeiro projeto para começar.</p><h3 id="a-abordagem-de-apostar-tudo-convertendo-uma-base-de-c-digo-completa-de-js-para-ts"><strong>A abordagem de "apostar tudo" – convertendo uma base de código completa de JS para TS</strong></h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/allin.jpeg" class="kg-image" alt="allin" width="275" height="183" loading="lazy"><figcaption>Eu aposto tudo! Vamos colocar tipagem em tudo o que aparecer!</figcaption></figure><p>Essa opção requer uma reescrita total do código de JavaScript para TypeScript.‌<br><br>‌Eu recomendaria fazer isso como uma etapa final no processo de migração do TS, pois requer uma reescrita total da aplicação e profundo conhecimento do TypeScript e de seus recursos.</p><p>Você pode reescrever (é um processo longo) da seguinte maneira:</p><ol><li>Defina tipos claros para a lógica de negócios, APIs e HTTP de sua aplicação</li><li>Use pacotes <code>@types</code> para todas as bibliotecas em seu <code>package.json</code>. A maioria das bibliotecas suporta TS. Nesse processo, sugiro migrar um por um (apenas adicionando <code>@types/&lt;nome_do_pacote&gt;</code> no seu arquivo <code>package.json</code>).</li><li>Converta os componentes lógicos de sua aplicação em ordem de importância. Quanto mais exclusiva for a lógica de negócios, melhor.</li><li>Converta as partes de E/S de sua aplicação, camadas de banco de dados, filas e assim por diante.</li><li>Converta seus testes.</li></ol><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/image-3.png" class="kg-image" alt="image-3" width="296" height="170" loading="lazy"><figcaption>Usar tipos é motivo para festejar :)</figcaption></figure><p>Lembre-se de que existem ferramentas automatizadas projetadas para facilitar esse processo, como, por exemplo, a <a href="https://github.com/airbnb/ts-migrate">ts-migrate</a>, do time da Airbnb.</p><p>Ela aborda esse problema de uma perspectiva diferente e converte todos os arquivos em TypeScript. Ela também permite melhorias graduais (como mencionado nas etapas acima), enquanto toda a base de código é em TypeScript desde o primeiro dia.</p><h2 id="como-converter-uma-aplica-o-do-javascript-para-oferecer-suporte-a-typescript">Como converter uma aplicação do JavaScript para oferecer suporte a TypeScript</h2><h3 id="instale-o-typescript"><strong>Instale o TypeScript</strong></h3><p>executando : <code>npm install typescript</code>.</p><h3 id="arquivo-de-configura-o-do-typescript"><strong>Arquivo de configuração do Typescript </strong></h3><p>Adicione um arquivo de configuração do TypeScript, que pode ser criado usando o comando <code>npx tsc --init</code> no seu terminal.</p><p>Aqui está um exemplo de como nossa configuração inicial parecia:</p><pre><code class="language-json">{
 "compilerOptions": {
   "target": "esnext",
   "module": "commonjs",
   "allowJs": true,
   "checkJs": false,
   "outDir": "dist",
   "rootDir": ".",
   "strict": false,
   "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */,
   "forceConsistentCasingInFileNames": true, /* Disallow inconsistently-cased references to the same file. */
   "declaration": true, /* Generates corresponding '.d.ts' file. */
   "strictNullChecks": true,
   "resolveJsonModule": true,
   "sourceMap": true,
   "baseUrl": ".",
   "paths": {
    "*": [
      "*",
      "src/*",
      "src/setup/*",
      "src/logic/*",
      "src/models/*",
      "config/*"
    ]
  },
 },
  "exclude": ["node_modules", "dist"],
  "include": [
    "./src",
    "./test",
    "./*",
    "./config" 
  ]
}</code></pre><p>Algumas coisas para observar acima:</p><ul><li>Lemos todos os arquivos na pasta <code>src</code> ou <code>test</code> ou <code>config</code> &nbsp;(usando a opção <code>include</code>).</li><li>Aceitamos arquivos em JavaScript como entradas (usando a opção <code>allowJs</code>).</li><li>Colocamos todos os arquivos de saída na pasta <code>dist</code> (usando a opção <code>outDir</code>).</li></ul><h3 id="crie-seu-primeiro-arquivo-ts-no-projeto"><strong>Crie seu primeiro arquivo .TS no projeto</strong></h3><p>Eu recomendo começar adicionando um arquivo TypeScript simples (ou alterando um arquivo JS realmente simples para TS) e realizando o <em>deploy</em>. Faça essa migração um passo de cada vez.</p><h3 id="cuide-do-seu-arquivo-package-json"><strong>Cuide do seu arquivo package.json</strong></h3><p>Aqui está como era nosso <code>package.json</code> e como ficou depois:</p><figure class="kg-card kg-code-card"><pre><code class="language-json">{
  "scripts": {
    "start": "node ./application.js",
    "mocha": "mocha --recursive --reporter spec -r test/bootstrap.js",
    "test": "npm run mocha -- test/ -r test/integration/bootstrap.js", 
  }
}</code></pre><figcaption>Antes</figcaption></figure><figure class="kg-card kg-code-card"><pre><code class="language-json">{
  "scripts": {
    "start": "node ./dist/application.js",
    "build-dist": "./node_modules/typescript/bin/tsc",
    "mocha": "mocha --recursive --reporter spec -r ./dist/test/bootstrap.js",
    "test": "npm run mocha -- ./dist/test/ -r ./dist/test/integration/bootstrap.js"
  }
}</code></pre><figcaption>Depois</figcaption></figure><p>Como você pode ver, a maioria das mudanças foi relacionada a adicionar o prefixo <code>dist</code> à maioria dos nossos comandos de compilação. Também adicionamos um script <code>build-dist</code> que compila nossa base de código e move todos os arquivos para uma pasta dedicada chamada <code>dist</code>.<strong> </strong></p><p>Um dos grandes problemas ao adicionar TypeScript ao seu projeto é que você está adicionando uma camada indireta entre o código que você escreve e o código que realmente é executado na produção (já que o <code>.ts</code> é transpilado para <code>.js</code> em tempo de execução).</p><p>Por exemplo, imagine o seguinte programa em TypeScript:</p><pre><code class="language-typescript">const errorMessage: string = "this is bad"

throw new Error(a)</code></pre><p>Quando o executarmos, ele lançará o seguinte erro:</p><figure class="kg-card kg-code-card"><pre><code class="language-typescript">Error: this is bad
    at Object.&lt;anonymous&gt; (/Users/dorsev/work/git/example/hello.js:3:7)</code></pre><figcaption>Ué? Temos apenas 2 linhas em nosso código em TypeScript!</figcaption></figure><p>Isso é problemático, pois nossa base de código contém apenas arquivos <code>.ts</code>. Como a maioria dos códigos de produção contém centenas de linhas, será muito demorado traduzir esses números e arquivos corretamente.</p><p>Felizmente, para nós, existe uma solução para isso chamada <a href="https://www.npmjs.com/package/source-map-support">source-map-support</a>!</p><p>Isso nos permite garantir que os erros tenham nomes de arquivo <code>.ts</code> e números de linha adequados, como estamos acostumados. :)</p><p>Isso pode ser feito executando <code>npm install source-map-support</code> e adicionando a seguinte linha nas primeiras linhas da sua aplicação:</p><p><code>require('source-map-support').install();</code></p><p>O código agora se parece com isso:</p><figure class="kg-card kg-code-card"><pre><code class="language-typescript">require('source-map-support').install();
const a:string = "this is bad"
throw new Error(a)</code></pre><figcaption>hello.world.ts</figcaption></figure><p>Quando o compilamos, executamos <code>tsc --sourcemap hello.ts</code>. Agora, obtemos o seguinte erro, que é incrível! :)</p><pre><code class="language-victory">Error: this is bad
    at Object.&lt;anonymous&gt; (/Users/dorsev/work/git/example/hello.ts:3:7)</code></pre><p>Nas versões recentes do <code>nodejs</code>, isso é suportado nativamente usando a <a href="https://github.com/nodejs/node/pull/29564">flag</a> <code>--enable-source-maps</code>.</p><h2 id="como-cuidar-do-seu-build-travis-e-do-empacotamento"><strong>Como cuidar do seu <em>build </em>(Travis) e do empacotamento</strong></h2><p>Vamos apenas examinar as alterações antes e depois em nosso arquivo de <em>build</em>.</p><p>Nosso arquivo <code>.travis</code>, antes, estava assim (versão simplificada):</p><figure class="kg-card kg-code-card"><pre><code class="language-yaml">jobs:
  include:
  - &amp;build-and-publish
    before_script:
    - npm install --no-optional --production
    - npm prune --production
    before_deploy:
     - XZ_OPT=-0 tar --exclude=.git --exclude=reports.xml --exclude=${ARTIFACTS_MAIN_DIR}
       --exclude=.travis.yml --exclude=test -cJf "${ARTIFACTS_PATH}/${REPO_NAME}".tar.xz * .??*
  
  - &amp;test
    before_script:
     - npm install --no-optional
    script:
     - echo "Running tests"
     - npm run lint &amp;&amp; npm test</code></pre><figcaption>.travis antes do TypeScript</figcaption></figure><p>Foi assim que ele ficou depois:</p><figure class="kg-card kg-code-card"><pre><code class="language-yaml">jobs:
  include:
  - &amp;build-and-publish
    before_script:
    - npm install --no-optional --production
    - npm run build-dist  # Build dist folder
    - npm prune --production
    before_deploy:
     - cp -rf config/env-templates ./dist/config/
     - cp -rf node_modules ./dist/
     - cd dist
     - XZ_OPT=-0 tar --exclude=.git --exclude=reports.xml --exclude=${ARTIFACTS_MAIN_DIR} --exclude=.travis.yml --exclude=test -cJf "${REPO_NAME}.tar.xz" *
     - mv ${REPO_NAME}.tar.xz "../${ARTIFACTS_PATH}"
     - cd ..

  - &amp;test
    before_script:
     - npm install --no-optional
     - npm run build-dist
    script:
     - echo "Running tests"
     - npm run lint &amp;&amp; npm test</code></pre><figcaption>.travis depois do TypeScript</figcaption></figure><p>Observe que a maioria das alterações diz respeito ao "empacotamento" do arquivo &nbsp;<code>tar.xz</code> e à execução do comando <code>build-dist</code> antes de acessar a pasta <code>dist</code>.</p><h2 id="como-posso-cuidar-do-lint">Como posso cuidar do <em>lint</em><strong>?</strong></h2><p>Existem algumas soluções de <em>lint</em> disponíveis.</p><p>A primeira solução que usamos foi <a href="https://github.com/vvakame/typescript-formatter">tsfmt</a>  –  mas decidimos contra isso mais tarde porque exige que você mantenha duas configurações separadas para seu projeto (uma para TypeScript usando <code>tsfmt</code> e outra separada para JavaScript usando <code>eslint</code>). O projeto também parece descontinuado.</p><p>Então, encontramos o <a href="https://palantir.github.io/tslint/">TSLint</a> , que nos redirecionou para o <a href="https://github.com/typescript-eslint/typescript-eslint"><em>plug-in</em> slint para TypeScript</a>. Configuramos o TSLint da seguinte maneira:</p><p>Essa era o nosso <code>eslintrc.js</code>:</p><pre><code class="language-javascript">module.exports = {
    rules: {
        indent: [2, 2, {
            SwitchCase: 1
        }],
        'no-multi-spaces': 2,
        'no-trailing-spaces': 2,
        'space-before-blocks': 2,
    },
    overrides: [{
        files: ['**/*.ts'],
        parser: '@typescript-eslint/parser',
        plugins: ['@typescript-eslint'],
        extends: ['plugin:@typescript-eslint/eslint-recommended', 'plugin:@typescript-eslint/recommended']
    }]
}</code></pre><p>Configuramos o lint para rodar usando um comando <code>lint-fix</code> em nosso <code>package.json</code>, que se parece com o seguinte:</p><pre><code class="language-json">{
    "scripts": {
        "lint-fix": "node_modules/.bin/eslint . --fix"
    },
    "pre-commit": ["lint-fix"]
}</code></pre><h2 id="como-vender-o-typescript-para-seu-time-de-desenvolvedores"><strong>Como "vender" o TypeScript para seu time de desenvolvedores</strong></h2><p>Acredito que um dos aspectos mais críticos da introdução do TypeScript em sua organização é o "argumento" e como você o apresenta à sua equipe de desenvolvimento.</p><p>Aqui está a <a href="https://github.com/dorsev/typescript-talk/blob/master/typescript_meetup.md">apresentação</a> que fizemos internamente, que girava em torno dos seguintes temas:</p><ol><li>Explicar por que achamos o TypeScript incrível</li><li>O que é TypeScript</li><li>Alguns exemplos básicos de código. O ponto principal nesta parte não é "ensinar" 100% sobre o TypeScript, já que as pessoas farão isso por conta própria. Em vez disso, devemos dar às pessoas a sensação de que elas podem ler e escrever TypeScript e que a curva de aprendizado não é tão difícil.</li><li>Exemplos de código avançado, como Tipos de União (em inglês, <em>union types</em>) e tipos de dados algébricos (em inglês, <em>algebraic data types</em>) que agregam um grande valor a um desenvolvedor de JS. Este é um verdadeiro deleite, além da linguagem tipada e do compilador, que atrairão seus desenvolvedores.</li><li>Como começar a usá-lo: incentive as pessoas a baixar o IDE do <code>vscode</code> e a adicionar uma anotação (<a href="https://code.visualstudio.com/docs/nodejs/working-with-javascript#_type-checking-javascript">//@ts-check</a>) para que possam começar a ver a mágica! Na nossa empresa, preparamos com antecedência alguns erros muito legais que o <code>ts-check</code> detecta, e realizamos uma demonstração ao vivo (de 2 a 3 minutos) para mostrar a rapidez do compilador do TypeScript e como ele pode ajudar usando a documentação do JS com anotações de tipo ou o ts-check.</li><li>Aprofunde-se em alguns recursos: explique que os arquivos <code>ts.d</code> e <code>pacotes @types</code> são algumas das coisas que você encontrará bem cedo em suas bases de código em TypeScript.</li><li><em>Pull requests</em> ao vivo do seu trabalho. Mostramos o PR que criamos desde o início e incentivamos as pessoas a revisá-lo e experimentá-lo por si mesmos.</li><li>Compartilhe alguns recursos interessantes. Há muito conteúdo on-line e é difícil distinguir o bom do ruim. Faça uma pesquisa sólida para seus colegas de equipe e tente encontrar conteúdo de qualidade sobre as ferramentas que você usa e precisa. Role até a conclusão para conferir meus recursos.</li><li>Crie um <em>pull request</em> público . Eu recomendo tentar obter o máximo de apoio possível para sua aprovação.</li></ol><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/Screen-Shot-5780-10-20-at-10.09.59-AM.png" class="kg-image" alt="Screen-Shot-5780-10-20-at-10.09.59-AM" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/06/Screen-Shot-5780-10-20-at-10.09.59-AM.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/06/Screen-Shot-5780-10-20-at-10.09.59-AM.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/06/Screen-Shot-5780-10-20-at-10.09.59-AM.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w2400/2023/06/Screen-Shot-5780-10-20-at-10.09.59-AM.png 2400w" sizes="(min-width: 720px) 720px" width="2554" height="1052" loading="lazy"><figcaption>Adicionando TypeScript a um projeto! viva!</figcaption></figure><p>10. &nbsp;Crie um burburinho positivo em sua organização sobre a mudança!</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/Screen-Shot-5780-10-20-at-10.13.33-AM.png" class="kg-image" alt="Screen-Shot-5780-10-20-at-10.13.33-AM" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/06/Screen-Shot-5780-10-20-at-10.13.33-AM.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/06/Screen-Shot-5780-10-20-at-10.13.33-AM.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2023/06/Screen-Shot-5780-10-20-at-10.13.33-AM.png 1318w" sizes="(min-width: 720px) 720px" width="1318" height="454" loading="lazy"></figure><p>Eu recomendo ajustar essa lista de acordo com sua equipe, padrões e restrições de tempo.</p><h2 id="conclus-o"><strong>Conclusão</strong></h2><p><strong>O Typescript<strong> é </strong>mesmo<strong> </strong>incrível</strong>! Se você está escrevendo software de nível de produção e os requisitos de negócios e a disponibilidade são altos, eu o encorajo fortemente a experimentar o TypeScript.</p><p><strong>Apenas lembre-se de dar um passo de cada vez<strong>.</strong></strong> Novas linguagens e <em>frameworks</em> são difíceis. Assim, reserve um tempo para aprender e educar a si mesmo e sua equipe antes de levar esse processo adiante.</p><p><strong>Crie um ciclo curto de feedback e propostas de melhorias</strong>. É difícil "vender" uma nova linguagem para sua equipe e gerenciamento, pois leva tempo e recursos.</p><p>Portanto, crie seu processo de migração com ciclos de feedback curtos, tente definir indicadores de desempenho claros (menos <em>bugs </em>na produção, tempos de refatoração mais fáceis e assim por diante) e certifique-se de que a proposta de valor para o seu caso de uso seja constantemente justificada até que se torne o padrão de fato.</p><p><strong>Torne os recursos de aprendizado facilmente acessíveis</strong>. Gostei muito <a href="https://youtu.be/vxvQPHFJDRo"></a><a href="https://youtu.be/vxvQPHFJDRo">desta</a> apresentação sobre os primeiros passos do TypeScript (em inglês) e <a href="https://dylanvann.com/incrementally-migrating-to-typescript/">deste artigo</a> (também em inglês) sobre a migração incremental para o TypeScript.</p><p>Além disso, não perca os projetos <code><a href="https://github.com/denoland/deno">deno</a></code> e <code><a href="https://github.com/TypeStrong/ts-node">ts-node</a></code>. Particularmente, estou muito animado e ansioso para utilizar os dois em breve.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Truques simples em regex para iniciantes ]]>
                </title>
                <description>
                    <![CDATA[ Sempre quis aprender expressões regulares (regex), mas se desanimou com a complexidade? Neste artigo, eu vou mostrar para você 5 truques com regex fáceis de aprender que você pode começar a usar imediatamente no seu editor favorito. Configuração do editor de texto Embora quase todos os editores de texto suportem ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/truques-simples-em-regex-para-iniciantes/</link>
                <guid isPermaLink="false">646aa05cae2709063d5da801</guid>
                
                    <category>
                        <![CDATA[ Regex ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Marcos Adriano ]]>
                </dc:creator>
                <pubDate>Mon, 12 Jun 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_wUY_k-Q4q-z10Zo425qC5Q.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/simple-regex-tricks-for-beginners-3acb3fa257cb/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Simple RegEx tricks for beginners</a>
      </p><p>Sempre quis aprender expressões regulares (<em>regex</em>), mas se desanimou com a complexidade? Neste artigo, eu vou mostrar para você 5 truques com <em>regex </em>fáceis de aprender que você pode começar a usar imediatamente no seu editor favorito.</p><h3 id="configura-o-do-editor-de-texto"><strong>Configuração do editor de texto</strong></h3><p>Embora quase todos os editores de texto suportem expressões regulares, eu usarei o Visual Studio Code, mas você pode usar qualquer editor que você goste. Observe, também, que você geralmente precisa ativar a <em>regex</em> em algum lugar próximo ao campo de busca. Aqui está como fazer isso no VS Code:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/GjEq59Gj7Io7MWY4OuayOCmqZo0f5ezXyvOS.png" class="kg-image" alt="GjEq59Gj7Io7MWY4OuayOCmqZo0f5ezXyvOS" width="309" height="64" loading="lazy"><figcaption>Você precisa ativar as regex clicando nesta opção</figcaption></figure><h3 id="1-corresponde-a-qualquer-caractere"><strong>1) <code>.</code> — Corresponde a qualquer caractere</strong></h3><p>Vamos começar pelo básico. O símbolo <code>.</code> equivale a qualquer caractere:</p><pre><code>b.t</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/tMEDSKS2mHfOfqYTQP-elCZI5OnGUObC484v.png" class="kg-image" alt="tMEDSKS2mHfOfqYTQP-elCZI5OnGUObC484v" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/tMEDSKS2mHfOfqYTQP-elCZI5OnGUObC484v.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/tMEDSKS2mHfOfqYTQP-elCZI5OnGUObC484v.png 794w" sizes="(min-width: 720px) 720px" width="794" height="148" loading="lazy"></figure><p>A <em>regex </em>acima equivale a <code>"bot”</code>, <code>"bat”</code> e qualquer outra palavra de 3 caracteres que comece com <code>b</code> e termine com <code>t</code>. Se, no entanto, você quiser pesquisar pelo símbolo de ponto, precisará "escapar" o símbolo usando <code>\</code>. Então, essa <em>regex</em> corresponderá ao texto exato <code>"b.t"</code>:</p><pre><code>b\.t</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/anNgoajLGzpFhPWYRnVGlowi0bL4Z4xni59R.png" class="kg-image" alt="anNgoajLGzpFhPWYRnVGlowi0bL4Z4xni59R" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/anNgoajLGzpFhPWYRnVGlowi0bL4Z4xni59R.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/anNgoajLGzpFhPWYRnVGlowi0bL4Z4xni59R.png 631w" width="631" height="183" loading="lazy"></figure><h3 id="2-corresponde-a-qualquer-texto"><strong>2) .* — Corresponde a qualquer texto</strong></h3><p>Aqui, <code>.</code> significa <em>"qualquer caractere"</em> e <code>*</code> significa <em>"qualquer coisa antes desse símbolo repetida qualquer número de vezes"<em>.</em></em> Juntos, (<code>.*</code>) significam <em>"qualquer símbolo qualquer número de vezes" </em>e servem para encontrar correspondências começando ou terminando em algum texto. Vamos supor que temos um método do JavaScript com a seguinte assinatura:</p><pre><code>loadScript(scriptName: string, pathToFile: string)</code></pre><p>Queremos encontrar todas as chamadas desse método onde <code>pathToFile</code> aponta para qualquer arquivo na pasta <code>"lua"</code> . Você pode usar a seguinte expressão regular para isso:</p><pre><code>loadScript.*lua</code></pre><p>Isso significa, <em>"encontre todas as ocorrências de </em><code><em>"<em>loadScript</em>"</em></code><em><em> </em>seguidas por qualquer texto até a última ocorrência de<em> </em></em><code><em>"<em>lua</em>"</em></code><em>"</em></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/wCWC964KLZKxEHdW0fZlr4Z-X-vdcbYX-ogk.png" class="kg-image" alt="wCWC964KLZKxEHdW0fZlr4Z-X-vdcbYX-ogk" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/wCWC964KLZKxEHdW0fZlr4Z-X-vdcbYX-ogk.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/wCWC964KLZKxEHdW0fZlr4Z-X-vdcbYX-ogk.png 800w" sizes="(min-width: 720px) 720px" width="800" height="321" loading="lazy"><figcaption>loadScript.*lua: corresponde a qualquer texto começando com "loadScript" e terminado com "lua"</figcaption></figure><h3 id="3-correspond-ncia-n-o-gananciosa"><strong>3) ? — Correspondência não gananciosa</strong></h3><p>O <code>?</code> depois do <code>.*</code> e algumas outras sequências de regex significa "Faça a correspondência ao mínimo possível". Se você olhar na imagem anterior, você verá que o texto <code>"lua"</code> aparece duas vezes em cada correspondência e que tudo até o segundo <code>"lua"</code> foi considerado. Se, ao invés disso, você quiser corresponder a tudo até a primeira ocorrência de &nbsp;<code>"lua"</code>, terá que usar a seguinte <em>regex</em>:</p><pre><code>loadScript.*?lua</code></pre><p>Ela significa, <em>"Corresponda a tudo que começa com </em><code><em><em>"loadScript"</em></em></code><em><em> </em>seguido por qualquer coisa até a primeira ocorrência de<em> </em></em><code><em><em>"lua"</em></em></code><em><em>"</em></em></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/NnHX2yevennzK3Z9ddpq1NPBsbfWnyalfFrw.png" class="kg-image" alt="NnHX2yevennzK3Z9ddpq1NPBsbfWnyalfFrw" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/NnHX2yevennzK3Z9ddpq1NPBsbfWnyalfFrw.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/NnHX2yevennzK3Z9ddpq1NPBsbfWnyalfFrw.png 800w" sizes="(min-width: 720px) 720px" width="800" height="352" loading="lazy"><figcaption>loadScript.*?lua: corresponde a tudo começando com loadScript e até a primeira ocorrência de "lua"</figcaption></figure><h3 id="4-captura-grupos-e-refer-ncias-anteriores"><strong>4) ( ) $ — Captura grupos e referências anteriores</strong></h3><p>Ok. Agora, podemos encontrar alguns textos. Se quisermos, no entanto, mudar partes dos textos que encontramos? Geralmente, precisamos usar captura de grupos para isso.</p><p>Vamos supor que mudamos nosso método <code>loadScript</code> e agora, de repente, ele precisa de outro parâmetro inserido em seus outros dois parâmetros. Vamos chamar esse novo parâmetro de <code>id</code>. Então, a nova assinatura da função deve ficar assim: <code>loadScript(scriptName, id, pathToFile)</code>. Nós não podemos usar a substuição normal do editor de texto aqui, mas uma expressão regular é exatamente o que precisamos.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/hRdlYnNzYuX64kcVoXrvtH2RfwaY3FzNZedD.png" class="kg-image" alt="hRdlYnNzYuX64kcVoXrvtH2RfwaY3FzNZedD" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/hRdlYnNzYuX64kcVoXrvtH2RfwaY3FzNZedD.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/hRdlYnNzYuX64kcVoXrvtH2RfwaY3FzNZedD.png 800w" sizes="(min-width: 720px) 720px" width="800" height="365" loading="lazy"><figcaption>loadScript\(.*?,.*?\)</figcaption></figure><p>Você pode ver acima o resultado da execução da seguinte expressão regular:</p><pre><code>loadScript\(.*?,.*?\)</code></pre><p>Ela significa: <em>"corresponda a tudo que inicia com <em> <code>"loadScript("</code> </em>seguido de qualquer coisa até<em> </em>o primeiro símbolo <em><code>,</code>, </em>seguido por qualquer coisa até o primeiro<em> <code>)</code></em>"</em></p><p>As únicas coisas que podem parecer estranhas para você aqui são os símbolos <code>\</code>. Eles são usados para escapar os parênteses.</p><p>Precisamos escapar <code>(</code> e <code>)</code>, pois eles são caracteres especiais usados no regex para capturar partes dos textos que corresponderam. Porém, precisamos corresponder aos caracteres de parênteses.</p><p>Na <em>regex</em> anterior, definimos dois parâmetros de nossa chamada de método com os símbolos <code>.*?</code>. Vamos fazer cada um dos nossos parâmetros um <strong>grupo de<strong> </strong>captura </strong>separado, adicionando os símbolos<code>(</code> e <code>)</code> ao redor deles:</p><pre><code>loadScript\((.*?),(.*?)\)</code></pre><p>Se você executar essa <em>regex</em>, você verá que nada mudou. Isso é porque ela corresponde ao mesmo texto. Agora, contudo, podemos referenciar o primeiro argumento com <code>$1</code> e o segundo argumento com <code>$2</code>. Isso é chamado de <em>backreference</em> (em português, referência prévia), e nos ajudará com o que queremos: adicionar outro parâmetro no meio da chamada.</p><p>Input de busca:</p><pre><code>loadScript\((.*?),(.*?)\)</code></pre><p>Isso significa a mesma coisa que a <em>regex</em> anterior, mas mapeia os parâmetros para capturar os grupos 1 e 2, respectivamente.</p><p>Input de substituição:</p><pre><code>loadScript($1,id,$2)</code></pre><p>Isso significa <em>"substitua tudo que corresponda a<em> </em></em><code><em>"<em>loadScript(</em>"</em></code><em><em> </em></em>seguido pelo grupo de caracteres capturados 1<em><em>, </em></em><code><em>"<em>id</em></em></code><em><em>,</em> </em>grupo de caracteres capturados<em><em> 2 </em>e<em> </em></em><code><em><em>)</em></em></code><em>"<em>. </em></em>Observe que você não precisa escapar os parênteses no input de substituição.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/w27UNrc7N2hkWAO1DmU6p0gulIYiwU-oYjpT.png" class="kg-image" alt="w27UNrc7N2hkWAO1DmU6p0gulIYiwU-oYjpT" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/w27UNrc7N2hkWAO1DmU6p0gulIYiwU-oYjpT.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/w27UNrc7N2hkWAO1DmU6p0gulIYiwU-oYjpT.png 800w" sizes="(min-width: 720px) 720px" width="800" height="354" loading="lazy"><figcaption>Resultado da substituição</figcaption></figure><h3 id="5-classe-de-caracteres"><strong>5) [ ] — Classe de caracteres</strong></h3><p>Você pode listar caracteres que você quer corresponder a uma posição especifica colocando os símbolos <code>[</code> e <code>]</code> ao redor desses caracteres. Por exemplo, a classe <code>[0-9]</code> corresponde a todos os dígitos de 0 a 9. Você também pode listar os dígitos explicitamente: <code>[0123456789]</code> — o significado é o mesmo. Você pode usar o <code>-</code> com letras também. <code>[a-z]</code> vai corresponder a todos os caracteres minúsculos,<code>[A-Z]</code> corresponderá a todos os caracteres maiúsculos e <code>[a-zA-Z]</code> corresponderá a ambos.</p><p>Você também pode usar o <code>*</code> depois de uma classe de caracteres igual ao <code>.</code>, o que significa: <em>"corresponda a qualquer número de ocorrências dos caracteres dessa classe".</em></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/2aTqw0lDyht0cE1gqoF3O5eYcemyzhIBhSzU.png" class="kg-image" alt="2aTqw0lDyht0cE1gqoF3O5eYcemyzhIBhSzU" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/2aTqw0lDyht0cE1gqoF3O5eYcemyzhIBhSzU.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/2aTqw0lDyht0cE1gqoF3O5eYcemyzhIBhSzU.png 800w" sizes="(min-width: 720px) 720px" width="800" height="463" loading="lazy"><figcaption>expect.*to.equal\([0–9]*\): Corresponde apenas às linhas em que esperamos que a variável testada seja igual a um número</figcaption></figure><h3 id="conclus-o"><strong>Conclusão</strong></h3><p>Você precisa saber que existem vários tipos de <em>regex</em>. Esta que discutimos aqui é a <em>regex</em> da <em>engine</em> do JavaScript. A maioria das <em>engines </em>modernas é semelhante, mas pode haver algumas diferenças. Normalmente, essas diferenças incluem o caractere de escape e marcadores de refências prévias.</p><p>Eu encorajo você a abrir seu editor de texto e começar a usar alguns desses truques agora mesmo. Você verá que, agora, você consegue completar muitas tarefas de refatoração muito mais rapidamente do que antes. Quando se sentir confortável, <a href="https://www.regular-expressions.info/" rel="noopener">pode começar a pesquisar mais sobre expressões regulares</a> (texto em inglês).</p><p><strong>Obrigado pela leitura deste artigo até o final<strong>. </strong>Se achou o artigo útil, compartilhe-o<strong>. </strong>Futuramente, publicarei mais artigos sobre expressões regulares<strong>, </strong>J<strong>ava</strong>S<strong>cript </strong>e programação em geral<strong>.</strong></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como incorporar vídeo e áudio ao seu HTML ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: Abhishek Jakhar O HTML nos permite criar reprodutores de vídeo e áudio baseados em padrões que não requerem o uso de plug-ins. Adicionar vídeo e áudio a um site é quase sempre tão fácil quanto adicionar imagens ou formatar algum texto. Existem duas formas diferentes de incluir elementos ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-incorporar-video-e-audio-ao-seu-html/</link>
                <guid isPermaLink="false">63dd9247b42da706e17c41fb</guid>
                
                    <category>
                        <![CDATA[ Desenvolvimento para a Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Marcos Adriano ]]>
                </dc:creator>
                <pubDate>Sun, 16 Apr 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_jB3XGWVtrr8qOl21gCOAmQ.gif" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/video-audio-in-html-a-short-guide-69f721878b47/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to embed video and audio in your HTML</a>
      </p><p>Escrito por: Abhishek Jakhar</p><p>O HTML nos permite criar reprodutores de vídeo e áudio baseados em padrões que não requerem o uso de <em>plug-ins</em>. Adicionar vídeo e áudio a um site é quase sempre tão fácil quanto adicionar imagens ou formatar algum texto.</p><p>Existem duas formas diferentes de incluir elementos de vídeo. Discutiremos as duas abaixo.</p><h4 id="v-deo"><strong>Vídeo </strong></h4><p>A tag <code>&lt;video&gt;</code> nos permite inserir arquivos de vídeo no HTML, bem similar ao modo como imagens são inseridas.</p><p>Os atributos que podemos inserir são:</p><ul><li><code>src</code>: este atributo representa a fonte, que é muito semelhante ao atributo <code>src</code> usado no elemento de imagem. Adicionaremos o link para um arquivo de vídeo nesse atributo.</li><li><code>type</code>: este será video/mp4, pois .mp4 é o formato de vídeo que estamos usando. Também podemos usar diferente formatos de vídeo, como .ogg ou .webm. Nesse caso, o valor de <code>type</code> mudaria para video/ogg ou video/WebM, respectivamente.</li></ul><blockquote><strong><strong>Not</strong>a<strong>: </strong></strong>alguns formatos de vídeo comuns são WebM, Ogg, MP4.</blockquote><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_4epxHpB0Z94ZaNq64bL9WA.png" class="kg-image" alt="1_4epxHpB0Z94ZaNq64bL9WA" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/1_4epxHpB0Z94ZaNq64bL9WA.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_4epxHpB0Z94ZaNq64bL9WA.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>&lt;video&gt; na página</figcaption></figure><p>Agora, temos esse vídeo na nossa página, mas tem um problema. Esse vídeo não está sendo reproduzido automaticamente e também não há controles para iniciar o vídeo. Temos que adicioná-los manualmente usando o atributo <code>controls</code> na nossa tag de vídeo.</p><p>Esse atributo não possui nenhum valor, porque é um atributo booleano. Isso significa que ele só pode ser <code>true</code> ou <code>false</code>.</p><p>Ter o atributo <code>controls</code> na nossa tag de vídeo significa que o valor dele será <code>true</code> e exibirá os controles de reprodução.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_FKJojPyvDky1kM3gK5Z7KA.png" class="kg-image" alt="1_FKJojPyvDky1kM3gK5Z7KA" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/1_FKJojPyvDky1kM3gK5Z7KA.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_FKJojPyvDky1kM3gK5Z7KA.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>&lt;video&gt; com o atributo Controls</figcaption></figure><p>Se removermos o atributo <code>controls</code>, também podemos fazer o vídeo ser reproduzido automaticamente usando o atributo <code>autoplay</code>. Esse também é um atributo booleano.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_TOOc_dxlcW6q7Cr3AUbxJQ.gif" class="kg-image" alt="1_TOOc_dxlcW6q7Cr3AUbxJQ" width="600" height="400" loading="lazy"><figcaption>tag &lt;video&gt; com o atributo autoplay (mas sem o atributo controls)</figcaption></figure><p>Como você pode ver, o vídeo está iniciando sozinho e não há controle. É verdade que não precisamos pressionar <em>play</em> para iniciar o vídeo, mas também não podemos pará-lo.</p><p>Também podemos ter controles e reprodução automática juntos.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_jB3XGWVtrr8qOl21gCOAmQ-1.gif" class="kg-image" alt="1_jB3XGWVtrr8qOl21gCOAmQ-1" width="600" height="400" loading="lazy"><figcaption>tag &lt;video&gt; com reprodução automática e atributo controls</figcaption></figure><p>Você pode fornecer atributos diferentes para o elemento de vídeo, dependendo do requisito.</p><p>Eu mencionei acima que existem duas formas diferentes de adicionar a tag vídeo. Vamos testar a outra forma.</p><h4 id="tag-source"><strong>Tag source</strong></h4><p>Anteriormente, usamos um elemento de vídeo com tag de fechamento automático, mas, aqui, fecharemos a tag de vídeo. Agora, temos uma tag de abertura e de fechamento.</p><p>Nos também removeremos os atributos <code>type</code> e <code>source</code> da tag <code>video</code> e os colocaremos em outra tag.</p><pre><code>&lt;video&gt;  &lt;source src="http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4" type="video/mp4"&gt;&lt;/video&gt;</code></pre><p>Tudo o que fizemos foi mover os atributos para o elemento <code>source</code></p><p>Por que faríamos isso?</p><p>Bem, na maioria dos casos, com o vídeo, teremos várias fontes, já que precisamos fornecer diferentes tipos de arquivo, dependendo de qual navegador está visualizando seu vídeo, pois diferentes navegadores oferecem suporte a diferentes tipos de arquivo.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_pHYI6GbxxHUL5A_FDTdK1A.png" class="kg-image" alt="1_pHYI6GbxxHUL5A_FDTdK1A" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/1_pHYI6GbxxHUL5A_FDTdK1A.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_pHYI6GbxxHUL5A_FDTdK1A.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>O vídeo ficará exatamente igual. Agora, no entanto, temos um suporte mais amplo dos navegadores.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_P4pGSwzIVaFxWtT6tenhsA.png" class="kg-image" alt="1_P4pGSwzIVaFxWtT6tenhsA" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/1_P4pGSwzIVaFxWtT6tenhsA.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_P4pGSwzIVaFxWtT6tenhsA.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>Vídeo com suporte amplo de navegadores (sem atributos)</figcaption></figure><p>Se quisermos adicionar atributos como <code>controls</code>, <code>autoplay</code>, <code>loop</code> etc., adicionaremos a tag <code>&lt;video&gt;</code>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1_Ff1qRhcSQfqvHgcjbSrcsg.gif" class="kg-image" alt="1_Ff1qRhcSQfqvHgcjbSrcsg" width="600" height="400" loading="lazy"><figcaption>Vídeo com suporte mais amplo a navegadores e outros atributos</figcaption></figure><h4 id="elemento-de-udio"><strong>Elemento de áudio</strong></h4><p>A tag <code>&lt;audio&gt;</code> é bastante similar à tag <code>video</code>. Entretanto, a única principal diferença é que não há recursos visuais.</p><p>Podemos usar o elemento de áudio para iniciar um arquivo de vídeo na nossa página da web — como se fosse um arquivo mp3.</p><p>Agora, assim como a tag de vídeo, existem duas formas diferentes de se fazer isso.</p><ul><li>Usar uma tag única representando o elemento inteiro.</li><li>Abrir e fechar tags com um elemento filho no meio.</li></ul><p>Temos aqui uma tag de abertura e de fechamento. Então, adicionaremos o elemento <code>source</code> no meio.</p><p>A estrutura de pastas ficará assim:</p><pre><code>|-- project    |-- audio      |-- sample.mp3      |-- sample.ogg    |-- css      |-- main.css      |-- normalize.css    index.html
</code></pre><p>O atributo <code>controls</code> não existe na tag <code>&lt;audio&gt;</code> no exemplo acima. O elemento <code>&lt;audio&gt;</code> não aparecerá no documento HTML.</p><p>Você pode ver que existem apenas algumas diferenças importantes aqui. O valor no atributo <code>type</code> mudou de "video/mp4" para “audio/mp3”. No atributo <code>src</code>, nós mudamos de um arquivo de vídeo com a extensão .mp4 para um arquivo de áudio com a extensão .mp3.</p><p>Assim como o elemento de vídeo, não poderemos realmente parar ou iniciar o áudio sem controles. Portanto, adicionaremos o atributo <code>controls</code> ao elemento de áudio.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/1__d_AaBpz1QWH8csBB_-m8w.gif" class="kg-image" alt="1__d_AaBpz1QWH8csBB_-m8w" width="600" height="400" loading="lazy"><figcaption>Elemento de aúdio (&lt;audio&gt;&lt;/audio&gt;) com várias fontes para suporte mais amplo aos navegadores</figcaption></figure><p>Você também pode adicionar outros atributos à tag <code>&lt;audio&gt;</code> como <code>autoplay</code>, <code>loop</code>, etc.</p><p>Cobrimos aqui o essencial sobre os elementos <code>video</code> e <code>audio</code> no HTML.</p><p>Você pode ler mais sobre vídeo e áudio nos links abaixo:</p><ul><li><a href="https://developer.mozilla.org/pt-BR/docs/Web/HTML/Element/video">Documentação da web da MDN — Vídeo</a></li><li><a href="https://developer.mozilla.org/pt-BR/docs/Web/HTML/Element/audio">Documentação da web da MDN — Áudio</a></li></ul><p>Espero que você tenha achado este artigo informativo e útil. Obrigado pela leitura!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ React.js para iniciantes — props e state explicados ]]>
                </title>
                <description>
                    <![CDATA[ O React.js é uma das bibliotecas do JavaScript mais utilizadas, que todo desenvolvedor de front-end deveria conhecer. Entender o que são props e state e qual a diferença entre eles é um grande passo para se aprender React. Neste artigo, explicarei o que são props e state. Esclarecerei, também, algumas ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/react-js-para-iniciantes-props-e-state-explicados/</link>
                <guid isPermaLink="false">63dc1c27b42da706e17c3c74</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Marcos Adriano ]]>
                </dc:creator>
                <pubDate>Sun, 19 Mar 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/03/Ekran-Resmi-2019-11-18-18.08.13.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/react-js-for-beginners-props-state-explained/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">React.js for Beginners — Props and State Explained</a>
      </p><p>O React.js é uma das bibliotecas do JavaScript mais utilizadas, que todo desenvolvedor de <em>front-end</em> deveria conhecer. Entender o que são <em>props </em>e <em>state </em>e qual a diferença entre eles é um grande passo para se aprender React.</p><p>Neste artigo, explicarei o que são <em>props </em>e <em>state.</em> Esclarecerei, também, algumas das perguntas mais frequentes sobre eles:</p><ul><li>O que são <em>props</em>?</li><li>Como passar dados com <em>props</em>?</li><li>O que é <em>state</em>?</li><li>Como atualizar o <em>state</em> de um componente?</li><li>O que acontece quando o <em>state</em> muda?</li><li>Eu posso usar <em>state </em>em todos os componentes?</li><li>Quais são as diferenças entre <em>props </em>e <em>state</em>?</li></ul><blockquote>Se você é um completo iniciante em React, eu tenho uma série de tutoriais (em inglês) sobre <a href="https://www.youtube.com/watch?v=nvhwG0Yk1AM&amp;list=PLaz1hMFq311wfHYvJbcDpbms36jKpzFk9">React para iniciantes.</a></blockquote><h2 id="o-que-s-o-props"><strong>O que são <em>props</em>?</strong></h2><p><em>Props</em> é uma forma reduzida de dizer propriedades. Elas são usadas para passar dados entre componentes. O fluxo de dados do React entre componentes é unidirecional (somente do componente pai para o componente filho).</p><h3 id="como-passar-dados-com-props"><strong>Como passar dados com <em>props</em>?</strong></h3><p>Aqui está um exemplo de como dados podem ser passados usando <em>props</em>:</p><pre><code class="language-javascript">class ComponentePai extends Component {    
    render() {    
        return (        
            &lt;ComponenteFilho nome="Primeiro filho" /&gt;    
        );  
    }
}

const ComponenteFilho = (props) =&gt; {    
    return &lt;p&gt;{props.nome}&lt;/p&gt;; 
};</code></pre><p>Primeiramente, precisamos definir alguns dados do componente pai e atribui-los ao atributo <code>props</code> de um componente filho.</p><pre><code class="language-javascript">&lt;ComponenteFilho nome="Primeiro filho" /&gt;
</code></pre><p>"nome" é a <em>prop </em>definida aqui e contém dados de texto. Então, podemos passar dados com <em>props</em> como se estivéssemos passando um argumento para uma função:</p><pre><code class="language-javascript">const ComponenteFilho = (props) =&gt; {  
  // seu código
};</code></pre><p>Por fim, usamos a notação de ponto para acessar o dado da <em>prop </em>e renderizá-lo:</p><pre><code class="language-javascript">return &lt;p&gt;{props.nome}&lt;/p&gt;;</code></pre><p><strong>Você também pode assistir meu vídeo (em inglês) para ver como usar props<strong>:</strong></strong></p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.17977528089888%;" class="fluid-width-video-wrapper">
            <iframe width="356" height="200" src="https://www.youtube.com/embed/KvapOdsFK5A?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" title="REACT JS PROPS - What is Props in React and How to Pass Data with Props?" name="fitvid0"></iframe>
          </div>
        </div>
      </figure><h2 id="o-que-state"><strong>O que é state?</strong></h2><p>O React possui outro objeto interno especial chamado <em>state </em>(em português, estado), que permite que componentes criem e gerenciem seus próprios dados. Então diferente das <em>props</em>, componentes não podem passar dados com <em>state</em>, mas podem criá-los e gerenciá-los internamente.</p><p>Aqui está um exemplo de como usar <em>state</em>:</p><pre><code class="language-javascript">class Test extends React.Component {    
    constructor() {    
        this.state = {      
            id: 1,      
            nome: "test"    
        };  
    }    
    
    render() {    
        return (      
            &lt;div&gt;        
              &lt;p&gt;{this.state.id}&lt;/p&gt;        
              &lt;p&gt;{this.state.nome}&lt;/p&gt;      
            &lt;/div&gt;    
        );  
    }
}</code></pre><h3 id="como-atualizar-o-state-de-um-componente"><strong>Como atualizar o <em>state </em>de um componente?</strong></h3><p> O <em>state </em>não deve ser modificado diretamente, mas pode ser modificado com um método especial chamadao <code>setState()</code>.</p><pre><code class="language-javascript">this.state.id = "2023"; // errado

this.setState({         // certo  
    id: "2023"
});</code></pre><h3 id="o-que-acontece-quando-o-state-muda"><strong>O que acontece quando o <em>state </em>muda?</strong></h3><p>Por que temos que usar o <code>setState()</code>? Por que precisamos do objeto <em>state</em>? Se você está se perguntando isso, não se preocupe – você entenderá em breve o uso do state. 🙂 Vamos responder essas perguntas.</p><p>Uma mudança no <em>state </em>acontece baseada no <em>input </em>do usuário, acionando um evento ou assim por diante. Além disso, componentes do React (com <em>state</em>) são renderizados com base nos dados do <em>state</em>. Ele detém as informações iniciais.</p><p>Então, quando o <em>state</em> muda, o React é notificado imediatamente e atualiza o DOM – <strong>não todo o DOM<strong>, </strong>somente o DOM do componente com o <em>state </em>atualizado<strong>. </strong></strong>Essa é uma das razões pelas quais o React é tão rápido.</p><p>Como o React é notificado? Você adivinhou: com <code>setState()</code>. O método <code>setState()</code> aciona o processo de renderização para atualização das partes. O React é notificado, identifica qual parte alterar e faz isso rapidamente sem renderizar todo o DOM novamente.</p><p>Em resumo, há 2 pontos importantes que precisamos saber ao usarmos o <em>state</em>:</p><ul><li>O <em>state </em>não deve ser modificado diretamente – <code>setState()</code> deve ser usado para isso</li><li>O uso do <em>state </em>afeta o desempenho da sua aplicação. Portanto, não deve ser usado desnecessariamente.</li></ul><h3 id="posso-usar-state-em-todos-os-componentes"><strong>Posso usar <em>state </em>em todos os componentes?</strong></h3><p>Outra coisa que você pode estar se perguntando sobre o uso do <em>state </em>é onde exatamente podemos usá-lo. No início, <em>states </em>só podiam ser usados em <strong>componentes de classe</strong>, não em componentes funcionais.</p><p>Esse é o motivo pelo qual componentes funcionais também eram conhecidos como <em>stateless components</em> (em português, componentes sem estado). Entretanto, depois da introdução dos <strong><strong>React Hooks</strong></strong>, os <em>states </em>podem ser usados agora em componentes de classe e funcionais.</p><p>Se o seu projeto não está usando <em>React Hooks</em>, você só pode usar <em>state </em>em componentes de classe.</p><h3 id="qual-a-diferen-a-entre-props-e-state"><strong>Qual a diferença entre <em>props </em>e <em>state</em>?</strong></h3><p>Vamos recapitular e ver as principais diferenças entre <em>props </em>e <em>state</em>:</p><ul><li>Componentes recebem dados de fora com <em>props</em>, podendo criar e gerenciar seus próprios dados com <em>state</em></li><li><em>Props </em>são usadas ​​para passar dados, enquanto <em>state </em>serve para gerenciar dados</li><li>Dados de <em>props </em>são somente leitura e não podem ser modificados por um componente que os está recebendo de fora</li><li>Os dados de <em>state </em>podem ser modificados por seu próprio componente, mas são privados (não podem ser acessados ​​de fora)</li><li><em>Props </em>só podem ser passadas do componente pai para o filho (fluxo unidirecional)</li><li>A modificação do <em>state </em>deve acontecer com o uso do método <code>setState ()</code> </li></ul><p>Espero que este artigo tenha ajudado você a entender <em>props </em>e <em>state</em>. Existem outras coisas importantes para se ver sobre React, Eu continuarei escrevendo sobre elas nos meus próximos artigos.</p><p><strong>Se você quer aprender mais sobre desenvolvimento para a web<strong>, </strong>sinta-se à vontade para <a href="https://www.youtube.com/channel/UC1EgYPCvKCXFn8HlpoJwY3Q">seguir o autor no YouTube</a>!</strong></p><p>Obrigado pela leitura!</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
