Vercel won't clear build cache, only works if I delete the project and re-create it
Answered
୧ʕ•̀ᴥ•́ʔ୨ posted this in #help-forum
I have a Next.js project which statically generates some pages (content is fetched), but on rebuild (e.g. via webhook or manually), it doesn't clear the .next cache, so it never updates. Even when I manually redeploy and make sure not to check the "use existing build cache" checkbox, it still reuses it. I also tried the
If I delete the entire project and create a new one from the same repository, it correctly rebuilds it.
Any ideas how to force the cache to be cleared on rebuild?
VERCEL_FORCE_NO_BUILD_CACHE=1
env variable and adding forceNew=1
to the http endpoint that triggers the redeployment, still reuses the cache.If I delete the entire project and create a new one from the same repository, it correctly rebuilds it.
Any ideas how to force the cache to be cleared on rebuild?
Answered by ୧ʕ•̀ᴥ•́ʔ୨
I found the issue, it was due to accessing searchParams on a statically generated page
47 Replies
That works, but ideally I want to be able to do that automatically, e.g. when I rebuild via webhook when content is updated (e.g. triggered from a CMS)
you could create a webhook to revalidate the data for it
there is an example from doc, let me try to find it
you could add a key in to query and only revalidate with correct key provided
Thanks, I'll try that. It does seem like a bug though that it's not possible to clear the cache with the usual methods.
I also just tried adding
forceNew=1
to the v13/deployments
http endpoint that triggers the redeployment (as per the docs here https://vercel.com/docs/deployments/troubleshoot-a-build#managing-build-cache), that didn't work eitherwell its for build cache
not data cache
they are different
Ah I see, I assumed it's the same thing, I guess not
well but it should refetch the data and update the cache when you rebuild
So I added a tag to my fetch
And I have this in a
I manually run the route handler in the browser and then trigger a rebuild, bit it doesn't refetch ðŸ™
res = await fetch(path, { cache: "force-cache", next: { tags: ["test"] } });
And I have this in a
route.ts
:import { NextRequest, NextResponse } from "next/server";
import { revalidateTag } from "next/cache";
export async function GET(request: NextRequest) {
revalidateTag("test");
return NextResponse.json({ revalidated: true, now: Date.now() });
}
I manually run the route handler in the browser and then trigger a rebuild, bit it doesn't refetch ðŸ™
have you refresh the page?
Yep! The page is statically generated with
generateStaticParams()
if that makes any difference, that's why I'm doing a full rebuild. I tried adding revalidateTag("test")
at the top of generateStaticParams, but it still doesn't workyou shouldn't call revalidateTag("test") in there
So it actually seems to work on my local machine after more tests
If I do
npm run build / npm run start
it updates after every rebuildyes on every build it will refetch the data
revalidateTag/revalidatePath is for updating the data cache without rebuilding the site
Well my issue is on Vercel, the data doesn't get updated even after a full rebuild
can you share a github repo?
It's private but I can set up a demo and share that
yeah please do that so I can test on my side
I found the issue, it was due to accessing searchParams on a statically generated page
Answer
Although it did work at one point, doesn't seem to anymore
In the past I was able to force the page to be server rendered dynamically by adding a search param to the URL
But now this breaks the static generation somehow, it no longer updates, while the page with the param is still dynamic
I wanted to have a page that is static, but to force a dynamic preview by adding
?preview=true
at the endwhen your page use the searchParams object, the page cannot be static generated
you should use
https://nextjs.org/docs/app/building-your-application/configuring/draft-mode
draftMode
for ithttps://nextjs.org/docs/app/building-your-application/configuring/draft-mode
It seems like with draft mode I can't have the same-ish URL as the original page
I wanted to have
mysite.com/mypage/
be the static page and mysite.com/mypage?preview
be the preview pageI wonder if I can make another route like /mypage/preview, maybe that would work, as I'll only generate /mypage/ statically, and mypage/preview is a different route, so can be dynamic
Anyway, thanks for your help 🙂
np hope you get it fixed soon
I hope Next start supporting using searchParams on static pages (and force them to be dynamic), it kind of works already
I could just erase the project and recreate it via the vercel http API each time I want to rebuild, and it would work
The fact that the content doesn't update seems like a bug they haven't looked into since they don't officially support the behavior
well it hard as the doc said searchParams can be any object