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 }) /** * 扫描指定目录下的文件夹名,用于获取所有主题 * @param {*} directory * @returns */ 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) } // subdirectories.push(file) }) return subdirectories } // 扫描项目 /themes下的目录名 const themes = scanSubdirectories(path.resolve(__dirname, 'themes')) module.exports = withBundleAnalyzer({ images: { // 图片压缩 formats: ['image/avif', 'image/webp'], // 允许next/image加载的图片 域名 domains: [ 'gravatar.com', 'www.notion.so', 'avatars.githubusercontent.com', 'images.unsplash.com', 'source.unsplash.com', 'p1.qhimg.com', 'webmention.io', 'ko-fi.com' ] }, // 默认将feed重定向至 /public/rss/feed.xml 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 }) => { // Replace React with Preact only in client production build // if (!dev && !isServer) { // Object.assign(config.resolve.alias, { // react: 'preact/compat', // 'react-dom/test-utils': 'preact/test-utils', // 'react-dom': 'preact/compat' // }) // } // 动态主题:添加 resolve.alias 配置,将动态路径映射到实际路径 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 }) { // 导出时 忽略/pages/sitemap.xml.js , 否则报错getServerSideProps const pages = { ...defaultPathMap } delete pages['/sitemap.xml'] return pages }, publicRuntimeConfig: { // 这里的配置既可以服务端获取到,也可以在浏览器端获取到 NODE_ENV_API: process.env.NODE_ENV_API || 'prod', THEMES: themes } })