我应该使用npm install还是npm update来保持代码更新?

6

我正在处理一些工作空间内的项目,并注意到我的许多依赖项已经大约三年没有更新,包括React本身。我担心的是,如果我运行npm installnpm update,可能会导致出现各种问题。在我的情况下,我想知道是最好运行npm installnpm update还是保持原样?(我确定没有人会推荐这种做法)。

这是我们的package.json文件:

{
  "name": "my-app",
  "version": "0.0.2",
  "main": "index.js",
  "license": "MIT",
  "scripts": {
    "start": "node src/entry",
    "start-dev": "npm-run-all --parallel build babel-node",
    "serve": "live-server public/",
    "build-linux": "clear && webpack && clear && yarn build-server && clear && yarn start",
    "build-windows": "cls && webpack && cls && yarn build-server && cls && yarn start",
    "build-server": "babel src/server -d src",
    "dev-server": "webpack-dev-server",
    "babel-node": "nodemon --exec babel-node src/server.js"
  },
  "dependencies": {
    "aws-sdk": "^2.358.0",
    "axios": "^0.19.0",
    "babel-cli": "^6.26.0",
    "babel-core": "^6.26.3",
    "babel-loader": "7.1.1",
    "babel-plugin-transform-class-properties": "6.24.1",
    "babel-polyfill": "^6.26.0",
    "babel-preset-env": "^1.7.0",
    "babel-preset-react": "6.24.1",
    "babel-preset-stage-0": "^6.24.1",
    "bcryptjs": "^2.4.3",
    "body-parser": "^1.18.2",
    "core-js": "^2.5.3",
    "css-loader": "0.28.4",
    "express": "latest",
    "file-loader": "^1.1.5",
    "fs": "0.0.1-security",
    "google-maps-react": "^1.1.4",
    "html2canvas": "^1.0.0-rc.3",
    "image-webpack-loader": "^4.6.0",
    "immutability-helper": "^2.4.0",
    "jquery": "^3.4.1",
    "jsonwebtoken": "^8.1.0",
    "jspdf": "^1.5.3",
    "lodash": "^4.17.14",
    "moment": "^2.22.2",
    "node-sass": "^4.11.0",
    "nodemailer": "^4.7.0",
    "normalize.css": "7.0.0",
    "npm": "^6.10.1",
    "promise-mysql": "^3.1.0",
    "prop-types": "^15.6.0",
    "react": "^16.0.0",
    "react-csv": "^1.0.14",
    "react-dom": "^16.0.0",
    "react-router-dom": "4.2.2",
    "react-scripts": "^2.1.3",
    "sass-loader": "6.0.6",
    "socket.io": "^2.0.3",
    "style-loader": "0.18.2",
    "table2csv": "^1.1.1",
    "twilio": "^3.24.0",
    "validator": "8.0.0",
    "webpack": "^3.12.0",
    "webpack-dev-middleware": "^3.5.0",
    "webpack-dev-server": "^3.1.14"
  },
  "devDependencies": {
    "concurrently": "^3.5.0",
    "npm-run-all": "^4.1.1"
  }
}

我已经尝试更新react和react-dom版本到最新,但我开始收到有关componentWillMount和componentWillReceiveProps过时的警告。 我尝试更新react-router-dom以消除其中一些警告,因为它们指向像这样的内容,但这并没有压制它们。
如果有人知道我应该采取的最佳方法是什么,以及npm install与npm update对我的系统会产生什么影响,那就太好了。我知道它们各自能够做什么,但我只是想小心谨慎,并想知道在我的情况下哪个更好。谢谢。

你没有使用包锁定吗?你如何保证其他人接收你的代码并运行 npm install 会得到与你相同且经过测试的 node_modules 呢? - jarmod
@jarmod 坦率地说,可能不行。请记住我在这家公司工作之前,这些代码就已经存在了,所以我正在努力修复他们应该一直在做的事情。 - Michael
永远不晚开始;-) 像 ^1.1.4 这样的版本带来的挑战是,未来有人克隆你的代码并运行 npm install 几乎没有机会得到与你使用和测试的相同版本的代码。因此,他们可能会遭受引入问题的小版本发布的影响。这不应该发生,但确实会发生。所以他们的 npm install 就像你的 npm update 一样——你们两个都处于未知领域。如果软件包供应商没有犯任何错误,那么你就没问题了。你甚至可能通过获得错误修复和安全补丁来改善事情。 - jarmod
这个回答解决了你的问题吗?如何更新Node.js包? - Heretic Monkey
2个回答

11
当您在项目上运行npm install时,npm会安装符合package.json文件中语义化版本范围的最新版本。在初始安装后,重新运行npm install不会更新已存在的包,因为npm已经发现这些包的满足版本已安装在文件系统上。
当您运行npm update时,它会更新已经安装的包。npm在运行npm update时,检查仓库中是否有满足指定的语义化版本范围的新版本,并将其安装。
我建议您“迎难而上”,并将它们更新到最新版本。这可能是个繁琐的任务,但如果您希望保持更长时间的维护,那么这是最好的选择。

那你的意思是我应该运行npm update吗?如果它确实破坏了很多东西,有没有一种方法可以恢复更新? - Michael
2
nom 更新不会获取软件包的最新版本。它遵循语义化版本控制。您需要使用类似以下链接的内容将所有内容更新到最新版本 https://www.npmjs.com/package/npm-check-updates - Ashish Modi
1
npm update 可以获取最新版本,但根据依赖项的版本语义,可能会破坏很多东西。默认行为(例如 ^1.4.0 版本)将更新次要版本,直到无法更新主要版本为止。由于次要版本可能包含 semver 中的重大更改,因此有可能破坏您的代码。npm install 不会触及已安装的软件包,但会像 npm update 一样安装最高兼容版本的新软件包。 - Klaycon

3

更新软件可能会导致一些问题,或者在更新后某些依赖项将被弃用。除非必要,否则我不会更新任何东西。


老实说,我认为Material UI不支持低于React v16.3的任何版本,并且我也没有看到对React Bootstrap的支持。 - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接