解决因依赖版本问题导致的打包报错
在项目开发过程中,为了简化引入新插件时在服务器上的繁琐操作,我们将项目从固定的node_modules配置,调整为每次构建时先安装依赖再进行打包。然而,在本地测试时,尽管手动锁定了版本,打包过程中依然出现了报错。
一、报错信息
报错日志如下
ERROR Failed to compile with 1 error
error in D:/02-workSpace/operation-fed/node_modules/@types/markdown-it/lib/index.d.ts
ERROR in D:/02-workSpace/operation-fed/node_modules/@types/markdown-it/lib/index.d.ts
155:33 Namespace 'LinkifyIt' has no exported member 'LinkifyIt'.
153 | * rule.
154 | */
> 155 | readonly linkify: LinkifyIt.LinkifyIt;
| ^
156 |
157 | /**
158 | * Link validation function. CommonMark allows too much in links. By default
=========================>打包生成环境变量: BASE_API_URL =
ERROR Build failed with errors.
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
通过对报错信息的分析,初步分析问题出在markdown-it和@types/markdown-it这两个依赖上,推测可能是版本不兼容导致的。
二、问题排查
2.1 依赖版本
首先查询markdown-it和@types/markdown-it的版本兼容性。经确认,markdown-it 12.x 版本与@types/markdown-it 12.x 版本是相互匹配的。由此推断,问题或许出在LinkifyIt相关的依赖上。
2.2 统一本地和服务器的依赖版本
因为服务器上的依赖一直没有更新过且打包一直都是成功的。尝试把本地的依赖和服务器上node_modules中的依赖版本保持统一。
查看服务器上markdown-it、@types/markdown-it和@types/linkify-it的版本
将本地依赖中的版本设置为与服务器上完全一致,再次执行install和build操作。但令人意外的是,又出现了和之前相同的报错。
进一步深入排查发现,虽然在package.json中手动指定了@types/linkify-it的版本,但@types/markdown-it自身引用的@types/linkify-it版本为*(这不是坑爹吗!)。
这就导致在安装依赖时,仍然会安装高版本的@types/linkify-it,从而使得打包时引用的是高版本的@types/linkify-it,最终引发报错。
三、解决方案
3.1 使用yarn
package.json提供了一个 resolutions 配置项,可以锁定任何层级的依赖版本,配置格式如下:
{
"resolutions": { "dependency-name": "version" }
}
根据此配置项,我们对@types/linkify-it的版本进行锁定。
完成版本锁定后,删除node_modules文件夹和yarn.lock文件,重新进行测试。这一次,打包成功。检查yarn.lock和node_modules,确认高版本的@types/linkify-it已不存在了。
3.2 使用npm
由于这项目有点老,node还是14,npm是6,而npm6并没有提供一个类似于yarn的resolutions 配置项,
可以采用手动锁定版本的形式(类似于上文的2.2,因为这项目一直使用的yarn,所以2.2没有使用npm测试)。
未手动锁定版本的依赖:
手动设置版本后的依赖:
3.3 总结
没有直接引用某个依赖的时候,间接引用的依赖也很有可能引发一些兼容性问题,resolutions配置项为我们解决深层次依赖版本问题提供了有效的手段,合理运用它能够确保项目的稳定性和可重复性。