deps-conflict-resolver 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -9
- package/dist/{config.types-CN7glPbA.d.cts → config.types-FhZrFXHQ.d.cts} +15 -5
- package/dist/{config.types-CN7glPbA.d.ts → config.types-FhZrFXHQ.d.ts} +15 -5
- package/dist/index.cjs +117 -74
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -7
- package/dist/index.d.ts +7 -7
- package/dist/index.js +117 -74
- package/dist/index.js.map +1 -1
- package/dist/{resolver-Dew5GU0y.d.cts → resolver-BG2AVCds.d.cts} +1 -1
- package/dist/{resolver-BjbDmC24.d.ts → resolver-z_muBpc_.d.ts} +1 -1
- package/dist/vite.cjs +117 -74
- package/dist/vite.cjs.map +1 -1
- package/dist/vite.d.cts +1 -1
- package/dist/vite.d.ts +1 -1
- package/dist/vite.js +117 -74
- package/dist/vite.js.map +1 -1
- package/dist/webpack.cjs +122 -80
- package/dist/webpack.cjs.map +1 -1
- package/dist/webpack.d.cts +2 -2
- package/dist/webpack.d.ts +2 -2
- package/dist/webpack.js +122 -80
- package/dist/webpack.js.map +1 -1
- package/package.json +5 -1
package/README.md
CHANGED
|
@@ -93,15 +93,24 @@ const resolved = resolver.resolveModule('vue', '/path/to/importer.js');
|
|
|
93
93
|
|
|
94
94
|
## 配置选项
|
|
95
95
|
|
|
96
|
-
| 选项
|
|
97
|
-
|
|
|
98
|
-
| `dependencies`
|
|
99
|
-
| `projectRoot`
|
|
100
|
-
| `autoInstall`
|
|
101
|
-
| `packageManager`
|
|
102
|
-
| `registry`
|
|
103
|
-
| `debug`
|
|
104
|
-
| `aliasPrefix`
|
|
96
|
+
| 选项 | 类型 | 默认值 | 说明 |
|
|
97
|
+
| ------------------- | ------------------------------------- | --------------- | ------------------------------------------------------------------------ |
|
|
98
|
+
| `dependencies` | `string[]` | - | **必填**,需要分析的依赖包名列表 |
|
|
99
|
+
| `projectRoot` | `string` | `process.cwd()` | 项目根目录路径 |
|
|
100
|
+
| `autoInstall` | `boolean` | `true` | 是否自动安装缺失的别名依赖 |
|
|
101
|
+
| `packageManager` | `'auto' \| 'npm' \| 'yarn' \| 'pnpm'` | `'auto'` | 包管理器类型,`'auto'` 自动检测 |
|
|
102
|
+
| `registry` | `string` | 自动检测 | NPM 注册表地址,不指定则自动从 .npmrc 读取 |
|
|
103
|
+
| `debug` | `boolean` | `false` | 是否启用调试日志 |
|
|
104
|
+
| `aliasPrefix` | `string` | `'aliased-'` | 别名前缀 |
|
|
105
|
+
| `excludeRedirects` | `Record<string, string[]>` | `{}` | 从重定向列表中排除特定包。键为原始包名,值为要排除的 importer 包名列表。示例:`{ vue: ['vue-demi', 'pinia'] }` |
|
|
106
|
+
| `includeRedirects` | `Record<string, string[]>` | `{}` | 强制将指定包加入重定向列表,优先于 `excludeRedirects` 执行。适用于 semver 范围写得过宽(如 `>=2.5.0`)但运行时仍依赖旧版本的包。示例:`{ vue: ['@rili/ui', '@kmt/meeting-setting'] }` |
|
|
107
|
+
|
|
108
|
+
### Vite 插件专属选项
|
|
109
|
+
|
|
110
|
+
| 选项 | 类型 | 默认值 | 说明 |
|
|
111
|
+
| --------------- | --------- | ------- | -------------------------- |
|
|
112
|
+
| `enableInDev` | `boolean` | `true` | 是否在开发模式(dev)下启用 |
|
|
113
|
+
| `enableInBuild` | `boolean` | `true` | 是否在构建模式(build)下启用 |
|
|
105
114
|
|
|
106
115
|
### 自动检测
|
|
107
116
|
|
|
@@ -169,6 +178,15 @@ import Vue from 'vue'; // → 解析到 aliased-vue2
|
|
|
169
178
|
import Vue from 'vue'; // → 解析到 vue (3.x)
|
|
170
179
|
```
|
|
171
180
|
|
|
181
|
+
### 行为边界
|
|
182
|
+
|
|
183
|
+
- **冲突检测范围**:只检测用户指定的 `dependencies` 的第一层 `peerDependencies` 与主工程的版本冲突。子依赖的 `peerDependencies` 不触发别名安装。
|
|
184
|
+
- **重定向范围**:声明冲突 peer 的包及其所有子依赖(`dependencies` + `peerDependencies` 递归)都会被收入重定向候选列表。冲突包自身(如 `vue`、`vue-router`)在收集时会被自动排除,避免主工程的同名引用被错误重定向。
|
|
185
|
+
- **`excludeRedirects`**:从重定向候选列表中剔除指定包,适用于运行时实际使用宿主 Vue 3 版本的共享包(如 `vue-demi`、`pinia`)。
|
|
186
|
+
- **`includeRedirects`**:将指定包强制加入重定向列表,适用于 semver 范围写得过宽(如 `vue: ">=2.5.0"` 同时满足 Vue 2/3),但运行时仍需要使用旧版本的包。`includeRedirects` 在 `excludeRedirects` 之前应用。
|
|
187
|
+
- **别名安装**:只为"主工程已声明且版本冲突"的依赖自动安装别名。未声明的 peer 依赖只会输出警告,不自动安装。
|
|
188
|
+
- **依赖图去重**:依赖树遍历按包名去重(同名包只分析一次)。在极少数情况下,如同一包名存在多个不同版本的嵌套安装,只有第一个被解析到的版本会被分析。这对重定向结果的影响极小,因为重定向判断只基于包名匹配,不涉及版本。
|
|
189
|
+
|
|
172
190
|
## 高级用法
|
|
173
191
|
|
|
174
192
|
### 钩子函数
|
|
@@ -199,6 +217,31 @@ depsConflictResolverVitePlugin({
|
|
|
199
217
|
});
|
|
200
218
|
```
|
|
201
219
|
|
|
220
|
+
### 精细控制重定向范围(includeRedirects + excludeRedirects)
|
|
221
|
+
|
|
222
|
+
当项目同时包含 Vue 2 依赖和 Vue 3 依赖时,自动检测可能无法准确区分。可以用这两个选项手动调节:
|
|
223
|
+
|
|
224
|
+
```typescript
|
|
225
|
+
new DepsConflictResolverWebpackPlugin({
|
|
226
|
+
dependencies: ['@uikit/vue-finder', '@rili/ui'],
|
|
227
|
+
|
|
228
|
+
// 强制将这些包(semver 范围过宽,但实际需要 Vue 2)加入重定向列表
|
|
229
|
+
includeRedirects: {
|
|
230
|
+
vue: ['@rili/ui', '@kmt/meeting-setting'],
|
|
231
|
+
},
|
|
232
|
+
|
|
233
|
+
// 从重定向列表中排除这些包(它们在运行时使用宿主提供的 Vue 3)
|
|
234
|
+
excludeRedirects: {
|
|
235
|
+
vue: ['vue-demi', 'pinia', '@ks-email/editor'],
|
|
236
|
+
},
|
|
237
|
+
|
|
238
|
+
aliasPrefix: 'never-ever-gonna-import-',
|
|
239
|
+
autoInstall: true,
|
|
240
|
+
});
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
规则优先级:`includeRedirects` 先执行,`excludeRedirects` 后执行。若同一个包同时出现在两者中,`excludeRedirects` 优先(最终不重定向)。
|
|
244
|
+
|
|
202
245
|
### 复用已有别名
|
|
203
246
|
|
|
204
247
|
如果项目中已经安装了合适版本的别名(如 `vue2@npm:vue@2.6.14`),插件会自动检测并复用,不会重复安装。
|
|
@@ -58,11 +58,11 @@ interface PeerConflict {
|
|
|
58
58
|
*/
|
|
59
59
|
conflictingRanges: DependencyPath[];
|
|
60
60
|
/**
|
|
61
|
-
*
|
|
61
|
+
* 是否存在版本范围不兼容(纯粹描述 peer 范围与已安装版本的兼容性,不考虑是否已声明)
|
|
62
62
|
*/
|
|
63
63
|
hasConflict: boolean;
|
|
64
64
|
/**
|
|
65
|
-
*
|
|
65
|
+
* 是否需要安装别名(= hasConflict + 主工程已声明且已安装该包)
|
|
66
66
|
*/
|
|
67
67
|
needsAlias: boolean;
|
|
68
68
|
}
|
|
@@ -106,8 +106,9 @@ interface AliasMapping {
|
|
|
106
106
|
usedBy: string[];
|
|
107
107
|
/**
|
|
108
108
|
* 所有需要重定向的依赖包名列表
|
|
109
|
-
* 包含 usedBy 中包的所有运行时子依赖(dependencies
|
|
109
|
+
* 包含 usedBy 中包的所有运行时子依赖(dependencies + peerDependencies 递归)
|
|
110
110
|
* 用于判断某个 importer 是否需要重定向到别名版本
|
|
111
|
+
* 注意:冲突包自身(如 vue、vue-router)已在收集时被排除,避免主工程引用被误重定向
|
|
111
112
|
*/
|
|
112
113
|
allDependents: string[];
|
|
113
114
|
}
|
|
@@ -128,7 +129,7 @@ interface AnalysisResult {
|
|
|
128
129
|
*/
|
|
129
130
|
aliasMappings: AliasMapping[];
|
|
130
131
|
/**
|
|
131
|
-
* 第一层依赖中缺失的 peer
|
|
132
|
+
* 第一层依赖中缺失的 peer 依赖(不自动安装,仅警告提示用户)
|
|
132
133
|
*/
|
|
133
134
|
missingFirstLevelPeers: Array<{
|
|
134
135
|
packageName: string;
|
|
@@ -192,10 +193,19 @@ interface DepsConflictResolverOptions {
|
|
|
192
193
|
aliasPrefix?: string;
|
|
193
194
|
/**
|
|
194
195
|
* 排除特定依赖包对某些模块的解析重定向
|
|
195
|
-
*
|
|
196
|
+
* 键为原始包名,值为需要从 allDependents 中剔除的包名列表
|
|
196
197
|
* @example { vue: ['vue-demi'] } - vue-demi 中的 import vue 不会被重定向
|
|
197
198
|
*/
|
|
198
199
|
excludeRedirects?: Record<string, string[]>;
|
|
200
|
+
/**
|
|
201
|
+
* 显式纳入特定依赖包对某些模块的解析重定向
|
|
202
|
+
* 键为原始包名,值为需要强制加入 allDependents 的包名列表
|
|
203
|
+
* 常用于处理 semver 范围写得过宽(如 ">=2.5.0" 同时满足 Vue 2/3),
|
|
204
|
+
* 但运行时仍依赖旧版本实现的包
|
|
205
|
+
* 优先于 excludeRedirects 应用(include 后再 exclude)
|
|
206
|
+
* @example { vue: ['@rili/ui', '@kmt/meeting-setting'] }
|
|
207
|
+
*/
|
|
208
|
+
includeRedirects?: Record<string, string[]>;
|
|
199
209
|
}
|
|
200
210
|
/**
|
|
201
211
|
* 解析后的配置(带默认值)
|
|
@@ -58,11 +58,11 @@ interface PeerConflict {
|
|
|
58
58
|
*/
|
|
59
59
|
conflictingRanges: DependencyPath[];
|
|
60
60
|
/**
|
|
61
|
-
*
|
|
61
|
+
* 是否存在版本范围不兼容(纯粹描述 peer 范围与已安装版本的兼容性,不考虑是否已声明)
|
|
62
62
|
*/
|
|
63
63
|
hasConflict: boolean;
|
|
64
64
|
/**
|
|
65
|
-
*
|
|
65
|
+
* 是否需要安装别名(= hasConflict + 主工程已声明且已安装该包)
|
|
66
66
|
*/
|
|
67
67
|
needsAlias: boolean;
|
|
68
68
|
}
|
|
@@ -106,8 +106,9 @@ interface AliasMapping {
|
|
|
106
106
|
usedBy: string[];
|
|
107
107
|
/**
|
|
108
108
|
* 所有需要重定向的依赖包名列表
|
|
109
|
-
* 包含 usedBy 中包的所有运行时子依赖(dependencies
|
|
109
|
+
* 包含 usedBy 中包的所有运行时子依赖(dependencies + peerDependencies 递归)
|
|
110
110
|
* 用于判断某个 importer 是否需要重定向到别名版本
|
|
111
|
+
* 注意:冲突包自身(如 vue、vue-router)已在收集时被排除,避免主工程引用被误重定向
|
|
111
112
|
*/
|
|
112
113
|
allDependents: string[];
|
|
113
114
|
}
|
|
@@ -128,7 +129,7 @@ interface AnalysisResult {
|
|
|
128
129
|
*/
|
|
129
130
|
aliasMappings: AliasMapping[];
|
|
130
131
|
/**
|
|
131
|
-
* 第一层依赖中缺失的 peer
|
|
132
|
+
* 第一层依赖中缺失的 peer 依赖(不自动安装,仅警告提示用户)
|
|
132
133
|
*/
|
|
133
134
|
missingFirstLevelPeers: Array<{
|
|
134
135
|
packageName: string;
|
|
@@ -192,10 +193,19 @@ interface DepsConflictResolverOptions {
|
|
|
192
193
|
aliasPrefix?: string;
|
|
193
194
|
/**
|
|
194
195
|
* 排除特定依赖包对某些模块的解析重定向
|
|
195
|
-
*
|
|
196
|
+
* 键为原始包名,值为需要从 allDependents 中剔除的包名列表
|
|
196
197
|
* @example { vue: ['vue-demi'] } - vue-demi 中的 import vue 不会被重定向
|
|
197
198
|
*/
|
|
198
199
|
excludeRedirects?: Record<string, string[]>;
|
|
200
|
+
/**
|
|
201
|
+
* 显式纳入特定依赖包对某些模块的解析重定向
|
|
202
|
+
* 键为原始包名,值为需要强制加入 allDependents 的包名列表
|
|
203
|
+
* 常用于处理 semver 范围写得过宽(如 ">=2.5.0" 同时满足 Vue 2/3),
|
|
204
|
+
* 但运行时仍依赖旧版本实现的包
|
|
205
|
+
* 优先于 excludeRedirects 应用(include 后再 exclude)
|
|
206
|
+
* @example { vue: ['@rili/ui', '@kmt/meeting-setting'] }
|
|
207
|
+
*/
|
|
208
|
+
includeRedirects?: Record<string, string[]>;
|
|
199
209
|
}
|
|
200
210
|
/**
|
|
201
211
|
* 解析后的配置(带默认值)
|