Ir para o conteúdo do rodapé
AJUDA DO NODE

rxjs NPM (Como funciona para desenvolvedores)

No desenvolvimento web contemporâneo, lidar com processos assíncronos complexos e produzir conteúdo dinâmico em tempo real é frequentemente necessário para construir sistemas eficazes e responsivos. Node-IronPDF e RxJS (Reactive Extensions for JavaScript) são duas bibliotecas robustas que podem auxiliar os desenvolvedores a atingir esses objetivos com facilidade. Em conjunto, oferecem uma solução poderosa para gerenciar fluxos de dados em tempo real e produzir documentos PDF de alta qualidade em um ambiente Node.js

Uma biblioteca de extensões reativas for JavaScript chamada RxJS foi criada para facilitar a programação reativa com Observables , simplificando a criação de aplicativos assíncronos ou baseados em callbacks com pilhas de chamadas mais fáceis de depurar. Com seus diversos operadores para criar, combinar, filtrar e transformar fluxos de dados, ele permite que os desenvolvedores trabalhem de forma declarativa com os dados. Isso melhora a capacidade de gerenciamento e a intuitividade no gerenciamento de eventos, solicitações assíncronas e outras fontes de dados em tempo real. Nos aplicativos web altamente interativos de hoje, a capacidade do RxJS de lidar com tarefas assíncronas complexas de forma elegante é fundamental.

Neste artigo, veremos como incluir as bibliotecas de extensões reativas Node-IronPDF e RxJS for JavaScript em uma aplicação Node.js Começaremos revisando os fundamentos da instalação das bibliotecas necessárias e da configuração de um projeto Node.js Em seguida, vamos abordar a criação e o gerenciamento de métodos de criação de Observables com RxJS e mostrar como utilizar o Node-IronPDF para usar esses Observables e iniciar a criação de PDFs. Ao terminar de ler este artigo, você saberá exatamente como usar a geração sofisticada de PDFs com programação reativa para criar aplicativos Node.js dinâmicos e responsivos.

O que é RxJS?

Uma biblioteca para programação reativa com Observables — um componente crucial de aplicativos reativos — é chamada de RxJS . Possui uma estrutura de arquivos mais modular que facilita o trabalho com fluxos de dados assíncronos, eventos e operações em aplicações JavaScript , além de torná-lo mais declarativo para os desenvolvedores. Uma estrutura de arquivos modular não só melhora a legibilidade e a manutenção, como também promove a reutilização de código e facilita os testes. Veja como você pode estruturar seu projeto baseado em RxJS de forma modular.

Observáveis ​​que emitem vários valores ao longo do tempo, operadores que manipulam, filtram e combinam esses fluxos de dados, e ferramentas robustas para lidar com concorrência e operações assíncronas são alguns dos componentes-chave do RxJS. O RxJS incentiva o uso da programação funcional, que permite aos programadores representar processos assíncronos complexos em código claro e compreensível. Obter pilhas de chamadas melhores e mais fáceis de depurar em RxJS é totalmente possível com as abordagens e ferramentas certas.

rxjs NPM (Como funciona para desenvolvedores): Figura 1 - RxJS

Processamento de dados em tempo real, programação orientada a eventos, controle de processos assíncronos complexos, como requisições HTTP, e tratamento reativo de interações com a interface do usuário estão entre os casos de uso comuns do RxJS. É uma opção bastante popular para o desenvolvimento de aplicativos reativos e escaláveis, tanto no frontend quanto no backend em JavaScript , devido à sua adaptabilidade e ampla superfície de API.

Criar e configurar o RxJS NPM

Para criar e configurar o RxJS em um projeto Node.js usando o npm, siga estes passos:

Instale o RxJS

Use o npm para adicionar a versão mais recente da biblioteca RxJS como uma dependência ao seu projeto:

npm install rxjs
npm install rxjs
SHELL

Configure o RxJS em sua aplicação Node.js

O RxJS pode ser usado em sua aplicação Node.js após ser instalado. É possível criar e se inscrever em um Observable usando o seguinte exemplo simples:

Adicione o seguinte código a um arquivo:

// Import necessary RxJS modules
const { Observable } = require('rxjs');

