1.0.1 • Published 4 years ago

yarn-resolution-plugin v1.0.1

Weekly downloads
9
License
MIT
Repository
github
Last release
4 years ago

yarn-resolution-plugin

基于 yarn.lock 自动收集依赖冲突的 webpack 插件,自动给出 resolutions 建议,以此得到产物减小的收益

version: 1.0.1

安装

    yarn add -D yarn-resolution-plugin

配置

给 webpack 配置本插件,例:

webpack.config.js

const YarnResolutionPlugin = require('yarn-resolution-plugin')

module.exports = {
  // ......
  plugins: [new YarnResolutionPlugin()],
}

vue.config.js

const YarnResolutionPlugin = require('yarn-resolution-plugin')

module.exports = {
  configureWebpack: {
    plugins: [new YarnResolutionPlugin()],
  },
}

craco.config.js

const YarnResolutionPlugin = require('yarn-resolution-plugin')

module.exports = {
  webpack: {
    configure: (config, { env, paths }) => {
      config.plugins.push(new YarnResolutionPlugin())
      return config
    },
  },
}

使用

每次 webpack 运行时,本插件将基于 yarn.lock 收集目前正在使用的全部依赖信息,你将在本地得到两个文件

yarn-conflict.json

当前有冲突的依赖信息列表:

[
  {
    // 当前有冲突的依赖名
    "name": "lodash",

    // 有冲突的版本号
    // 每个元素间代表着冲突,元素本身代表一组归类,意味着本元素列表内的版本没有发生冲突
    "dependenciesVersion": [
      ["4.16"],
      ["4.17.19"],
      ["^4.17.12", "^4.17.15", "^4.17.20", "^4.2.1"]
    ],

    // 最终使用的版本号
    // 意味着产物将包含的重复依赖版本有哪些
    "currentVersion": ["4.16.6", "4.17.19", "4.17.20"]
  }
  // ...
]

通常来说我们重点关注某依赖被打入了几份,他们的版本号是什么,也就是 currentVersion 字段,这里意味着打包产物中含有三份不同版本的 lodash 。

yarn-resolution.json

package.json 中 resolutions 字段的建议信息:

// 每个依赖将取最新版本
{
  "resolutions": {
    "lodash": "4.17.20",
    "qs": "6.9.6"
    // ...
  }
}

本文件将自动得到有冲突的依赖的 resolutions 字段推荐。

你可以经过谨慎评估后,将其复制到 package.json 锁定版本号,之后重新安装依赖:

  # 使用 resolutions 锁定版本后,重新安装依赖
  yarn

选项

namedefaultrequireddescription
modemajorno过滤有冲突的依赖的版本规则,默认为大版本过滤,即只报告无大版本差异且发生冲突的依赖信息,这将避免一些 BREAKING CHANGE ,可置为 minor 过滤次版本,置为 false 代表不过滤
yarnLockPath./yarn.locknoyarn.lock 文件位置
reporttrueno是否生成 yarn-conflict.json 冲突信息
reportPath./yarn-conflict.jsonnoyarn-conflict.json 的生成位置
resolutiontrueno是否生成 yarn-resolution.json resolutions 建议
resolutionPath./yarn-resolution.jsonnoyarn-resolution.json 生成位置

例:

// webpack.config.js
const YarnResolutionPlugin = require('yarn-resolution-plugin')

module.exports = {
  // ......
  plugins: [new YarnResolutionPlugin({
    report: false // 不生成 yarn-conflict.json 冲突信息
  })],
}

特别注意

  1. 你应该谨慎评估使用 resolutions 锁定的依赖,而不是将 yarn-resolution.json 无脑的复制使用,通常我们只需针对易发生冲突的常见大型依赖( 如 lodash 等 )进行锁定版本,他们在不同版本间不会发生 BREAKING CHANGE ,你可以通过可视化分析插件 webpack-bundle-analyzer 分析产物中各个依赖大小。

  2. 每次使用 resolutions 字段锁定依赖后 yarn 重新安装依赖才会使得锁定版本生效。

1.0.1

4 years ago

1.0.0

4 years ago