如何在MERN中组织后端和前端的文件结构

IT技术 node.js reactjs express npm
2021-04-12 15:35:56

我有基于 express + mongoose 的后端。文件结构为:

- /models
-- item.js
- /node.modules
-- ...
- server.js
- package-lock.json
- package.json

以及用于前端的常规基于 create-react-app 的文件夹:

- /src
-- /assets
--- index.css
-- /components
--- Somecomponent.js
-- /containers
--- App.js
-- /reducers
--- somereducers.js
- /node.modules
-- ...
-- index.js
-- registerServiceWorker.js
- .gitignore
- package-lock.json
- package.json

我想以适当的方式一起使用它。我想这样组织它:

- /client 
-- /src
...
-- index.js
-- registerServiceWorker.js
- .gitignore
- package-lock.json
- package.json

- /server
- /models
-- item.js
- /node.modules
-- ...
- server.js
- package-lock.json
- package.json

在这个阶段我卡住了。如果客户端文件夹位于服务器文件夹内或服务器文件夹位于客户端,我可以创建它。1.但是当两个文件夹是兄弟时如何让它运行?2. package.json 应该是什么以及 node.modules 应该在哪里(服务器和客户端是否应该拥有自己的 package.json 和module?)

3个回答

最基本的结构将有一个root包含文件夹frontendbackend文件夹。既然您在谈论MERN堆栈,那么您将拥有后端环境package.json内部NodeJS事物package.jsonReact一面。后端服务器和前端客户端是两个完全独立的东西,所以是的,它们都有自己的 node_modules 文件夹。在后端,你可能已经安装了类似Express为您的节点运行时,Mongoose一个更便捷的方式跟你的MongoDB,等,并在您的前端,你有你React 为你的前端框架,Redux用于状态管理等。此外,根据您在 package.json 文件中已经列出的内容,当您npm install 单独运行时,它将安装在这两个文件夹中。如果要安装其他软件包,只需npm install + "the name of the package"在需要它的特定文件夹(后端或/和前端)内运行(不带“+”和引号)。

我希望这可以帮到你。查看图片,尤其是第二张。

应用结构
在此处输入图片说明

文件夹结构

在此处输入图片说明

更新:

在开发中,我建议安装两个额外的东西:

  1. npm i -D nodemon
  2. npm i -D concurrently

注意:该-D标志会将它们安装为devDependencies.

nodemon将跟踪每个文件更改并为您重新启动后端服务器。因此,很明显它应该安装在“后端”文件夹中。您所要做的就是进入package.json文件(后端)并添加一个新脚本。像这样的东西:

"scripts": {
"start": "node app.js",  // in production
"dev": "nodemon app.js", // in development
}

concurrently允许您同时启动前端和后端。我建议在顶级文件夹中初始化一个新的 Node 项目- [包含前端和后端的文件夹]。您可以使用npm init命令执行此操作,然后在那里安装concurrently软件包。

现在,打开文件夹中新创建的package.json文件并编辑开始部分,如下所示:

   "scripts": {
       "dev": "concurrently \"cd backend && npm run dev\" \"cd frontend && npm start\" "
   }

这将做的是进入后端文件夹并运行dev命令(与我们刚刚配置的相同),以便启动nodemon此外,它还将进入前端文件夹并运行默认start命令 - 这正是我们想要的。

如果您保留文件夹结构,安装所有依赖项(包括我上面提到的另外两个),更改package.json文件root内的文件,您将能够使用一个简单的命令启动它们:

npm run dev // 执行此操作时,请确保您位于根文件夹内:)

这是非常有帮助的。如何使用一个npm start命令同时运行后端和前端
2021-06-02 15:35:56
@Icode4food 编辑器:带有Custome 主题的VS Code(意味着我自己更改了用户首选项)。您也可以通过按CTRL + P 来完成,在搜索框中输入并编辑您可能想要自定义以满足您的需要的所有其他内容。我有很多:) ...顺便说一下,对于图标,我使用的是material-icon-theme如果您想避免我建议的所有内容,请安装一个名为One Dark Pro Monokai Darker的主题跟我得到的有点像 干杯;)> Preferences: Open user settingseditor.tokenColorCustomizations, workbench.colorCustomizations
2021-06-04 15:35:56
@ImOnlyVueman 快乐是我的。相信我。到最后,一切都结束了JavaScript,对吧?- 所以,它是 React、Angular 还是 Vue 并不重要,这完全取决于架构和可扩展性。祝你有个好的一天 ;)
2021-06-04 15:35:56
@Bigga_HD,您是否建议将根文件夹上传到单个 GitHub 存储库或两个单独的存储库?
2021-06-10 15:35:56
当然,我会用这些信息更新我以前的答案,如果这也有帮助,请接受我的答案;)
2021-06-18 15:35:56

添加到已接受的答案中,如果前端和后端内部的文件夹结构划分基于业务逻辑而不是技术逻辑,则它会更有用。

将整个堆栈划分为最好不要在它们之间共享文件的自包含组件是使您的应用程序更具可测试性和易于更新的最佳方式。这就是通常所说的微服务架构。

糟糕的设计:难以更新和测试
文件夹结构的糟糕设计

良好的设计:易于更新和测试

良好的文件夹结构设计

这有点基于 django 文件结构,我发现它更容易测试和更新。每个业务组件都是一个“应用程序”。根据业务逻辑分开而不是将相同类型(类)放在一起更容易在更大的团队中维护,恕我直言。重构变得更容易,关注点的分离更清晰,领域边界更清晰。
2021-06-08 15:35:56
这个答案让我很感兴趣,但我觉得它缺乏理由。能不能给我这样的新手解释得好一点?
2021-06-12 15:35:56

根据您的要求使用结构,例如基于项目范围或深度。但是请确保将端点和模型分开,因此最初有这样的设置

src/
controllers - for the endpoints
models - for the schema
server.js - or index.js