为什么在npm install后package-lock.json中包名前有node_modules前缀?

环境: linux node 16.20.2(docker 镜像编译)
发现npm install后 生成的 package-lock.json ,包名前面会增加node_modules ,例如下所示:

        "node_modules/@akryum/winattr": {
            "version": "3.0.0",
            "resolved": "https://registry.npmmirror.com/@akryum/winattr/-/winattr-3.0.0.tgz",
            "integrity": "sha512-t4WmWoGV9gyzypwG3y3JlcK2t8fKLtvzBA7xEoFTj9SMPvOuLsf13uh4ikK0RRaaa9RPPWLgFUdOyIRaQvCpwQ==",
            "requires": {
                "fswin": "^2.17.1227"
            }
        }

不是应该是 "@akryum/winattr" 而不是 "node_modules/@akryum/winattr" ?有熟悉的同学吗?

不是应该是 "@akryum/winattr" 而不是 "node_modules/@akryum/winattr" ?有熟悉的同学吗?

阅读 3.5k
2 个回答

这是 npm 7 及以上版本的一个新特性。npm 7 引入了一个新的 package-lock.json 格式,其中包含了 node_modules 前缀。这个变化的目的是为了更好地表示依赖关系的层次结构和路径。
如果希望恢复到旧的格式,可以用以下两种方法:
1.降级 npm 版本: 使用 npm 6 或更低版本。
2.配置 npm: 在项目的根目录下创建一个 .npmrc 文件,并添加以下内容:

legacy-peer-deps=true

只有最初一版(看 lockfileVersion 那个字段)的 package-lock.json 才是你说的格式,从 npm v7 开始就已经是现在这样了。

node v16.x 自带的已经是 npm v8 了。


REF: https://docs.npmjs.com/cli/v8/configuring-npm/package-lock-js...

The root project is typically listed with a key of "", and all other packages are listed with their relative paths from the root project folder.

注意我加粗的部分,就是相对路径。

而为啥是相对路径呢?因为 npm v7 开始支持 monorepo 了,一个项目底下可能会有好几个嵌套的 node_modules 目录,要是光写个包名、不把路径写全了它上哪儿找去?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