如何在Next.js应用程序上将页面组件隔离到多个`/pages`目录中

btxsgosb  于 2023-06-29  发布在  其他
关注(0)|答案(3)|浏览(171)

我最近用Next.js开始了我的第一个项目,从那时起,我的pages目录增长了很多。现在,我想将页面分开并将它们分组为模块,最后得到类似'src/modules/*/pages/*'的内容。
在研究这个主题时,我遇到了exportPathMap,我可以在next.config.js文件中包含一个函数,然后将自定义路径Map到我的页面,但似乎我需要为我创建的每个页面添加一个新路径,这并不理想。我想给予Next一个表达式,比如'src/modules/*/pages/*',让它为我解析页面和路由(就像你在使用TypeORM时在ormconfig.json文件中Map实体一样)。
我想我可以直接在pages中对页面组件进行分组,就像pages/a-module/*一样,但我也有组件、钩子和其他逻辑,我想将它们隔离到模块中。我也可以尝试使用Node的fs来遍历我的项目文件结构并Map页面文件夹,但如果可能的话,我想避免这样做。

v2g6jxz6

v2g6jxz61#

您可以使用符号链接。每个模块都需要一个,但模块中的每个嵌套路径都不需要一个。您的目录结构如下所示:

├── modules
│   ├── bar
│   │   └── pages
│   │       ├── first.js
│   │       └── second.js
│   └── foo
│       └── pages
│           ├── first.js
│           └── second.js
├── pages
│   ├── _app.js
│   ├── bar -> ../modules/bar/pages
│   ├── foo -> ../modules/foo/pages
│   ├── index.js

最后会有路由:

/bar/first
/bar/second
/foo/first
/foo/second

但我不知道这对你有什么好处。现在,您的modules文件夹将具有与pages相同的混乱。您不必在pages中的文件中包含所有组件内容。它可以是简单的:

// pages/foo/first.js
import FirstContent from '../../modules/FirstContent'

export default function First() {
  return <FirstContent />
}
wsewodh2

wsewodh22#

这是Next.js团队不允许的,原因在这篇文章和那里引用的文章中解释。在决定是否真的要破解文件结构之前,您可以阅读一些讨论。

iecba09b

iecba09b3#

正如@Roman Mkrtchian提到的,你不应该这样做。我的建议是,如果你想像我一样将你的文件组织成模块,创建一个类似于下面的文件结构:

src
├── modules
│    ├── foo
│    |   └── pages
|    |       ├── one
|    |       |   ├── index.jsx
|    |       |   └── styles.js <- For `styled-components`; could be a css file
|    |       └── two
|    |           ├── index.jsx
|    |           └── styles.js
|    └── bar
|        └── pages
|            └── three
|                ├── index.jsx
|                └── styles.js 
├── shared
└── ...

你应该采取另一种方法。正如@erich2k8所说,您不需要将所有组件内容都放在/pages内部的文件中,您可以创建与上面相同的结构,但将/pages直接添加到src

src
├── modules
├── shared
└── pages
    ├── foo
    |   ├── one.jsx
    |   └── two.jsx
    └── bar
        └── three.jsx

例如,在src/pages/foo/one.jsx中,您将导入src/modules/foo/pages/one,如下所示:

import OneContent from '../../modules/foo/pages/one';

const One = () => <OneContent />;

export default One;

是的,您仍然需要为在/modules中创建的每个页面创建一个新文件,但它使您避免了扰乱Next行为的真正糟糕的时间。

相关问题