Next.js 11.0.0是否支持桶(索引)文件?

mdfafbf1  于 2022-11-29  发布在  其他
关注(0)|答案(1)|浏览(110)

桶/索引文件在与next.js一起使用时似乎会产生问题。它似乎不确定是单纯的webpack问题还是webpack和next.js两者都有问题
根据this issue,如果我们使用桶文件,树抖动停止工作。我还创建了a small repo,在那里我有一个索引文件的问题。不确定这是一个树抖动的问题。
重现问题的步骤:

  • npm install
  • npm run dev
  • 在浏览器中,访问http://localhost:3000/about-pro,预期会在浏览器控制台中看到包含错误或警告空白页面
  • 转到服务器的控制台(运行npm run dev的位置)
  • 请参见错误“* 找不到模块:无法解析'fs'*”(1)(2)(3)

1-这来自getAboutPageData文件中的await serialize。它本身只在getStaticProps中调用
2 -在谷歌上搜索这个问题,你会找到解决方案,比如修改next.config.js文件。它仍然不起作用。请随意取消注解next.config.js文件,自己看看
3 -要“解决”该问题,请转到about-pro.tsx,在导入中,从其自身的文件而不是从桶/索引文件导入AboutPage
如果我只从barrel/index文件导入getAboutPageData,那么它工作得很好。但是一旦我从它导入eidogg. AboutPage,它就开始引发不相关的问题。
我可以继续在next.js中使用barrel/index文件吗?如果可以,有没有简单直观的方法可以做到这一点?

bhmjp9jg

bhmjp9jg1#

问题不在于barrel文件本身,而在于与barrel文件结合使用的library
如果您查看readme文件https://github.com/hashicorp/next-mdx-remote#examples,您会发现一条警告:
重要提示:将mdx-remote代码放入一个单独的“utilities”文件时要非常小心。这样做可能会导致nextjs的代码拆分能力出现问题--它必须能够清楚地确定哪些代码只在服务器端使用,哪些代码应该留在客户端包中。如果您将mdx-remote代码放入一个外部的utilities文件中,而某些代码被破坏了,请删除它并在提交问题之前从上面的简单示例开始。
因此,为了使代码正常工作,需要从桶文件中删除getAboutPageData的导出,如下所示:

export { default as AboutPage } from './AboutPage';
// export { default as getAboutPageData } from './getAboutPageData';

并将使用该库的代码移动到about-pro.tsx文件中。

import { AboutPage } from '../modules/about';
import { serialize } from 'next-mdx-remote/serialize';

const AboutPro = (props) => {
  return <AboutPage {...props} />;
};

export const getStaticProps = async () => {
  const serializedContent = await serialize(`# Header1`);
  const data = serializedContent;
  return { props: {} };
};

export default AboutPro;

我认为问题是在barrel文件中导入的模块在客户端服务器端都执行。可能从barrel文件中删除副作用可以解决这个问题,但是我对Next.js的了解还不够,无法正确执行。

相关问题