优化cloudflare体积

This commit is contained in:
mtvpls
2026-05-31 15:17:30 +08:00
parent 706b2fe272
commit c195bfeafc
+44 -1
View File
@@ -2,6 +2,7 @@
/* eslint-disable @typescript-eslint/no-var-requires */ /* eslint-disable @typescript-eslint/no-var-requires */
const { PHASE_DEVELOPMENT_SERVER } = require('next/constants'); const { PHASE_DEVELOPMENT_SERVER } = require('next/constants');
const webpack = require('webpack');
// 检测是否为 Cloudflare Pages 构建 // 检测是否为 Cloudflare Pages 构建
const isCloudflare = process.env.CF_PAGES === '1' || process.env.BUILD_TARGET === 'cloudflare'; const isCloudflare = process.env.CF_PAGES === '1' || process.env.BUILD_TARGET === 'cloudflare';
@@ -33,8 +34,28 @@ const serverExternalPackages = [
'xpath', 'xpath',
]; ];
// 仅在 Cloudflare 或非开发环境下排除 6b85c446 和 706b2fe 引入的 external 包;
// 其它未来加入的 server external 包不受影响。
const buildExcludedServerExternalPackages = [
'@upstash/redis',
'uncrypto',
'@vercel/postgres',
'better-sqlite3',
'cheerio',
'nodemailer',
'pg',
'redis',
'socket.io',
'xml2js',
'xpath',
];
const createNextConfig = (phase) => { const createNextConfig = (phase) => {
const isDevelopment = phase === PHASE_DEVELOPMENT_SERVER || process.env.NODE_ENV === 'development'; const isDevelopment = phase === PHASE_DEVELOPMENT_SERVER || process.env.NODE_ENV === 'development';
const effectiveServerExternalPackages =
isCloudflare || !isDevelopment
? serverExternalPackages.filter((pkg) => !buildExcludedServerExternalPackages.includes(pkg))
: serverExternalPackages;
const nextConfig = { const nextConfig = {
// Cloudflare Pages 不支持 standalone,使用默认输出 // Cloudflare Pages 不支持 standalone,使用默认输出
@@ -51,7 +72,9 @@ const createNextConfig = (phase) => {
experimental: { experimental: {
instrumentationHook: process.env.NODE_ENV === 'production' && !isCloudflare, instrumentationHook: process.env.NODE_ENV === 'production' && !isCloudflare,
optimizePackageImports: optimizedPackageImports, optimizePackageImports: optimizedPackageImports,
serverComponentsExternalPackages: serverExternalPackages, ...(effectiveServerExternalPackages.length
? { serverComponentsExternalPackages: effectiveServerExternalPackages }
: {}),
webpackBuildWorker: !isCloudflare, webpackBuildWorker: !isCloudflare,
}, },
@@ -106,6 +129,26 @@ const createNextConfig = (phase) => {
crypto: false, crypto: false,
}; };
// Cloudflare 使用 D1,不需要把 better-sqlite3 原生模块带入 Worker 产物。
if (isCloudflare) {
config.plugins.push(
new webpack.IgnorePlugin({
resourceRegExp: /^better-sqlite3$/,
})
);
config.resolve.alias = {
...config.resolve.alias,
'better-sqlite3': false,
};
config.externals = (config.externals || []).filter((external) => {
return !(
external &&
typeof external === 'object' &&
Object.prototype.hasOwnProperty.call(external, 'better-sqlite3')
);
});
}
// Exclude better-sqlite3, D1, and Postgres modules from client-side bundle // Exclude better-sqlite3, D1, and Postgres modules from client-side bundle
if (!isServer) { if (!isServer) {
config.externals = config.externals || []; config.externals = config.externals || [];