// Create an Observable that emits three values
const observable = new Observable(observer => {
  observer.next('Hello');
  observer.next('RxJS');
  observer.next('World');
  observer.complete();
});

// Subscribe to the Observable
observable.subscribe({
  next: value => console.log(value),
  complete: () => console.log('Observable completed'),
});

// Output:
// Hello
// RxJS
// World
// Observable completed
// Import necessary RxJS modules
const { Observable } = require('rxjs');

// Create an Observable that emits three values
const observable = new Observable(observer => {
  observer.next('Hello');
  observer.next('RxJS');
  observer.next('World');
  observer.complete();
});

// Subscribe to the Observable
observable.subscribe({
  next: value => console.log(value),
  complete: () => console.log('Observable completed'),
});

// Output:
// Hello
// RxJS
// World
// Observable completed
JAVASCRIPT

Criação de Observable: Usando o construtor Observable, criamos um observable que emite os valores "Hello", "RxJS" e "World" nessa ordem.

Assinatura: Usamos o método subscribe para assinar o observable. O callback next registra cada valor no console, e o callback complete registra uma mensagem quando o Observable é concluído.

rxjs NPM (Como funciona para desenvolvedores): Figura 2 - Saída do Observável

Configuração adicional

O RxJS oferece uma ampla gama de operadores para combinar, filtrar e alterar Observables. Esses operadores estão disponíveis para importação em seu aplicativo conforme necessário:

const { Observable } = require('rxjs');
const { map, filter } = require('rxjs/operators');

// Create an Observable that emits values
const observable = new Observable(observer => {
  observer.next(1);
  observer.next(2);
  observer.next(3);
  observer.complete();
});

// Use pipe to apply operators on the Observable
observable.pipe(
  filter(value => value > 1), // Only pass values greater than 1
  map(value => value * 10)    // Multiply the values by 10
).subscribe({
  next: value => console.log(value), // Log each value
  complete: () => console.log('Observable completed'), // Log when complete
});

// Output:
// 20
// 30
// Observable completed
const { Observable } = require('rxjs');
const { map, filter } = require('rxjs/operators');

// Create an Observable that emits values
const observable = new Observable(observer => {
  observer.next(1);
  observer.next(2);
  observer.next(3);
  observer.complete();
});

// Use pipe to apply operators on the Observable
observable.pipe(
  filter(value => value > 1), // Only pass values greater than 1
  map(value => value * 10)    // Multiply the values by 10
).subscribe({
  next: value => console.log(value), // Log each value
  complete: () => console.log('Observable completed'), // Log when complete
});

// Output:
// 20
// 30
// Observable completed
JAVASCRIPT

Este exemplo demonstra o uso de operadores com a biblioteca RxJS. Primeiro, importamos os operadores map e filter do módulo rxjs/operators e a classe Observable do módulo rxjs. Em seguida, criamos um Observable que emite sequencialmente os valores 1, 2 e 3 antes de ser concluído. O método pipe transforma este Observable, permitindo o encadeamento de operadores. O operador filter permite apenas a passagem de valores maiores que um, e o operador map multiplica cada um desses valores por 10.

rxjs NPM (Como funciona para desenvolvedores): Figura 3 - Operadores com saída de Observables

O Observable transformado é inscrito e cada um dos valores resultantes é registrado no console pelo callback next. Quando o Observable é concluído, o callback complete registra uma mensagem de conclusão, resultando na exibição dos valores 20 e 30 no console, seguidos por "Observable concluído".

Começando

Para utilizar o RxJS (Reactive Extensions for JavaScript) e o Node-IronPDF em uma aplicação Node.js , combinaremos os recursos de programação reativa do RxJS com as funcionalidades de criação de PDFs do Node-IronPDF. Com essa combinação, podemos gerenciar fluxos de dados assíncronos e gerar documentos PDF instantaneamente em resposta a eventos ou modificações nos dados.

O que é o IronPDF?

A biblioteca IronPDF for Node.js converte conteúdo HTML em páginas PDF de altíssima qualidade. Ele acelera o processo de conversão de arquivos HTML, CSS e outros arquivos JavaScript em PDFs formatados corretamente, sem comprometer o conteúdo original online. Esta é uma ferramenta extremamente útil para aplicações web que precisam gerar documentos dinâmicos e imprimíveis, como faturas, certificados e relatórios.

