之前向大家求助寻找最小化 node_modules 的工具(
https://www.v2ex.com/t/456847 ),得到了很多有价值的回复。但是由于 node_modules 结构差异很大,通用规则能优化的程度非常有限。
我尝试了两个工具,一个是 nm-prune (
https://github.com/pingyhq/nm-prune ),一个是 node-prune (
https://github.com/tj/node-prune ),两者都可以把我们的 vscode 扩展从~9MB 压缩到~7MB。效果不是很理想。
所以我想,体力活恐怕是绕不开了。
昨天把我们的扩展所依赖的 400+个 module 挨个筛了一遍,把通用规则无法包含的文件单独列了出来,最后的结果是压到了~5MB。
除了很多 module 单独为浏览器提供了额外的版本(比如 dist 或者 minify ),很多 module 也包含了 test.js 和 example.js 这样的文件,还有的 module 为 test.js 和 example.js 也提供 minify 版本。
不过 node_modules 庞大不单单是因为 module owner 对自己的库不细心,很大原因还因为对依赖引用不细心。举例子,lodash 这个库完整版本是非常大的,但是它为每个功能都提供单独的 module,如果只是用到了 lodash 的几个功能,不应该把整个 lodash 都包进去。还有 moment 这个包,因为支持 l10n,所以它也是非常非常庞大的,如果只是用到了 moment 的一个非常小的功能,很有可能会有其它更合适的包。最后最不能忍的,声明了依赖但是不用,这个依赖依然会被包进去。
我写的那个工具在
https://github.com/Sneezry/npmautoclean因为是一天写出来的,代码比较粗糙,而且是根据我们的项目需求做的,目前还没啥通用性,里面的 ignore 列表会根据我们的项目慢慢增加,希望这一点小工作能让 node 变好一点点。
也发到 npm 了,npm i -g npmautoclean
npmautoclean 会改每个 module 的 package.json,只保留我认为有用的字段,因为没有完整测试过,这里可能有坑,之后慢慢完善。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/457396
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.