前情提纲
本日 npm 圈子鸡飞狗跳,原因是一个不过 11 行的东西函数 left-pad 被作者从 npm 上撤下,一切直接和间接依靠它的包就这么齐刷刷挂了,包含 babel 和 react-native 如许天天装置数万的热点项目。
而 Azer 删除他一切的 npm 包又是另一个故事:Azer 写了一个东西叫 kik 宣布在 npm 上,是日有个同名的公司状师找上门请求他删掉,Azer 不从,这状师就找上 npm,npm 把包的管理权限转给了这家公司——固然,Azer 就怒了,从 npm 上解放了一切本身宣布的包。
是的,就是如许 ╮(╯_╰)╭
small module 的错?
babel 很快就宣布了修改。然则抛开这两个故事不去议论,鉴于如今种种组件的依靠树之深,这件事暴露出的题目(一向都在,只是没有这么痛地意会过)已让人没法安心肠 npm install
了——更多的项目都不能够像 babel 如许活泼,第一时候宣布修改。
种种忧郁、质疑指向 npm 社区一向首倡和推进的 small module 和 semver 理念。这个方向错了么?也有人见怪 npm unpublish
是万恶之源,这么想就有点外表了。
解围之道,就在个中
Isaacs 在 left-pad 的 Issue 里复兴说“不要依靠于其他人”,附了关于 bundledDependencies 的链接,而且末了再次强调 small module 依然是合理的哲学。
这篇复兴实在比较暧昧,以至看上去有点抵牾。Rollup 作者讲得更邃晓些,处理之道就一句话:
不管你是不是面向浏览器,将一切依靠都打包进终究的宣布代码。
这么做将使你的项目仅仅在打包的时刻依靠那些 dependencies,一旦宣布完成,就不再须要依靠树上的一切作者们坚持他们的任何许诺。这就是 Isaacs 所说:不要依靠于其他 人。
事实上 Atom 也在受影响之列,但除了 Atom 的开发者以外,用户是没有感觉的——就这么简朴。
此准绳除了能够处理此次的 left-pad 灾害以外,另有成堆的优点,哪怕每一项都不是杀手级的,这么堆起来也照样很可观的:
节约
npm install
的时候。顺次去下载全部依靠树是很耗时候的,而且还附带下载了更多的 README、package.json 之类。这些磁盘空间也能够省下来了。启动更快。你晓得 Nodejs 的
require()
实行慢成狗么?你的包越发牢靠。依靠树中的 bug 不能靠用户自行
npm update
来修复了,你得本身从新打包发版本,然则再也不必忧郁出 left-pad 这类么蛾子,哪一个更主要?也越发平安。理论上,npm 托管的那些代码随时能够被注入恶意代码,比方如今 Azer 撤下来的包,不少已被其他人从新宣布上去,但是天晓得都是谁放了些什么代码……用户只不过
npm install
了一下。解除了用户为你的代码打包的累赘。 累赘实在并非我们忧郁的,只是假如用户喜好用 webpack 打包而我们的代码是 browserify 圈的呢?PouchDB 就碰上了这类状况。
新的习气
养成新的习气,最先为你宣布的代码做预打包吧。bundledDependencies 已等候多时了。