[{"data":1,"prerenderedAt":698},["ShallowReactive",2],{"$fPvf5NADhOs7NJMhkhExFDI0dsfuGL1NFJ0-xc3s5-hc":3,"$ftQmli4SsNQQz_LxapE9aXKXWLmWh63VHzlZbS3YIlZw":683},{"id":4,"author":5,"categories":6,"slugified_categories":10,"description":14,"body":15,"date":677,"dateFormatted":678,"title":679,"image":680,"path":681,"mathfont":682},"blog/blog/routerworkers.md","Heleno Salgado",[7,8,9],"Tecnologia","Cloudflare","Performance",[11,12,13],"tecnologia","cloudflare","performance","O que acontece quando você decide que 'bom o suficiente' não é o bastante? Uma análise técnica sobre o RouterWorkers e como extrair cada milissegundo de performance na edge.",{"type":16,"value":17,"toc":669},"minimark",[18,22,43,54,57,62,69,307,311,318,325,330,426,433,437,444,587,590,628,632,638,641,657,660,665],[19,20,21],"p",{},"No ecossistema moderno de desenvolvimento, fomos condicionados a aceitar o \"inchaço\" como um mal necessário. Queremos um roteador para uma API simples? Instalamos uma biblioteca que traz consigo trezentas dependências, adiciona 2MB ao nosso bundle e consome preciosos milissegundos de inicialização.",[19,23,24,25,29,30,34,35,38,39,42],{},"Em ambientes de ",[26,27,28],"em",{},"Edge Computing",", como o ",[31,32,33],"strong",{},"Cloudflare Workers",", onde cada milissegundo de ",[26,36,37],{},"Cold Start"," e cada byte de memória contam, essa negligência arquitetural é um pecado capital. Foi dessa insatisfação que nasceu o ",[31,40,41],{},"RouterWorkers",".",[19,44,45,46,49,50,53],{},"O RouterWorkers não é apenas mais um roteador. É um manifesto contra o desperdício. Com um bundle minimalista de apenas ",[31,47,48],{},"29KB"," e ",[31,51,52],{},"zero dependências externas",", ele foi desenhado para ser transparente. No desenvolvimento de software, a melhor biblioteca é aquela que você esquece que existe porque ela simplesmente cumpre sua função sem degradar o sistema.",[19,55,56],{},"Quando você usa o RouterWorkers, você não está apenas roteando requisições; você está garantindo que sua aplicação suba instantaneamente em qualquer um dos mais de 300 data centers da Cloudflare ao redor do mundo.",[58,59,61],"h2",{"id":60},"início-rápido-sem-cerimônias","Início Rápido: Sem Cerimônias",[19,63,64,65,68],{},"A beleza da simplicidade reflete-se na implementação. Não há necessidade de configurações complexas ou ",[26,66,67],{},"boilerplate"," infinito.",[70,71,76],"pre",{"className":72,"code":73,"language":74,"meta":75,"style":75},"language-typescript shiki shiki-themes github-light github-dark","import { RouterWorkers } from 'routerworkers';\nimport type { Req, Res } from 'routerworkers';\n\nexport default {\n    async fetch(request: Request): Promise\u003CResponse> {\n        const app = new RouterWorkers(request);\n\n        await app.get('/', (req: Req, res: Res) => {\n            res.ok({ message: 'Hello World!' });\n        });\n\n        return app.resolve();\n    }\n};\n","typescript","",[77,78,79,102,119,126,138,178,200,205,252,270,276,281,295,301],"code",{"__ignoreMap":75},[80,81,84,88,92,95,99],"span",{"class":82,"line":83},"line",1,[80,85,87],{"class":86},"szBVR","import",[80,89,91],{"class":90},"sVt8B"," { RouterWorkers } ",[80,93,94],{"class":86},"from",[80,96,98],{"class":97},"sZZnC"," 'routerworkers'",[80,100,101],{"class":90},";\n",[80,103,105,107,110,113,115,117],{"class":82,"line":104},2,[80,106,87],{"class":86},[80,108,109],{"class":86}," type",[80,111,112],{"class":90}," { Req, Res } ",[80,114,94],{"class":86},[80,116,98],{"class":97},[80,118,101],{"class":90},[80,120,122],{"class":82,"line":121},3,[80,123,125],{"emptyLinePlaceholder":124},true,"\n",[80,127,129,132,135],{"class":82,"line":128},4,[80,130,131],{"class":86},"export",[80,133,134],{"class":86}," default",[80,136,137],{"class":90}," {\n",[80,139,141,144,148,151,155,158,161,164,166,169,172,175],{"class":82,"line":140},5,[80,142,143],{"class":86},"    async",[80,145,147],{"class":146},"sScJk"," fetch",[80,149,150],{"class":90},"(",[80,152,154],{"class":153},"s4XuR","request",[80,156,157],{"class":86},":",[80,159,160],{"class":146}," Request",[80,162,163],{"class":90},")",[80,165,157],{"class":86},[80,167,168],{"class":146}," Promise",[80,170,171],{"class":90},"\u003C",[80,173,174],{"class":146},"Response",[80,176,177],{"class":90},"> {\n",[80,179,181,184,188,191,194,197],{"class":82,"line":180},6,[80,182,183],{"class":86},"        const",[80,185,187],{"class":186},"sj4cs"," app",[80,189,190],{"class":86}," =",[80,192,193],{"class":86}," new",[80,195,196],{"class":146}," RouterWorkers",[80,198,199],{"class":90},"(request);\n",[80,201,203],{"class":82,"line":202},7,[80,204,125],{"emptyLinePlaceholder":124},[80,206,208,211,214,217,219,222,225,228,230,233,236,239,241,244,247,250],{"class":82,"line":207},8,[80,209,210],{"class":86},"        await",[80,212,213],{"class":90}," app.",[80,215,216],{"class":146},"get",[80,218,150],{"class":90},[80,220,221],{"class":97},"'/'",[80,223,224],{"class":90},", (",[80,226,227],{"class":153},"req",[80,229,157],{"class":86},[80,231,232],{"class":146}," Req",[80,234,235],{"class":90},", ",[80,237,238],{"class":153},"res",[80,240,157],{"class":86},[80,242,243],{"class":146}," Res",[80,245,246],{"class":90},") ",[80,248,249],{"class":86},"=>",[80,251,137],{"class":90},[80,253,255,258,261,264,267],{"class":82,"line":254},9,[80,256,257],{"class":90},"            res.",[80,259,260],{"class":146},"ok",[80,262,263],{"class":90},"({ message: ",[80,265,266],{"class":97},"'Hello World!'",[80,268,269],{"class":90}," });\n",[80,271,273],{"class":82,"line":272},10,[80,274,275],{"class":90},"        });\n",[80,277,279],{"class":82,"line":278},11,[80,280,125],{"emptyLinePlaceholder":124},[80,282,284,287,289,292],{"class":82,"line":283},12,[80,285,286],{"class":86},"        return",[80,288,213],{"class":90},[80,290,291],{"class":146},"resolve",[80,293,294],{"class":90},"();\n",[80,296,298],{"class":82,"line":297},13,[80,299,300],{"class":90},"    }\n",[80,302,304],{"class":82,"line":303},14,[80,305,306],{"class":90},"};\n",[58,308,310],{"id":309},"o-problema-do-cache-persistente","O Problema do Cache Persistente",[19,312,313,314,317],{},"Um dos maiores desafios em arquiteturas distribuídas é a invalidação de cache. Por padrão, o cache da Cloudflare é persistente por URL. Se você faz um deploy com uma nova lógica de negócio, mas a rota ",[77,315,316],{},"/api/data"," está em cache, seu usuário continuará recebendo dados baseados no código antigo.",[19,319,320,321,324],{},"O RouterWorkers resolve isso através do ",[31,322,323],{},"Versionamento Automático por Deploy",". Ao integrar-se com os metadados da Cloudflare, ele gera uma chave de cache única para cada versão do seu código.",[326,327,329],"h3",{"id":328},"como-funciona-na-prática","Como funciona na prática:",[70,331,333],{"className":72,"code":332,"language":74,"meta":75,"style":75},"// Configure o cache com o ID de versionamento automático do deploy\nconst config: ConfigWorker = {\n    cache: {\n        pathname: ['/data'],      \n        maxage: '3600',           \n        version: env.CF_VERSION_METADATA.id // Chave única por deploy!\n    }\n};\n\nconst app = new RouterWorkers(request, config);\n",[77,334,335,341,358,363,374,385,399,403,407,411],{"__ignoreMap":75},[80,336,337],{"class":82,"line":83},[80,338,340],{"class":339},"sJ8bj","// Configure o cache com o ID de versionamento automático do deploy\n",[80,342,343,346,349,351,354,356],{"class":82,"line":104},[80,344,345],{"class":86},"const",[80,347,348],{"class":186}," config",[80,350,157],{"class":86},[80,352,353],{"class":146}," ConfigWorker",[80,355,190],{"class":86},[80,357,137],{"class":90},[80,359,360],{"class":82,"line":121},[80,361,362],{"class":90},"    cache: {\n",[80,364,365,368,371],{"class":82,"line":128},[80,366,367],{"class":90},"        pathname: [",[80,369,370],{"class":97},"'/data'",[80,372,373],{"class":90},"],      \n",[80,375,376,379,382],{"class":82,"line":140},[80,377,378],{"class":90},"        maxage: ",[80,380,381],{"class":97},"'3600'",[80,383,384],{"class":90},",           \n",[80,386,387,390,393,396],{"class":82,"line":180},[80,388,389],{"class":90},"        version: env.",[80,391,392],{"class":186},"CF_VERSION_METADATA",[80,394,395],{"class":90},".id ",[80,397,398],{"class":339},"// Chave única por deploy!\n",[80,400,401],{"class":82,"line":202},[80,402,300],{"class":90},[80,404,405],{"class":82,"line":207},[80,406,306],{"class":90},[80,408,409],{"class":82,"line":254},[80,410,125],{"emptyLinePlaceholder":124},[80,412,413,415,417,419,421,423],{"class":82,"line":272},[80,414,345],{"class":86},[80,416,187],{"class":186},[80,418,190],{"class":86},[80,420,193],{"class":86},[80,422,196],{"class":146},[80,424,425],{"class":90},"(request, config);\n",[19,427,428,429,432],{},"Com essa abordagem, cada vez que você executa um ",[77,430,431],{},"wrangler deploy",", o cache anterior é invalidado de forma transparente. Você tem a velocidade máxima da Cache API sem o medo de servir dados obsoletos após uma atualização crítica.",[58,434,436],{"id":435},"consistência-e-segurança-sem-overhead","Consistência e Segurança sem Overhead",[19,438,439,440,443],{},"Validação de dados é outro ponto onde o desperdício costuma reinar. Bibliotecas de validação de schema costumam ser pesadas e complexas. No RouterWorkers, incluímos um validador ",[26,441,442],{},"built-in"," que oferece tipagem completa (TypeScript First-class) sem sacrificar a performance.",[70,445,447],{"className":72,"code":446,"language":74,"meta":75,"style":75},"import { validate, schemas } from 'routerworkers';\n\nawait app.post('/users',\n    validate({\n        body: {\n            name: { type: 'string', required: true, minLength: 3 },\n            email: { type: 'email', required: true }\n        }\n    }),\n    (req, res) => {\n        // req.bodyJson já está tipado e validado aqui\n        res.created(req.bodyJson);\n    }\n);\n",[77,448,449,462,466,484,492,497,520,535,540,545,562,567,578,582],{"__ignoreMap":75},[80,450,451,453,456,458,460],{"class":82,"line":83},[80,452,87],{"class":86},[80,454,455],{"class":90}," { validate, schemas } ",[80,457,94],{"class":86},[80,459,98],{"class":97},[80,461,101],{"class":90},[80,463,464],{"class":82,"line":104},[80,465,125],{"emptyLinePlaceholder":124},[80,467,468,471,473,476,478,481],{"class":82,"line":121},[80,469,470],{"class":86},"await",[80,472,213],{"class":90},[80,474,475],{"class":146},"post",[80,477,150],{"class":90},[80,479,480],{"class":97},"'/users'",[80,482,483],{"class":90},",\n",[80,485,486,489],{"class":82,"line":128},[80,487,488],{"class":146},"    validate",[80,490,491],{"class":90},"({\n",[80,493,494],{"class":82,"line":140},[80,495,496],{"class":90},"        body: {\n",[80,498,499,502,505,508,511,514,517],{"class":82,"line":180},[80,500,501],{"class":90},"            name: { type: ",[80,503,504],{"class":97},"'string'",[80,506,507],{"class":90},", required: ",[80,509,510],{"class":186},"true",[80,512,513],{"class":90},", minLength: ",[80,515,516],{"class":186},"3",[80,518,519],{"class":90}," },\n",[80,521,522,525,528,530,532],{"class":82,"line":202},[80,523,524],{"class":90},"            email: { type: ",[80,526,527],{"class":97},"'email'",[80,529,507],{"class":90},[80,531,510],{"class":186},[80,533,534],{"class":90}," }\n",[80,536,537],{"class":82,"line":207},[80,538,539],{"class":90},"        }\n",[80,541,542],{"class":82,"line":254},[80,543,544],{"class":90},"    }),\n",[80,546,547,550,552,554,556,558,560],{"class":82,"line":272},[80,548,549],{"class":90},"    (",[80,551,227],{"class":153},[80,553,235],{"class":90},[80,555,238],{"class":153},[80,557,246],{"class":90},[80,559,249],{"class":86},[80,561,137],{"class":90},[80,563,564],{"class":82,"line":278},[80,565,566],{"class":339},"        // req.bodyJson já está tipado e validado aqui\n",[80,568,569,572,575],{"class":82,"line":283},[80,570,571],{"class":90},"        res.",[80,573,574],{"class":146},"created",[80,576,577],{"class":90},"(req.bodyJson);\n",[80,579,580],{"class":82,"line":297},[80,581,300],{"class":90},[80,583,584],{"class":82,"line":303},[80,585,586],{"class":90},");\n",[19,588,589],{},"O RouterWorkers não sacrifica o poder em nome da leveza. Ele oferece um conjunto completo de ferramentas para APIs modernas:",[591,592,593,610,616,622],"ul",{},[594,595,596,599,600,235,603,235,606,609],"li",{},[31,597,598],{},"Response Helpers:"," 14 métodos semânticos (",[77,601,602],{},"res.ok",[77,604,605],{},"res.created",[77,607,608],{},"res.unauthorized",", etc) que seguem rigorosamente os padrões HTTP.",[594,611,612,615],{},[31,613,614],{},"Route Groups:"," Organize seu código com prefixos e middlewares compartilhados sem perder a legibilidade.",[594,617,618,621],{},[31,619,620],{},"CORS Built-in:"," Implementação completa e segura, com modos específicos para desenvolvimento e produção.",[594,623,624,627],{},[31,625,626],{},"Middlewares Globais e por Rota:"," Controle total sobre o ciclo de vida da requisição.",[58,629,631],{"id":630},"conclusão-por-que-usar","Conclusão: Por que usar?",[19,633,634,635],{},"Se você está cansado de frameworks que tentam ser tudo para todos e acabam entregando lentidão, o RouterWorkers é para você. Ele é focado em quem entende que, na web moderna, ",[31,636,637],{},"performance é um recurso, não um bônus.",[19,639,640],{},"A consistência de uma API robusta, a velocidade de uma integração nativa com o cache da Cloudflare e a segurança de um sistema de tipos rigoroso — tudo isso em menos de 30KB.",[19,642,643,644,651,652,42],{},"O projeto é open-source e está disponível no ",[645,646,650],"a",{"href":647,"rel":648},"https://www.npmjs.com/package/routerworkers",[649],"nofollow","npm",". Se a eficiência é uma prioridade no seu fluxo de trabalho, convido você a testar e, quem sabe, dar aquela estrela no ",[645,653,656],{"href":654,"rel":655},"https://github.com/HelenoSalgado/routerworkers",[649],"GitHub",[658,659],"hr",{},[19,661,662],{},[31,663,664],{},"Feito com foco em performance para Cloudflare Workers.",[666,667,668],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":75,"searchDepth":104,"depth":104,"links":670},[671,672,675,676],{"id":60,"depth":104,"text":61},{"id":309,"depth":104,"text":310,"children":673},[674],{"id":328,"depth":121,"text":329},{"id":435,"depth":104,"text":436},{"id":630,"depth":104,"text":631},"2026-02-22","21 de fevereiro de 2026","RouterWorkers: A Arte da Otimização em Cloudflare Workers","https://heleno.dev/images/default-post.webp","/blog/routerworkers",false,[684,691],{"id":685,"author":5,"title":686,"description":687,"path":688,"date":689,"dateFormatted":690,"image":680},"blog/blog/gemini-e-seu-esquecimento-sistematico.md","Gemini e seu esquecimento sistemático","A Gemini, naturalmente, está se tornando cada dia melhor, mais perspicaz, mais organizada, mais metódica em programação, mas ainda esquece muito.","/blog/gemini-e-seu-esquecimento-sistematico","2026-04-26","25 de abril de 2026",{"id":692,"author":5,"title":693,"description":694,"path":695,"date":696,"dateFormatted":697,"image":680},"blog/blog/agi-entre-a-ficcao-e-a-imaginacao.md","AGI, A Promessa da Ficção e o Medo da Imaginação","Uma reflexão filosófica sobre a utopia e a distopia prometidas pela Inteligência Artificial Geral.","/blog/agi-entre-a-ficcao-e-a-imaginacao","2025-10-15","14 de outubro de 2025",1777238481968]