前后端可以共用一个package.json吗?
Can the frontend and backend share the same package.json?
我有一个小的个人项目,我正在一个单一的 repo 中开发它。
后端是 Node.js 服务器,前端是 Vue.js 应用程序。
我希望他们都共享同一个 package.json
我想这样做的唯一原因是因为我想使用那个通用 package.json 的 "scripts: {}"
来执行引用后端或前端模块的命令。
这可能吗?
这个结构是否有意义并且有效:
- my-project
- front
- {Vue.js files & folders}
- back
- {files & folders for my server}
- package.json (containining dependencies and yarn scripts for both front and back)
但这是否也意味着当例如Vite/Vue 编译用于生产的 .js 文件它也会“意外地”包含不相关的 node_modules 实际上只供后端使用?
更新:
我试过了,它非常干净直接,而且工作正常。
如果有人感兴趣,我会在这里发布:
- /root
- /back (contains server files & folders)
- /front (contains Vue.js files & folders)
- package.json
- .eslintrc.cjs
- .gitignore
- vite.config.js
- yarn.lock
// contents of package.json
{
......,
...,
"type": "module",
"scripts": {
"back:start": "nodemon --experimental-modules --es-module-specifier-resolution=node ./back/server.js",
"front:start": "vite",
"front:build": "vite build",
"lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs --fix --ignore-path .gitignore",
"start": "yarn front:build && yarn back:start"
},
"dependencies": {
.....,
...
},
"nodemonConfig": {
"ignore": [...]
},
"engines": {
"node": "^16.14.0"
}
}
我按原样在 Heroku 上部署上述内容,Heroku 只需调用 yarn start
即可构建和部署应用程序。 (你会注意到我没有“devDependencies”,那是因为 Heroku 忽略了“devDependencies”下的所有内容,包括 vite)
是的,这是可能的,而且实际上很常见。这种使用模式在 JS 社区中通常被称为 monorepo。通常的做法就是你描述的文件夹结构。
包括 Vue 在内的大多数前端框架都旨在处理此问题,但大多数常用工具都假定您的前端与后端是分开的。您可能需要手动配置前端框架才能执行此操作。
需要考虑的一些事项:
- 前端开发服务器(例如 webpack)可能需要配置为在子目录(例如“前端”)中搜索文件。
- 您可能希望将所有前端模块安装为
--save--dev
,以便在部署后端时可以跳过它们。
除了共享 package.json 文件(因此,一个常见的 npm run
工作流程)之外,这当然还有其他优势。一个优点是您可以在前端和后端之间共享库。我通常有这样的结构:
├ .git
├ package.json
├ frontend/ - frontend project
│ ├ src/ - source files
│ └ public/
├ backend/ - backend project
│ ├ controllers/ - endpoint modules
│ └ lib/ - backend models/modules
└ lib/ - shared modules
在我的 package.json 我通常至少有这样的东西:
{
"scripts": [
"frontend": "cd frontend; webpack serve",
"backend": "cd backend; nodemon main.js"
]
}
npm 命令甚至看起来很自然:
npm run backend
npm run frontend
我通常使用 javascript 脚本将后端和前端 运行 结合在一起,以减少我 Windows 使用同事的问题。所以我的开始脚本通常只是:
{
"scripts": [
"start": "node ./scripts/start.js"
]
}
.. 但是编写这样的启动脚本会使这个答案的长度增加一倍以上(已经很长了)所以我把它留给你的创造力。
我有一个小的个人项目,我正在一个单一的 repo 中开发它。
后端是 Node.js 服务器,前端是 Vue.js 应用程序。
我希望他们都共享同一个 package.json
我想这样做的唯一原因是因为我想使用那个通用 package.json 的 "scripts: {}"
来执行引用后端或前端模块的命令。
这可能吗?
这个结构是否有意义并且有效:
- my-project
- front
- {Vue.js files & folders}
- back
- {files & folders for my server}
- package.json (containining dependencies and yarn scripts for both front and back)
但这是否也意味着当例如Vite/Vue 编译用于生产的 .js 文件它也会“意外地”包含不相关的 node_modules 实际上只供后端使用?
更新: 我试过了,它非常干净直接,而且工作正常。 如果有人感兴趣,我会在这里发布:
- /root
- /back (contains server files & folders)
- /front (contains Vue.js files & folders)
- package.json
- .eslintrc.cjs
- .gitignore
- vite.config.js
- yarn.lock
// contents of package.json
{
......,
...,
"type": "module",
"scripts": {
"back:start": "nodemon --experimental-modules --es-module-specifier-resolution=node ./back/server.js",
"front:start": "vite",
"front:build": "vite build",
"lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs --fix --ignore-path .gitignore",
"start": "yarn front:build && yarn back:start"
},
"dependencies": {
.....,
...
},
"nodemonConfig": {
"ignore": [...]
},
"engines": {
"node": "^16.14.0"
}
}
我按原样在 Heroku 上部署上述内容,Heroku 只需调用 yarn start
即可构建和部署应用程序。 (你会注意到我没有“devDependencies”,那是因为 Heroku 忽略了“devDependencies”下的所有内容,包括 vite)
是的,这是可能的,而且实际上很常见。这种使用模式在 JS 社区中通常被称为 monorepo。通常的做法就是你描述的文件夹结构。
包括 Vue 在内的大多数前端框架都旨在处理此问题,但大多数常用工具都假定您的前端与后端是分开的。您可能需要手动配置前端框架才能执行此操作。
需要考虑的一些事项:
- 前端开发服务器(例如 webpack)可能需要配置为在子目录(例如“前端”)中搜索文件。
- 您可能希望将所有前端模块安装为
--save--dev
,以便在部署后端时可以跳过它们。
除了共享 package.json 文件(因此,一个常见的 npm run
工作流程)之外,这当然还有其他优势。一个优点是您可以在前端和后端之间共享库。我通常有这样的结构:
├ .git
├ package.json
├ frontend/ - frontend project
│ ├ src/ - source files
│ └ public/
├ backend/ - backend project
│ ├ controllers/ - endpoint modules
│ └ lib/ - backend models/modules
└ lib/ - shared modules
在我的 package.json 我通常至少有这样的东西:
{
"scripts": [
"frontend": "cd frontend; webpack serve",
"backend": "cd backend; nodemon main.js"
]
}
npm 命令甚至看起来很自然:
npm run backend
npm run frontend
我通常使用 javascript 脚本将后端和前端 运行 结合在一起,以减少我 Windows 使用同事的问题。所以我的开始脚本通常只是:
{
"scripts": [
"start": "node ./scripts/start.js"
]
}
.. 但是编写这样的启动脚本会使这个答案的长度增加一倍以上(已经很长了)所以我把它留给你的创造力。