NFeWizard-io: Ajuda / Como anda o Open-Source / 3 meses da minha primeira LIB
Um resumo de como anda o desenvolvimento open-source e uma busca por sugestões
3 meses no open-source
Após 3 meses do lançamento da minha biblioteca nfewizard-io no mundo open-source, posso dizer que tem sido uma experiência revigorante. Foi muito interessante receber diversos contatos de diferentes frentes, como LinkedIn, GitHub e até mesmo Telegram, com dúvidas, sugestões, pull requests, issues e mensagens de apoio ao projeto.
Graças a essas interações, hoje a biblioteca conta com novas funcionalidades, como emissão de NFC-e, geração de DANFE com QR code, entre outras melhorias menores que facilitam a geração e emissão de documentos fiscais.
Além disso, agora é possível acessar a tipagem completa de NFe em TypeScript, pois ela é exportada diretamente pela biblioteca.
E uma boa surpresa: nesse período, recebemos até uma doação em apoio ao projeto!
Pedido de ajuda
Agora vamos à parte técnica, onde uma ajuda seria muito bem-vinda.
Recentemente, adicionei a possibilidade de build da biblioteca utilizando o Rollup. Porém, apesar de usar o rollup-plugin-terser
o tamanho final (unpacked size) está ficando bastante grande.
Isso ocorre, em parte, porque a biblioteca precisa incluir a cadeia de certificados das autoridades certificadoras para comunicação com a SEFAZ, além dos schemas de validação dos XMLs para validar o conteúdo antes de enviá-lo à SEFAZ, reduzindo o risco de erro e consumo indevido em casos de múltiplas tentativas.
Ambas as pastas de certificados e schemas são adicionadas à build.
Testei carregar os schemas sob demanda via CDN, mas isso aumentou significativamente o tempo de execução dos métodos.
Sugestões ou pull requests com possíveis soluções seriam extremamente bem-vindas!
Caso queiram dar uma olhada, segue a página do projeto: NFeWizard-io - GitHub NFeWizard-io - Documentação
Após revisar o repositório, tive uma ideia de compressão dos certificados e schemas que seria viável. Uma abordagem prática para reduzir o tamanho do bundle seria:
- Comprimir as pastas
certificates
eschemas
utilizandogzip
. - Usar a biblioteca
zlib
em Node.js para descompactá-los sob demanda, carregando cada schema ou certificado apenas quando necessário.
Essa abordagem deve reduzir o tamanho do pacote final, mantendo o desempenho.
Aqui está um exemplo prático para implementar a sugestão de compressão e lazy loading dos certificados e schemas:
-
Comprimir arquivos com
gzip
:- No terminal, comprima os arquivos na pasta
certificates
eschemas
:gzip -k ./certificates/*.pem ./schemas/*.xsd
- No terminal, comprima os arquivos na pasta
-
Descompactar sob demanda com
zlib
:- No código, use o módulo
zlib
para carregar e descomprimir quando necessário:
import zlib from 'zlib'; import fs from 'fs'; import path from 'path'; // Função para descomprimir e carregar arquivos const loadCompressedFile = (filePath) => { const compressedData = fs.readFileSync(`${filePath}.gz`); return zlib.gunzipSync(compressedData).toString('utf8'); }; // Exemplo de uso const schemaContent = loadCompressedFile(path.resolve(__dirname, './schemas/schema-name.xsd'));
- No código, use o módulo
-
Atualizar o Rollup para incluir apenas os arquivos comprimidos:
- Certifique-se de que o Rollup inclui os arquivos
.gz
para evitar duplicação e reduzir o tamanho final do bundle.
- Certifique-se de que o Rollup inclui os arquivos
Esse processo diminui o bundle inicial e carrega apenas o que for necessário para a comunicação com a SEFAZ, mantendo o desempenho.
O que acha? se falei besteira pode desconsiderar