Next.js如何忽略应用程序中的整个文件夹?

5

在下一个13上,当nextConfig.output为"export"时,在构建过程中app/api文件夹会出现错误。

在我的项目中,根据环境变量需要不同的构建类型。

有没有办法在"output"为"export"时忽略"api"文件夹的构建?

当我以nextConfig.output为"export"运行构建时,我遇到以下错误:

导出在以下路径上遇到错误: /api/revalidate/route:/api/revalidate

src/app/api/revalidate/route.ts文件

import { NextRequest, NextResponse } from 'next/server';
import { revalidateTag } from 'next/cache';
 
export async function GET(request: NextRequest) {
  const tag = request.nextUrl.searchParams.get('tag');
  if(tag){
    revalidateTag(tag);
  }
  return NextResponse.json({ revalidated: true, now: Date.now() });
}

Next.config.js

/** @type {import('next').NextConfig} */
const nextConfig = {
  output: process.env.NEXT_OUTPUT_MODE,
};

module.exports = nextConfig;

可复现的代码库

这里有一个代码库,可以用来复现这个错误 https://github.com/zeckaissue/next-export-api-crash


你能展示/api/revalidate/route吗? - Youssouf Oumar
你能展示/api/revalidate/route吗? - undefined
3个回答

3
我找到了一个解决办法,使用ignore-loader。但也许有一种更好的方法可以通过next.js的内置功能来实现我的目标。
这是我的更新后的next.config.js。
/** @type {import('next').NextConfig} */
const nextConfig = {
  output: process.env.NEXT_OUTPUT_MODE,
  /**
   *
   * @param {import('webpack').Configuration} config
   * @param {import('next/dist/server/config-shared').WebpackConfigContext} context
   * @returns {import('webpack').Configuration}
   */
  webpack: (config) => {
    if (process.env.NEXT_OUTPUT_MODE !== "export" || !config.module) {
      return config;
    }
    config.module.rules?.push({
      test: /src\/app\/api/,
      loader: "ignore-loader",
    });
    return config;
  },
};

module.exports = nextConfig;


2
目前看来,这似乎是目前可用的最佳解决方案。 - Mayank Kumar Chaudhari
@Zecka,当你运行npm run build时,文件夹没有被包含进去对吧?你在尝试访问时是否遇到了这个错误?应用程序错误:发生了一个客户端异常(请查看浏览器控制台获取更多信息)。 - ANOOP NAYAK
我已经添加了这个,但是我的 'npm run build' 仍然失败。我想忽略项目根目录下 'externals' 文件夹下的所有内容。/** @type {import('next').NextConfig} */ const nextConfig = { output: 'standalone', webpack: (config) => { config.module.rules.push({ test: /.*externals.*/, // 也尝试过 /externals\/.*/ 和 /externals/ loader: "ignore-loader", }); return config; }, }; module.exports = nextConfig;编译失败。 ./externals/helpers.ts:59:29 - undefined
如果你需要帮助,请发送一个可复现的 GitHub 仓库给 @tot。 - undefined
问题解决了。我的问题不是webpack,而是TS编译器。在tsconfig.json中添加一个排除项解决了这个问题。 - undefined

0
你可以在Next.js的配置文件(next.config.js)中使用ignore选项。 如果你还没有创建配置文件,你需要先创建一个。 打开next.config.js文件并添加以下代码:
module.exports = {
  webpack: (config, { isServer }) => {
    if (!isServer) {
      config.module.rules.push({
        test: /YOUR FOLDER NAME\/.*/,
        loader: 'ignore-loader',
      });
}

这基本上是和我的解决方案一样的。不确定为什么你加了“isServer”的条件? - ZecKa
在 Next.js 中,webpack 配置中添加了 isServer 选项,用于区分服务器端和客户端构建。希望这对你有所帮助! - Syed Asif

-4
这是我的答案。
/** @type {import('next').NextConfig} */
const nextConfig = {
  output: process.env.NEXT_OUTPUT_MODE,
  exclude: [/node_modules/, /api/], // Add this line to exclude the api folder
};

module.exports = nextConfig;

看起来,在下一个13个配置中没有“exclude”属性。https://nextjs.org/docs/app/api-reference/next-config-js。在可复现的存储库上尝试,这个解决方案将不起作用。 - ZecKa
你的一些回答似乎很可能完全或部分由人工智能(例如ChatGPT)编写,并且@ZecKa指出这是GPT的"幻觉"。请注意,在这里禁止发布由人工智能生成的内容。如果你在任何回答中使用了人工智能工具,我鼓励你删除它。谢谢! - NotTheDr01ds
读者应该仔细而批判性地审查这个答案,因为由人工智能生成的信息常常包含基本错误和错误信息。如果您观察到质量问题,并且/或有理由相信这个答案是由人工智能生成的,请相应地提供反馈。审核团队需要您的帮助来识别质量问题。 - NotTheDr01ds

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接