优化cloudflare体积
This commit is contained in:
+44
-1
@@ -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 || [];
|
||||||
|
|||||||
Reference in New Issue
Block a user