You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动