去年3月份,npm圈子发生过这样一件事,一个不过 11 行的工具函数left-pad被作者从npm上撤下,所有直接和间接依赖它的包就这么齐刷刷挂了,包括babel和react-native这样每天安装数万的热门项目。而Azer删除他所有的npm包又是另一个故事:Azer写了一个工具叫kik发布在npm上,这天有个同名的公司律师找上门要求他删掉,Azer不从,这律师就找上npm,npm把包的管理权限转给了这家公司——当然,Azer就怒了,从npm上解放了所有自己发布的包。

事件之后,有人给出了类似问题的解决之道,使用npm的bundledDependencies。不过,很多库作者并不会真的这样用起来,于是,今天又碰到了类似的问题,vue前端界自然是人尽皆知,配套的vue-loader更可谓是必需品,就是在vue-loader里引入的一个库——js-beautify,今天从1.6.14更新到了1.7.0,但是作者似乎写了个bug,于是依赖于node构建的我们,出现了如此异常

Module build failed: Error: Cannot find module './lib/beautify'
//...

官方issue里便出现了如此景象
js-beautify

附issue链接去感受一下:
https://github.com/beautify-web/js-beautify/issues/1247

很多人说本地安装npm i js-beautify@1.6.14 -S可解决,我第一时间想到的也是这样,然而,移除、添加、再移除、再添加,几经周折后发现并不好用,可能因为我们都在用yarn的缘故吧,这里没再尝试,最后同事注意到有网友给出用yarn提供的resolutions,尝试发现果然可以。本地尝试可以后服务端构建依然失败,不过虽然yarn官网显示已经支持resolutions,但中文版暂未翻译该部分文档,考虑到1.0前后支持的workspaces属性文档也是未翻译,猜测是服务器版本过旧,升级后完美支持。

下面附操作步骤(使用yarn前更新到1.x.x)

rm -rf node_modules
rm -rf yarn.lock
//package.json在dependencies平级位置增加(dependencies中无需添加):
"resolutions": {
    "js-beautify": "1.6.14"
}
yarn

如果是npm,可以直接尝试

npm i js-beautify@1.6.14 -S

关于resolutions详情请见
https://yarnpkg.com/zh-Hans/docs/selective-version-resolutions