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

@x1.co/lambda-at-edge

v3.6.0

Published

Provides handlers that can be used in CloudFront Lambda@Edge to deploy next.js applications to the edge

Downloads

2

Readme

@x1.co/lambda-at-edge

Library to build and deploy Next.js apps for AWS Lambda@Edge

This library uses the handlers provided by @x1.co/core and wraps them with a Lambda@Edge/CloudFront-compatible layer.

Usage

const path = require("path");
const { Builder } = require("@x1.co/lambda-at-edge");

const nextConfigPath = "/path/to/my/nextapp";
const outputDir = path.join(nextConfigPath, ".serverless_nextjs");

const builder = new Builder(nextConfigPath, outputDir, {
  cmd: "./node_modules/.bin/next",
  cwd: process.cwd(),
  env: {},
  args: ["build"],
  minifyHandlers: true,
  // it is recommended to let your CF distribution do the compression as per the docs - https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/ServingCompressedFiles.html
  // however there have been issues in the past where CF doesn't compress lambda@edge responses, so we provide our own implementation in case is needed
  enableHTTPCompression: false
});

await builder
  .build()
  .then(() => {
    console.log("Application built successfully!");
  })
  .catch((e) => {
    console.log("Could not build app due the exception: ", e);
    process.exit(1);
  });

You can configure more options regarding building process. Configurable inputs you can find in 'build.ts' file ('packages/libs/lambda-at-edge/src/build.ts'). If you want to see debug logs during building, use 'await builder.build(true)' instead. After running the above, the output directory will contain the Lambda@Edge handlers necessary to server side render at the edge.

/dir/to/my/next-app/.serverless_nextjs/

 > default-lambda
   > manifest.json
   > routes-manifest.json
   > prerender-manifest.json
   > pages/
   > index.js # handler

 > api-lambda
   > manifest.json
   > routes-manifest.json
   > pages/api/
   > index.js # handler

 > image-lambda
   > manifest.json
   > routes-manifest.json
   > images-manifest.json
   > node_modules/...
   > index.js # handler

The handlers need to be attached to the origin-request trigger of CloudFront. The api-lambda edge function should be attached to a CloudFront behaviour that only triggers in the event of /api/* requests. The image-lambda edge function should be attached to a CloudFront behaviour that only triggers in the event of _next/image* requests.

For full usage docs, please refer to (TBA).

Architecture

Once built and packaged, the app consists of the following components:

  • default-lambda (v2): handles page and API requests.
  • default-lambda (v1): handles page requests only.
  • api-lambda (legacy v1 handlers only): handles API requests.
  • regeneration-lambda: handles regeneration requests used for ISR.
  • image-lambda: handles image optimization requests.
  • assets: all static assets used by your app.

Infrastructure

You will need the following infrastructure to deploy your app:

  • AWS Lambda@Edge
  • AWS CloudFront
  • AWS API Gateway
  • AWS S3 Bucket
  • AWS SQS Queue (if you are using ISR)
  • additional roles, permissions, etc.

Deployment

Currently, you will need to deploy via the Serverless Components deployer, @x1.co/serverless-component. We also provide a CDK construct at @x1.co/nextjs-cdk-construct.

If you'd like to write your own custom deployment logic, please see the CDK construct or legacy Serverless Components deployer to see an example of all the infrastructure you need to setup.

Limitations

  • Lambda@Edge limitations apply: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/edge-functions-restrictions.html. Most notably, there is a 1 MB response size limit, which could especially affect static files.
  • CloudFront limitations apply: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/cloudfront-limits.html
  • The image handler only serves image optimization requests. It cannot redirect, rewrite or add headers (yet).
  • In v1 handlers (legacy), the default, API and image handlers are separate, so you cannot rewrite from default routes -> image routes nor rewrite between default routes and API routes.
  • In v2 handlers, the default and image handlers are separate, so you cannot rewrite from default routes -> image routes.

Acknowledgements

Special thanks for Daniel Conde Marin for the initial implementation.