想安装包,安装目录node_modules中已经有了,但是package.json中还没。这种情况需要再安装包吗?

项目中想用到某个包,比如js-base64。
安装目录node_modules中已经有了,但是package.json中还没。
这种情况需要再安装包吗?安装的话,会引发打包体积增大吗?

如果项目package.json 依赖A库、B库。 A库依赖js-base64: ^2.0.0,
B库依赖js-base64: ^3.0.0。 最终会安装新版本^3.0.0吗?这样会不会引发A库不兼容问题。

阅读 5k
3 个回答
node_modules中已经有了,但是package.json中还没的包要安装包吗?

要的

因为你并不能确定这个包是哪个的依赖包就算确定了也不能保证这个包未来是否没有变化
假如你package.json里依赖个A包,A包依赖了js-base64,但是有一天A包升级了或者不要A包了,这时候js-base64库也就没了,你的项目如果没有测试到这一块就要报错了。

安装的话,会引发打包体积增大吗?

如果跟已有包是相同版本就不会,如果是不同版本就相当于不同的库

当查找一个包的时候会先找当前目录下node_modules下,npm下载包的时候也是如果有不同版本的同名包,就下载到当前库的node_modules

查找到的目录都不一样,就是完全不一样的文件,webpack又没有diff重复度

你在index.js里引入lib1.jslib2.jslib1lib2.js内容一模一样,webpack并不会把哪个删除掉

至于包版本冲突这是npm管理的事情

下面是npm安装包的策略

假如你项目用js-base64 1.0.0
项目下A包用 js-base64 1.2.0
项目下B包用 js-base64 2.2.0
项目A包里的aa包用了 js-base64 1.3.0

|-node_modules
    |- js-base64(版本1.0.0)
    |- A
        |- node_modules
            |- js-base64(版本1.2.0)
    |- B
        |- node_modules
            |- js-base64(版本2.0.0)
     |- aa
        |- nodule_modules
            |- js-base64(版本1.3.0)
|-src

aa中会先在自己的node_modules里查,查不到往上查A的node_modules,查不到继续往上级目录下的node_modules

aa包并不在A下的node_modules而是在往一级跟A同级,是因为没有跟aa版本冲突的,当aa的版本也冲突了就会被放到A下面的node_modules

但是另一种情况

假如你项目、A包、B包、aa包都用的同一个版本就会自动提到顶层的node_modules

|-node_modules
    |- js-base64(版本1.0.0)
    |- A
    |- aa
    |- B
|-src

找包的逻辑依然是先从自己下面的node_modules,找不到继续往上层目录找,最终都走到顶层的node_mdoules
例如A下面的node_modules找aa,找不到,往上一级也就是跟A同级找,找到了

  1. 需要。
  2. 安装跟打包有什么关系?你用了就打包进去,没有就不打包进去,输出文件的体积看这个,又不是看你安没安装。
  3. 有可能会,取决于这两个版本之间有没有 Breaking Changes。不过如果你用了 Webpack/Rollup 之类的构建工具的话(你都提到打包了,说明肯定用到了),它会帮你处理,会把不同版本的依赖视为不同的模块,就不会有你担心的这个问题了。

能点进去的话可以不用装,ts的话要全局声明一下模块

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