npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@rx-angular/isr

v19.0.0

Published

Incremental Static Regeneration for Angular

Downloads

2,327

Readme

@rx-angular/isr

A library that enables Angular Universal applications to generate static pages at runtime and then update them incrementally on demand or on a schedule.

Features

  • ⏰ Scheduled cache invalidation
  • ▶️ On-demand cache invalidation
  • 🔌 Plugin based cache handlers
  • 👌 No build changes required!
  • 🅰️ Supports Angular Universal
  • 🛡️ NgModules & Standalone Compatible

Installation

npm install @rx-angular/isr

Version Compatibility

| RxAngular | Angular | | --------- | --------- | | ^18.0.0 | ^18.0.0 | | ^17.1.0 | ^17.0.0 | | ^16.0.0 | ^16.0.0 |

How to use it?

  1. Initialize ISRHandler inside server.ts
const isr = new ISRHandler({
  indexHtml,
  invalidateSecretToken: 'MY_TOKEN', // replace with env secret key ex. process.env.REVALIDATE_SECRET_TOKEN
  enableLogging: !environment.production,
});
  1. Add invalidation url handler
server.use(express.json());
server.post('/api/invalidate', async (req, res) => await isr.invalidate(req, res));
  1. Replace Angular default server side rendering with ISR rendering

Replace

server.get('*', (req, res) => {
  res.render(indexHtml, {
    req,
    providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }],
  });
});

with

server.get(
  '*',
  // Serve page if it exists in cache
  async (req, res, next) => await isr.serveFromCache(req, res, next),
  // Server side render the page and add to cache if needed
  async (req, res, next) => await isr.render(req, res, next),
);

You can also pass providers to each of the ISRHandler methods.

server.get(
  '*',
  ...async (req, res, next) =>
    await isr.render(req, res, next, {
      providers: [
        { provide: APP_BASE_HREF, useValue: req.baseUrl }, // <-- Needs to be provided when passing providers
        { provide: CUSTOM_TOKEN, useValue: 'Hello from ISR' },
        CustomService,
      ],
    }),
);

It is also possible to pass a modifyCachedHtml or modifyGeneratedHtml callbacks to the ISRHandler methods. These methods provide a way to modify the html served from cache or the html that is generated on the fly.

Important: Use these methods with caution as the logic written can increase the processing time.

server.get(
  '*',
  // Serve page if it exists in cache
  async (req, res, next) =>
    await isr.serveFromCache(req, res, next, {
      modifyCachedHtml: (req, cachedHtml) => {
        return `${cachedHtml}<!-- Hello, I'm a modification to the original cache! -->`;
      },
    }),
  // Server side render the page and add to cache if needed
  async (req, res, next) =>
    await isr.render(req, res, next, {
      modifyGeneratedHtml: (req, html) => {
        return `${html}<!-- Hello, I'm modifying the generatedHtml before caching it! -->`;
      },
    }),
);

ISRHandler provides APP_BASE_HREF by default. And if you want pass providers into the methods of ISRHandler, you will also have to provide APP_BASE_HREF token.

  1. Add revalidate key in route data

Example:

{
  path: "example",
  component: ExampleComponent,
  data: { revalidate: 5 },
}

NOTE: Routes that don't have revalidate key in data won't be handled by ISR. They will fallback to Angular default server side rendering pipeline.

  1. Register providers To register the ISR providers, you can either import IsrModule in your AppServerModule or provide provideISR in your AppServerModule providers.

Or, if you are in a standalone app, you can register the providers in your app.config.server.ts file.

  • Register using IsrModule
import { IsrModule } from '@rx-angular/isr/server'; // <-- Import module from library

@NgModule({
  imports: [
    IsrModule.forRoot(), // <-- Use it in module imports
  ],
})
export class AppServerModule {}
  • Register using the provideISR function
import { provideISR } from '@rx-angular/isr/server';

@NgModule({
  providers: [
    provideISR(), // <-- Use it in module providers
  ],
})
export class AppServerModule {}
  • Register using the provideISR function in standalone app
import { provideISR } from '@rx-angular/isr/server';

const serverConfig: ApplicationConfig = {
  providers: [
    provideServerRendering(),
    provideISR(), // <-- Use it in config providers
  ],
};

When registering the providers, IsrService will be initialized and will start to listen to route changes, only on the server side, so the browser bundle won't contain any extra code.

License

MIT