I'm testing NextJS hosting with SST, so I deploy a simple nextJS app that only renders this static page:
// src/pages/index.tsx
function Home() {
return <h1>Hello</h1>;
}
export default Home;
Here is the Stack Code:
import { SSTConfig } from "sst";
import { NextjsSite } from "sst/constructs";
export default {
config(_input) {
return {
name: "test-next",
region: "sa-east-1",
};
},
stacks(app) {
app.stack(function Site({ stack }) {
const site = new NextjsSite(stack, "site");
stack.addOutputs({
SiteUrl: site.url,
});
});
},
} satisfies SSTConfig;
Everything is working perfectly, but one thing I notice is that all page response headers get the header X-Cache as Miss from Cloudfront. Another strange thing is that all requests to the CloudFront URL hit the lambda function that server-side renders the NextJS pages, I know that because of the cloud watch Log group named siteServerFunction that logs an invocation each time I request is made.
The problem is that this page doesn't use SSR, it is a page that should be generated at compile time, be served by s3, and cached by CloudFront. So, what is happening? Does SST support don't static site generation?
So this is likely just a bit of confusion. I have the exact same setup on https://campaign.tools. It's also a Next.js site deployed through SST as a
StaticSite.Let me help you understand the process that's going on...
When SST makes a
StaticSiteit automatically configures the CloudFront distribution caching. These settings can be manually overridden withassets.fileOptionsin theStaticSiteconfiguration object, but they default to a reasonable behavior. The documentation explains that the default behavior is to cache all JS/CSS files and not cache HTML files:With that said, you're getting cache misses from CloudFront, or at least it seems that way. For the JS and CSS files, that is fine since these files are being cached on your client. If you look at the JS/CSS files, you will see the following headers:
That seems like we're not getting any CloudFront cache hits; however, if you look at the
Status Codein theGeneralsection, I expect you would find the following:If that's the case, it means it was a miss on the first call your client made to CloudFront, but it then cached that request in the browser, due to the
Cache-Controlheader. You should see the following value for that header:If this is the case, then your client is simply caching that first "miss" from CloudFront, and it looks like you're constantly failing to hit the cache. If you want to, click
Disable cachein the network tab of your client and reload the site. You should now start to see cache hits! But don't worry, it was always cached :DI know this because I battled with the same thing when setting up my site. Please let me know if toggling the
Disable cachedoesn't help, since that might indicate you have other issues.