O IronPDF possui diversos recursos, incluindo configurações de página personalizáveis, cabeçalhos, rodapés e a opção de adicionar fontes e imagens. Ele consegue gerenciar estilos e layouts complexos para garantir que cada PDF de teste gerado esteja de acordo com as especificações. Além disso, o IronPDF controla a execução de JavaScript dentro do HTML, permitindo a renderização precisa de conteúdo dinâmico e interativo.

rxjs NPM (Como funciona para desenvolvedores): Figura 4 - IronPDF

Funcionalidades do IronPDF

Geração de PDF a partir de HTML

Converter HTML, CSS e JavaScript para PDF. Suporta dois padrões modernos da web: media queries e design responsivo. Útil para usar HTML e CSS para decorar dinamicamente documentos PDF, faturas e relatórios.

Edição de PDF

É possível adicionar texto, imagens e outros materiais a PDFs já existentes. Extrair texto e imagens de arquivos PDF. Mesclar vários PDFs em um único arquivo. Dividir arquivos PDF em vários documentos distintos. Adicione cabeçalhos, rodapés, anotações e marcas d'água.

Desempenho e confiabilidade

Em contextos industriais, alto desempenho e confiabilidade são atributos de projeto desejáveis. Lida facilmente com grandes conjuntos de documentos.

Instale o IronPDF

Para obter as ferramentas necessárias para trabalhar com PDFs em projetos Node.js , instale o pacote IronPDF :

npm install @ironsoftware/ironpdf
npm install @ironsoftware/ironpdf
SHELL

Observables do RxJS e IronPDF

Crie um arquivo e configure o Node-IronPDF para integrar o RxJS:

// Import necessary modules
const { Observable } = require('rxjs');
const { IronPdf } = require('node-ironpdf');

// Create an instance of Node-IronPDF
const ironPdf = new IronPdf();

// Create an observable that emits events at regular intervals
const observable = new Observable(observer => {
  let counter = 0;
  const intervalId = setInterval(() => {
    counter++;
    observer.next({ eventNumber: counter });
    if (counter === 3) { // Complete after three events
      observer.complete();
      clearInterval(intervalId);
    }
  }, 1000); // Emit every second
});

// Subscribe to the Observable and generate PDFs with Node-IronPDF
observable.subscribe({
  next: async data => {
    try {
      const htmlContent = `<h1>Event Report</h1><p>Event Number: ${data.eventNumber}</p>`;
      const pdf = await ironPdf.createFromHtml(htmlContent); // Create PDF from HTML
      const filePath = `./reports/event_report_${data.eventNumber}.pdf`;
      await pdf.saveAs(filePath); // Save the PDF
      console.log(`PDF report generated: ${filePath}`);
    } catch (error) {
      console.error('Error generating PDF:', error);
    }
  },
  complete: () => console.log('Observable completed'), // Log when all events are processed
});
// Import necessary modules
const { Observable } = require('rxjs');
const { IronPdf } = require('node-ironpdf');

// Create an instance of Node-IronPDF
const ironPdf = new IronPdf();

// Create an observable that emits events at regular intervals
const observable = new Observable(observer => {
  let counter = 0;
  const intervalId = setInterval(() => {
    counter++;
    observer.next({ eventNumber: counter });
    if (counter === 3) { // Complete after three events
      observer.complete();
      clearInterval(intervalId);
    }
  }, 1000); // Emit every second
});

// Subscribe to the Observable and generate PDFs with Node-IronPDF
observable.subscribe({
  next: async data => {
    try {
      const htmlContent = `<h1>Event Report</h1><p>Event Number: ${data.eventNumber}</p>`;
      const pdf = await ironPdf.createFromHtml(htmlContent); // Create PDF from HTML
      const filePath = `./reports/event_report_${data.eventNumber}.pdf`;
      await pdf.saveAs(filePath); // Save the PDF
      console.log(`PDF report generated: ${filePath}`);
    } catch (error) {
      console.error('Error generating PDF:', error);
    }
  },
  complete: () => console.log('Observable completed'), // Log when all events are processed
});
JAVASCRIPT

