{"id":148,"date":"2023-04-25T14:21:29","date_gmt":"2023-04-25T17:21:29","guid":{"rendered":"https:\/\/blog.tipscode.tech\/?p=148"},"modified":"2024-03-11T23:05:46","modified_gmt":"2024-03-11T23:05:46","slug":"o-que-ha-de-novo-na-versao-20-do-nodejs","status":"publish","type":"post","link":"https:\/\/alisson.jcsr.com.br\/v3\/2023\/04\/25\/o-que-ha-de-novo-na-versao-20-do-nodejs\/","title":{"rendered":"O que h\u00e1 de novo na vers\u00e3o 20 do NodeJS ??"},"content":{"rendered":"\n<p>A vers\u00e3o 20 do Nodejs foi lan\u00e7ada em 18 de abril de 2023. Ela aborda alguns problemas e cr\u00edticas j\u00e1 \u201cresolvidos\u201d por Deno e Bun, incluindo um novo modelo de permiss\u00e3o e um executor de testes nativo est\u00e1vel. Este artigo examina as novas op\u00e7\u00f5es dispon\u00edveis para desenvolvedores que usam o tempo de execu\u00e7\u00e3o JavaScript mais usado no mundo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">O cronograma de lan\u00e7amento do Node.js<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>As vers\u00f5es pares de abril (14, 16, 18, etc.) s\u00e3o est\u00e1veis \u200b\u200be recebem atualiza\u00e7\u00f5es de suporte de longo prazo (LTS) por tr\u00eas anos.<\/li>\n\n\n\n<li>Os lan\u00e7amentos \u00edmpares de outubro (15, 17, 19, etc.) s\u00e3o mais experimentais e as atualiza\u00e7\u00f5es geralmente terminam ap\u00f3s um ano.<\/li>\n<\/ul>\n\n\n\n<p>Em geral, voc\u00ea deve optar pela vers\u00e3o LTS de n\u00famero par, a menos que precise de um recurso espec\u00edfico em uma vers\u00e3o experimental e pretenda atualizar posteriormente. Dito isso, o Nodejs 20 \u00e9 novo e o site recomenda que voc\u00ea continue com a vers\u00e3o 18 enquanto a equipe de desenvolvimento corrige quaisquer problemas recentes.<\/p>\n\n\n\n<p>O Nodejs 20 tem os seguintes novos recursos\u2026<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Novo modelo de permiss\u00e3o<\/h3>\n\n\n\n<p>A execu\u00e7\u00e3o do n\u00f3 somescript.js n\u00e3o \u00e9 isenta de riscos. Um script pode fazer qualquer coisa: excluir arquivos essenciais, enviar dados privados para um servidor ou executar um minerador de criptomoeda em um processo filho. \u00c9 dif\u00edcil garantir que seu pr\u00f3prio c\u00f3digo n\u00e3o vai quebrar alguma coisa: voc\u00ea pode ter certeza de que todos os m\u00f3dulos e suas depend\u00eancias est\u00e3o seguros?<\/p>\n\n\n\n<p>O novo modelo de permiss\u00e3o Nodejs (experimental) restringe o que o script pode fazer. Para us\u00e1-lo, adicione o sinalizador <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">&#8211;experimental-permission<\/mark> \u00e0 linha de comando do Nodejs seguido por:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>&#8211;<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">-allow-fs-read<\/mark> para conceder acesso de leitura aos arquivos. Voc\u00ea pode limitar o acesso de leitura a:<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>diret\u00f3rios espec\u00edficos: <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">&#8211;allow-fs-read=\/tmp\/<\/mark><\/li>\n\n\n\n<li>arquivos espec\u00edficos: <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">&#8211;allow-fs-read=\/home\/me\/data.json<\/mark><\/li>\n\n\n\n<li>ou padr\u00f5es de arquivo curinga: <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">&#8211;allow-fs-read=\/home\/me\/*.json<\/mark><\/li>\n<\/ul>\n\n\n\n<p>   2. <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">&#8211;allow-fs-write<\/mark> para conceder acesso de grava\u00e7\u00e3o a arquivos com padr\u00f5es id\u00eanticos de diret\u00f3rio, arquivo ou curinga.<\/p>\n\n\n\n<p>  3. <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">&#8211;allow-child-process<\/mark> para permitir processos filhos, como a execu\u00e7\u00e3o de outros scripts, talvez escritos em outras linguagens.<\/p>\n\n\n\n<p>4. <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">&#8211;allow-worker <\/mark>para permitir threads de trabalho, que executam o c\u00f3digo Nodejs em paralelo ao thread de processamento principal.<\/p>\n\n\n\n<p>No exemplo a seguir, <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">somescript.js<\/mark> pode ler arquivos no diret\u00f3rio <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">\/home\/me\/data\/:<\/mark><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-black-color\">node --experimental-permission --allow-fs-read=\/home\/me\/data\/ somescript.js<\/mark><\/code><\/pre>\n\n\n\n<p>Qualquer tentativa de gravar um arquivo, executar outro processo ou iniciar um web worker gera um erro <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">ERR_ACCESS_DENIED<\/mark>.<\/p>\n\n\n\n<p>Voc\u00ea pode verificar as permiss\u00f5es em seu aplicativo usando o novo objeto process.permission. Por exemplo, veja como verificar se o script pode gravar arquivos:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><kbd>process.permission.has('fs.write');<\/kbd><\/code><\/pre>\n\n\n\n<p>Veja como verificar se o script pode gravar em um arquivo espec\u00edfico:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if ( !process.permission.has('fs.write', '\/home\/me\/mydata.json') ) {\n  console.error('Cannot write to file');\n}<\/code><\/pre>\n\n\n\n<p>O gerenciamento de permiss\u00e3o JavaScript foi introduzido pela primeira vez pelo Deno, que oferece controle refinado sobre o acesso a arquivos, vari\u00e1veis de ambiente, informa\u00e7\u00f5es do sistema operacional, medi\u00e7\u00e3o de tempo, rede, bibliotecas carregadas dinamicamente e processos filhos. Node.js \u00e9 inseguro por padr\u00e3o, a menos que voc\u00ea adicione o sinalizador &#8211;experimental-permission. Isso \u00e9 menos eficaz, mas garante que os scripts existentes continuem a ser executados sem modifica\u00e7\u00f5es.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/bit.ly\/2YivXeS\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/blog.tipscode.tech\/wp-content\/uploads\/2023\/04\/Curso-Full-Stack-turbo-da-Tipscode.png\" alt=\"Curso Full Stack turbo - fa\u00e7a sua inscri\u00e7\u00e3o agora\" class=\"wp-image-163\"\/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Executor de teste nativo<\/h3>\n\n\n\n<p>Historicamente, o Nodejs tem um tempo de execu\u00e7\u00e3o m\u00ednimo para que os desenvolvedores possam escolher quais ferramentas e m\u00f3dulos precisam. A execu\u00e7\u00e3o de testes de c\u00f3digo exigia um m\u00f3dulo de terceiros, como Mocha, AVA ou Jest. Embora isso tenha resultado em muitas op\u00e7\u00f5es, pode ser dif\u00edcil tomar a melhor decis\u00e3o, e a troca de ferramentas pode n\u00e3o ser f\u00e1cil.<\/p>\n\n\n\n<p>Outros tempos de execu\u00e7\u00e3o adotaram uma vis\u00e3o alternativa e ofereceram ferramentas integradas consideradas essenciais para o desenvolvimento. Deno, Bun, Go e Rust oferecem executores de teste integrados. Os desenvolvedores t\u00eam uma escolha padr\u00e3o, mas podem optar por uma alternativa quando seu projeto tiver requisitos espec\u00edficos.<\/p>\n\n\n\n<p>O Nodejs 18 introduziu um executor de teste experimental que agora est\u00e1 est\u00e1vel na vers\u00e3o 20. N\u00e3o h\u00e1 necessidade de instalar um m\u00f3dulo de terceiros e voc\u00ea pode criar scripts de teste:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>no diret\u00f3rio <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">\/test\/ <\/mark>do seu projeto<\/li>\n\n\n\n<li>nomeando o arquivo <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">test.js<\/mark>, <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">test.mjs<\/mark> ou <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">test.cjs<\/mark><\/li>\n\n\n\n<li>usando<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\"> test-<\/mark> no in\u00edcio do nome do arquivo &#8211; como <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">test-mycode.js<\/mark><\/li>\n\n\n\n<li>usando <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">teste <\/mark>no final do nome do arquivo com ponto anterior <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">( . )<\/mark>, h\u00edfen <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">( &#8211; )<\/mark> ou sublinhado <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">( _ ) <\/mark>\u2014 como <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">mycode-test.js<\/mark>, <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">mycode_test.cjs<\/mark> ou<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\"> mycode.test.mjs<\/mark><\/li>\n<\/ul>\n\n\n\n<p>Voc\u00ea pode ent\u00e3o importar node:test e node:assert e escrever as fun\u00e7\u00f5es de teste:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ test.mjs\nimport { test, mock } from 'node:test';\nimport assert from 'node:assert';\nimport fs from 'node:fs';\n\ntest('my first test', (t) =&gt; {\n  assert.strictEqual(1, 1);\n});\n\ntest('my second test', (t) =&gt; {\n  assert.strictEqual(1, 2);\n});\n\n\/\/ asynchronous test with mocking\nmock.method(fs, 'readFile', async () =&gt; 'Node.js test');\ntest('my third test', async (t) =&gt; {\n  assert.strictEqual( await fs.readFile('anyfile'), 'Node.js test' );\n});<\/code><\/pre>\n\n\n\n<p>Execute os testes com node &#8211;test test.mjs e examine a sa\u00edda:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\u2714 my first test (0.9792ms)\n\u2716 my second test (1.2304ms)\n  AssertionError: Expected values to be strictly equal:\n\n  1 !== 2\n\n      at TestContext.&lt;anonymous&gt; (test.mjs:10:10)\n      at Test.runInAsyncScope (node:async_hooks:203:9)\n      at Test.run (node:internal\/test_runner\/test:547:25)\n      at Test.processPendingSubtests (node:internal\/test_runner\/test:300:27)\n      at Test.postRun (node:internal\/test_runner\/test:637:19)\n      at Test.run (node:internal\/test_runner\/test:575:10)\n      at async startSubtest (node:internal\/test_runner\/harness:190:3) {\n    generatedMessage: false,\n    code: 'ERR_ASSERTION',\n    actual: 1,\n    expected: 2,\n    operator: 'strictEqual'\n  }\n\n\u2714 my third test (0.1882ms)\n\u2139 tests 3\n\u2139 pass 2\n\u2139 fail 1\n\u2139 cancelled 0\n\u2139 skipped 0\n\u2139 todo 0\n\u2139 duration_ms 72.6767<\/code><\/pre>\n\n\n\n<p>Voc\u00ea pode adicionar um sinalizador &#8211;watch para executar novamente os testes automaticamente quando o arquivo for alterado:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>node --test --watch test.mjs<\/code><\/pre>\n\n\n\n<p>Voc\u00ea tamb\u00e9m pode executar todos os testes encontrados no projeto:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>node --test<\/code><\/pre>\n\n\n\n<p>O <a href=\"https:\/\/nodejs.org\/api\/test.html\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">teste nativo<\/a> \u00e9 uma adi\u00e7\u00e3o bem-vinda ao tempo de execu\u00e7\u00e3o do Node.js. H\u00e1 menos necessidade de aprender diferentes APIs de terceiros e n\u00e3o tenho mais desculpa para esquecer de adicionar testes a projetos menores!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Compilando um \u00fanico aplicativo execut\u00e1vel<\/h3>\n\n\n\n<p>Os projetos Node.js requerem o tempo de execu\u00e7\u00e3o para serem executados. Isso pode ser uma barreira ao distribuir aplicativos para plataformas ou usu\u00e1rios que n\u00e3o podem instalar ou manter facilmente o Node.js.<\/p>\n\n\n\n<p>A vers\u00e3o 20 oferece um recurso experimental que permite criar um \u00fanico aplicativo execut\u00e1vel (SEA) que pode ser implantado sem depend\u00eancias. O manual explica o processo, embora seja um pouco complicado:.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Voc\u00ea deve ter um projeto com um \u00fanico script de entrada. Ele deve usar CommonJS em vez de M\u00f3dulos ES.<\/li>\n\n\n\n<li>Crie um arquivo de configura\u00e7\u00e3o JSON usado para criar seu script em um blob que \u00e9 executado dentro do tempo de execu\u00e7\u00e3o. Por exemplo, <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">sea-config.json<\/mark>:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"main\": \"myscript.js\",\n  \"output\": \"sea-prep.blob\"\n}<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Gere o blob com o <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">node &#8211;experimental-sea-config sea-config.json.<\/mark><\/li>\n\n\n\n<li>De acordo com o seu sistema operacional, voc\u00ea deve copiar o execut\u00e1vel do node, remover a assinatura do bin\u00e1rio, injetar o blob no bin\u00e1rio, assin\u00e1-lo novamente e testar o aplicativo resultante.<\/li>\n<\/ul>\n\n\n\n<p>Embora funcione, voc\u00ea est\u00e1 limitado a projetos CommonJS mais antigos e s\u00f3 pode segmentar o mesmo sistema operacional que est\u00e1 usando. \u00c9 certo que vai melhorar, j\u00e1 que o compilador Deno superior pode criar um execut\u00e1vel para qualquer plataforma em um \u00fanico comando a partir de arquivos de origem JavaScript ou TypeScript.<\/p>\n\n\n\n<p>Voc\u00ea tamb\u00e9m deve estar ciente do tamanho do arquivo execut\u00e1vel resultante. Um \u00fanico console.log(&#8216;Hello World&#8217;); gera um arquivo de 85 MB, porque o Node.js (e o Deno) precisam anexar todo o mecanismo V8 JavaScript e as bibliotecas padr\u00e3o. Op\u00e7\u00f5es para reduzir o tamanho dos arquivos est\u00e3o sendo consideradas, mas \u00e9 improv\u00e1vel que fique abaixo de 25 MB.<\/p>\n\n\n\n<p>A compila\u00e7\u00e3o n\u00e3o ser\u00e1 pr\u00e1tica para pequenas ferramentas de linha de comando, mas \u00e9 uma op\u00e7\u00e3o mais vi\u00e1vel para projetos maiores, como um aplicativo de servidor web completo.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/bit.ly\/2YivXeS\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" src=\"https:\/\/blog.tipscode.tech\/wp-content\/uploads\/2023\/04\/Curso-Full-Stack-turbo-da-Tipscode.png\" alt=\"Curso Full Stack turbo - fa\u00e7a sua inscri\u00e7\u00e3o agora\" class=\"wp-image-163\"\/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Mecanismo JavaScript V8 atualizado<\/h3>\n\n\n\n<p>O Node.js 20 inclui a vers\u00e3o mais recente do mecanismo V8, que inclui os seguintes recursos JavaScript:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/String\/isWellFormed\" target=\"_blank\" rel=\"noreferrer noopener\">String.prototype.isWellFormed()<\/a>: retorna <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-cyan-bluish-gray-color\">true <\/mark>quando uma string \u00e9 bem formada e n\u00e3o cont\u00e9m caracteres substitutos solit\u00e1rios (n\u00e3o pareados).<\/li>\n\n\n\n<li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/String\/toWellFormed\" target=\"_blank\" rel=\"noreferrer noopener\">String.prototype.toWellFormed()<\/a>: retorna uma string bem formada que corrige problemas de caracteres substitutos solit\u00e1rios.<\/li>\n\n\n\n<li>Um novo sinalizador v de express\u00e3o regular que aborda problemas com mai\u00fasculas e min\u00fasculas de caracteres Unicode.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Atualiza\u00e7\u00f5es diversas<\/h3>\n\n\n\n<p>As seguintes atualiza\u00e7\u00f5es e melhorias tamb\u00e9m est\u00e3o dispon\u00edveis:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>melhorias de desempenho para URL, fetch() nativo e APIs EventTarget<\/li>\n\n\n\n<li>Melhorias no carregamento do m\u00f3dulo ES, incluindo suporte experimental para import.meta.resolve(), que pode definir o escopo de uma refer\u00eancia de caminho de arquivo do m\u00f3dulo para uma string de URL<\/li>\n\n\n\n<li>Melhorias na interoperabilidade da Web Crypto API<\/li>\n\n\n\n<li>Progresso adicional na WebAssembly System Interface (WASI), que concede acesso de aplicativos WASM em \u00e1rea restrita ao sistema operacional<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Conclus\u00e3o<\/h3>\n\n\n\n<p>O Nodejs 20 \u00e9 um grande passo \u00e0 frente. \u00c9 um lan\u00e7amento mais significativo e implementa alguns dos melhores recursos do Deno.<\/p>\n\n\n\n<p>No entanto, isso levanta a quest\u00e3o: voc\u00ea deve usar o Deno?<\/p>\n\n\n\n<p>Deno \u00e9 \u00f3timo. \u00c9 est\u00e1vel, suporta TypeScript nativamente, reduz o tempo de desenvolvimento, requer menos ferramentas e recebe atualiza\u00e7\u00f5es regulares. Por outro lado, j\u00e1 existe h\u00e1 menos tempo, tem menos m\u00f3dulos e geralmente s\u00e3o imita\u00e7\u00f5es mais superficiais das bibliotecas Node.js.<\/p>\n\n\n\n<p>Vale a pena considerar Deno e Bun para novos projetos, mas existem milhares de aplicativos Node.js existentes. Deno e Bun est\u00e3o facilitando a transi\u00e7\u00e3o do c\u00f3digo, mas nem sempre haver\u00e1 uma clara vantagem em abandonar o Node.js.<\/p>\n\n\n\n<p>A boa not\u00edcia \u00e9 que temos um pr\u00f3spero ecossistema JavaScript. As equipes de tempo de execu\u00e7\u00e3o est\u00e3o aprendendo umas com as outras e a r\u00e1pida evolu\u00e7\u00e3o beneficia os desenvolvedores.<\/p>\n\n\n\n<p>Conhe\u00e7a mais sobre o <a href=\"https:\/\/blog.tipscode.tech\/2023\/04\/curso-full-stack-turbo\/\" target=\"_blank\" rel=\"noreferrer noopener\">curso full stack turbo<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"tmnf_excerpt\"><p>A vers\u00e3o 20 do Nodejs foi lan\u00e7ada em 18 de abril de 2023. Ela aborda alguns problemas e cr\u00edticas j\u00e1 \u201cresolvidos\u201d por Deno e Bun, incluindo um novo modelo de permiss\u00e3o e um executor de testes nativo est\u00e1vel. Este artigo examina as novas op\u00e7\u00f5es dispon\u00edveis para desenvolvedores que usam o tempo de execu\u00e7\u00e3o JavaScript mais &hellip;<\/p>\n<\/div>","protected":false},"author":2,"featured_media":209,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[7,9,10,11],"class_list":["post-148","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-backend","tag-atualizacao","tag-backend","tag-javascript","tag-nodejs"],"_links":{"self":[{"href":"https:\/\/alisson.jcsr.com.br\/v3\/wp-json\/wp\/v2\/posts\/148","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alisson.jcsr.com.br\/v3\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/alisson.jcsr.com.br\/v3\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/alisson.jcsr.com.br\/v3\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/alisson.jcsr.com.br\/v3\/wp-json\/wp\/v2\/comments?post=148"}],"version-history":[{"count":1,"href":"https:\/\/alisson.jcsr.com.br\/v3\/wp-json\/wp\/v2\/posts\/148\/revisions"}],"predecessor-version":[{"id":210,"href":"https:\/\/alisson.jcsr.com.br\/v3\/wp-json\/wp\/v2\/posts\/148\/revisions\/210"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alisson.jcsr.com.br\/v3\/wp-json\/wp\/v2\/media\/209"}],"wp:attachment":[{"href":"https:\/\/alisson.jcsr.com.br\/v3\/wp-json\/wp\/v2\/media?parent=148"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alisson.jcsr.com.br\/v3\/wp-json\/wp\/v2\/categories?post=148"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alisson.jcsr.com.br\/v3\/wp-json\/wp\/v2\/tags?post=148"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}