CPanel主机部署Next.js项目时npm依赖冲突问题求助
CPanel主机部署Next.js项目时npm依赖冲突问题求助
各位大佬好,我最近在CPanel上部署Next.js项目时,安装npm依赖一直报错,折腾了好几种方法都没解决,特意来求助!
报错信息
执行npm install时出现以下依赖冲突错误:
npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! Found: next@13.5.3 npm ERR! node_modules/next npm ERR! next@"^13.4.15" from the root project npm ERR! npm ERR! Could not resolve dependency: npm ERR! peer next@"2 - 5" from next-router@1.3.6 npm ERR! node_modules/next-router npm ERR! next-router@"^1.3.6" from the root project npm ERR! npm ERR! Fix the upstream dependency conflict, or retry npm ERR! this command with --force, or --legacy-peer-deps
我已经尝试过的方法
- 更新所有npm包到最新版本
- 执行
npm config set legacy-peer-deps true后重新安装依赖,但问题依然存在
我的CPanel环境信息
- 架构: x86_64
- 操作系统: Linux
- Perl版本: 5.26.3
- 内核版本: 4.18.0-372.16.1.lve.el8.x86_64
项目相关代码文件
server.js
const { createServer } = require('http') const { parse } = require('url') const next = require('next') const dev = process.env.NODE_ENV !== 'production' const hostname = process.env.NODE_ENV !== "production" ? "localhost" : "website.com" const port = process.env.PORT || 4790 // when using middleware hostname and port must be provided below const app = next({ dev, hostname, port }) const handle = app.getRequestHandler() app.prepare().then(() => { createServer(async (req, res) => { try { // Be sure to pass true as the second argument to url.parse. // This tells it to parse the query portion of the URL. const parsedUrl = parse(req.url, true) const { pathname, query } = parsedUrl if (pathname === '/a') { await app.render(req, res, '/a', query) } else if (pathname === '/b') { await app.render(req, res, '/b', query) } else { await handle(req, res, parsedUrl) } } catch (err) { console.error('Error occurred handling', req.url, err) res.statusCode = 500 res.end('internal server error') } }) .once('error', (err) => { console.error(err) process.exit(1) }) .listen(port, () => { console.log(`> Ready on http://${hostname}:${port}`) }) })
package.json
{ "name": "mywebsite", "version": "0.1.0", "private": true, "homepage": "https://website.ge", "scripts": { "dev": "next dev", "build": "next build", "start": "NODE_ENV=production node server.js", "lint": "next lint" }, "dependencies": { "@headlessui/react": "^1.7.16", "@next-auth/prisma-adapter": "^1.0.7", "@prisma/client": "^5.1.1", "@semcore/ui": "^15.24.0", "@studio-freight/lenis": "^1.0.19", "@types/node": "20.4.9", "@types/react": "18.2.20", "@types/react-dom": "18.2.7", "autoprefixer": "10.4.14", "axios": "^1.5.0", "bcrypt": "^5.1.0", "eslint": "8.46.0", "eslint-config-next": "13.4.13", "framer-motion": "^10.15.2", "i": "^0.3.7", "i18next": "^23.4.4", "next": "^13.4.15", "next-auth": "^4.22.5", "next-intl": "^3.0.0-beta.10", "next-navigation": "^1.0.6", "next-router": "^1.3.6", "npm": "^9.8.1", "popper.js": "^1.16.1", "postcss": "8.4.27", "prisma": "^5.1.1", "react": "18.2.0", "react-dom": "18.2.0", "react-hook-form": "^7.45.4", "react-hot-toast": "^2.4.1", "react-icons": "^4.10.1", "react-phone-number-input": "^3.3.6", "react-spinners": "^0.13.8", "swiper": "^10.1.0", "tailwindcss": "3.3.3", "typescript": "5.1.6", "usehooks-ts": "^2.9.1", "zustand": "^4.4.1" }, "devDependencies": { "@types/bcrypt": "^5.0.0", "@types/leaflet": "^1.9.3", "@types/react-date-range": "^1.4.4", "autoprefixer": "^10.4.14", "postcss": "^8.4.21", "prisma": "^4.11.0", "tailwindcss": "^3.2.7" }, "browser": { "fs": false, "path": false, "os": false } }
schema.prisma
generator client { provider = "prisma-client-js" binaryTargets = ["debian-openssl-3.0.x"] } datasource db { provider = "mysql" url = env("DATABASE_URL") }
问题分析
从报错信息能看出,冲突的核心是next-router@1.3.6这个依赖包的peer依赖要求Next.js版本在2-5之间,但我当前项目用的是Next.js 13.5.3,版本差距极大。这个next-router应该是一个很久没维护的第三方路由包,和现在的Next.js完全不兼容,而且Next.js本身已经自带了完善的路由系统(Pages Router和App Router),根本不需要这个第三方包。
求各位大佬给点解决方案建议
比如是不是应该直接移除这个next-router?如果移除的话,项目里用到它的代码要怎么替换成Next.js官方的路由方式?或者有没有其他办法能解决这个依赖冲突?
备注:内容来源于stack exchange,提问作者Aleksandre Geladze




