【Node】@types/markdown-it、@types/linkify-it 的兼容性问题

828 阅读3分钟

解决因依赖版本问题导致的打包报错

在项目开发过程中,为了简化引入新插件时在服务器上的繁琐操作,我们将项目从固定的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的版本

02.png

03.png

04.png

将本地依赖中的版本设置为与服务器上完全一致,再次执行installbuild操作。但令人意外的是,又出现了和之前相同的报错。

05.png

进一步深入排查发现,虽然在package.json中手动指定了@types/linkify-it的版本,但@types/markdown-it自身引用的@types/linkify-it版本为*(这不是坑爹吗!)。

这就导致在安装依赖时,仍然会安装高版本的@types/linkify-it,从而使得打包时引用的是高版本的@types/linkify-it,最终引发报错。

image.png

image.png

三、解决方案

3.1 使用yarn

package.json提供了一个 resolutions 配置项,可以锁定任何层级的依赖版本,配置格式如下:

{ 
    "resolutions": { "dependency-name": "version" }
}

根据此配置项,我们对@types/linkify-it的版本进行锁定。

image.png

完成版本锁定后,删除node_modules文件夹和yarn.lock文件,重新进行测试。这一次,打包成功。检查yarn.locknode_modules,确认高版本的@types/linkify-it已不存在了。

image.png

image.png

3.2 使用npm

由于这项目有点老,node还是14,npm是6,而npm6并没有提供一个类似于yarnresolutions 配置项, 可以采用手动锁定版本的形式(类似于上文的2.2,因为这项目一直使用的yarn,所以2.2没有使用npm测试)。

未手动锁定版本的依赖:

image.png image.png

手动设置版本后的依赖: image.png

image.png

3.3 总结

没有直接引用某个依赖的时候,间接引用的依赖也很有可能引发一些兼容性问题,resolutions配置项为我们解决深层次依赖版本问题提供了有效的手段,合理运用它能够确保项目的稳定性和可重复性。