Primeiro, os módulos necessários são importados: IronPDF do Node-IronPDF e Observable do RxJS. O IronPDF oferece recursos para produzir e modificar documentos PDF em Node.js, enquanto o Observable é usado para construir um fluxo de dados que emite informações ao longo do tempo. Para facilitar as operações de criação e gerenciamento de PDFs posteriormente no código, uma instância do IronPDF é criada.

A definição de um Observable com o nome observable constitui a base da aplicação. Este Observable foi criado para usar setInterval para liberar objetos de dados { eventNumber } regularmente. Neste caso, ele emite três valores em intervalos de um segundo (1000 milissegundos): { eventNumber: 1 }, { eventNumber: 2 } e { eventNumber: 3 }.

rxjs NPM (Como funciona para desenvolvedores): Figura 5 - Saída do RxJS com IronPDF

O callback next na assinatura do Observable observable lida com cada valor emitido (data) conforme ele chega. Com base no eventNumber dos dados transmitidos, uma string de conteúdo HTML (htmlContent) é criada dentro deste retorno de chamada. O documento PDF é criado posteriormente usando ironPdf.createFromHtml(htmlContent) com este conteúdo HTML . No diretório ./reports, cada arquivo PDF é salvo com um nome de arquivo distinto (event_report_1.pdf, event_report_2.pdf, etc).

Utilizando um bloco try...catch, o tratamento de erros é incluído no retorno de chamada next para lidar com quaisquer erros que possam surgir durante o processo de criação do PDF. Quando ocorre um erro, ele é registrado no console usando console.error.

Por fim, durante o retorno de chamada complete da assinatura, uma mensagem intitulada "Observable completed" é registrada no console, indicando que o Observable concluiu sua emissão de valor.

rxjs NPM (Como funciona para desenvolvedores): Figura 6 - Saídas em PDF

Conclusão

A programação reativa e a produção dinâmica de PDFs funcionam bem juntas, como demonstrado pela integração do RxJS com o Node-IronPDF em uma aplicação Node.js Em resposta a eventos em tempo real ou alterações de dados, essa combinação oferece uma solução confiável para gerenciar fluxos de dados assíncronos e produzir documentos PDF com qualidade profissional.

Por meio do uso de Observables do RxJS, os desenvolvedores podem supervisionar e modificar fluxos de dados assíncronos de forma eficaz, simplificando o gerenciamento de fluxos de trabalho complexos e permitindo respostas declarativas e reativas a interações do usuário ou eventos externos. Aplicações como painéis de análise, ferramentas de relatórios interativos e sistemas de monitoramento que precisam lidar com dados em tempo real devem ter essa capacidade.

Por fim, a combinação de RxJS com Node-IronPDF permite que os desenvolvedores criem aplicativos responsivos e escaláveis ​​que gerenciam dados em tempo real de forma eficiente e oferecem uma criação de PDFs sem problemas. Essa combinação possibilita o desenvolvimento de aplicativos complexos, orientados a eventos, com recursos de geração de relatórios dinâmicos que melhoram a eficácia operacional e a experiência do usuário. Em conjunto, RxJS e Node-IronPDF fornecem um conjunto de ferramentas poderoso para a programação Node.js contemporânea, suportando tarefas como o gerenciamento da criação dinâmica de documentos, a interface com fontes de dados em tempo real e a geração de relatórios periódicos.

Os desenvolvedores podem escolher o melhor modelo com facilidade quando existem opções de licenciamento específicas para cada projeto que estejam bem definidas. Essas funcionalidades permitem que os desenvolvedores resolvam uma variedade de problemas de forma rápida, eficiente e bem-sucedida.

Darrius Serrant
Engenheiro de Software Full Stack (WebOps)

Darrius Serrant é bacharel em Ciência da Computação pela Universidade de Miami e trabalha como Engenheiro de Marketing WebOps Full Stack na Iron Software. Atraído por programação desde jovem, ele via a computação como algo misterioso e acessível ao mesmo tempo, tornando-a o meio ...

Leia mais

Equipe de suporte de ferro

Estamos online 24 horas por dia, 5 dias por semana.
Bater papo
E-mail
Liga para mim