|
const { THEME } = require('./blog.config') |
|
const fs = require('fs') |
|
const path = require('path') |
|
const BLOG = require('./blog.config') |
|
|
|
const withBundleAnalyzer = require('@next/bundle-analyzer')({ |
|
enabled: BLOG.BUNDLE_ANALYZER |
|
}) |
|
|
|
|
|
|
|
|
|
|
|
|
|
function scanSubdirectories(directory) { |
|
const subdirectories = [] |
|
|
|
fs.readdirSync(directory).forEach(file => { |
|
const fullPath = path.join(directory, file) |
|
const stats = fs.statSync(fullPath) |
|
if (stats.isDirectory()) { |
|
subdirectories.push(file) |
|
} |
|
|
|
|
|
}) |
|
|
|
return subdirectories |
|
} |
|
|
|
const themes = scanSubdirectories(path.resolve(__dirname, 'themes')) |
|
module.exports = withBundleAnalyzer({ |
|
images: { |
|
|
|
formats: ['image/avif', 'image/webp'], |
|
|
|
domains: [ |
|
'gravatar.com', |
|
'www.notion.so', |
|
'avatars.githubusercontent.com', |
|
'images.unsplash.com', |
|
'source.unsplash.com', |
|
'p1.qhimg.com', |
|
'webmention.io', |
|
'ko-fi.com' |
|
] |
|
}, |
|
|
|
async redirects() { |
|
return [ |
|
{ |
|
source: '/feed', |
|
destination: '/rss/feed.xml', |
|
permanent: true |
|
} |
|
] |
|
}, |
|
async rewrites() { |
|
return [ |
|
{ |
|
source: '/:path*.html', |
|
destination: '/:path*' |
|
} |
|
] |
|
}, |
|
async headers() { |
|
return [ |
|
{ |
|
source: '/:path*{/}?', |
|
headers: [ |
|
{ key: 'Access-Control-Allow-Credentials', value: 'true' }, |
|
{ key: 'Access-Control-Allow-Origin', value: '*' }, |
|
{ |
|
key: 'Access-Control-Allow-Methods', |
|
value: 'GET,OPTIONS,PATCH,DELETE,POST,PUT' |
|
}, |
|
{ |
|
key: 'Access-Control-Allow-Headers', |
|
value: |
|
'X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version' |
|
} |
|
] |
|
} |
|
] |
|
}, |
|
webpack: (config, { dev, isServer }) => { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!isServer) { |
|
console.log('[加载主题]', path.resolve(__dirname, 'themes', THEME)) |
|
} |
|
config.resolve.alias['@theme-components'] = path.resolve(__dirname, 'themes', THEME) |
|
return config |
|
}, |
|
experimental: { |
|
scrollRestoration: true |
|
}, |
|
exportPathMap: async function (defaultPathMap, { dev, dir, outDir, distDir, buildId }) { |
|
|
|
const pages = { ...defaultPathMap } |
|
delete pages['/sitemap.xml'] |
|
return pages |
|
}, |
|
publicRuntimeConfig: { |
|
NODE_ENV_API: process.env.NODE_ENV_API || 'prod', |
|
THEMES: themes |
|
} |
|
}) |
|
|