npm 中的模块版本都须要遵循 semver 2.0 的语义化版本规则。 node
版本格式:主版本号.次版本号.修订号,版本号递增规则以下: 主版本号:当你作了不兼容的API 修改, 次版本号:当你作了向下兼容的功能性新增, 修订号:当你作了向下兼容的问题修正。 先行版本号及版本编译信息能够加到“主版本号.次版本号.修订号”的后面,做为延伸。 git
而后基于语义化的版本,咱们在选择版本的时候就能够对依赖进行版本的控制: github
dependencies: { "express": "3.x", "debug": "*", "express-session": "~1.0.0", "connect-redis": "1.2.3" }
从例子中能够看到,有许多种选择版本范围的风格,能够在 semver in npm 上看到每个不一样风格的做用。 而在 node.js 的模块管理中,最经常使用到的几种是: redis
其中 ~ 和 ^ 两个前缀让人比较迷惑,简单的来讲: express
按照 semver 的规范: npm
可是最终在实践过程当中,许多包没有遵循该原则,或者是没注意破坏了该原则,致使: json
由此引出了下一个话题:如何正确的选择依赖模块依赖范围。 session
在编写 node 的模块的时候,模块自身可能会依赖一些 dependencies, 然而咱们并不想每一次依赖的 模块有任何小的 bug fix 的时候就要从新更新一次依赖,所以会推荐对大部分的依赖使用 ~ 前缀, 这样能够保证能够享受到这些依赖模块的 bug fix,而且不须要更新自身的版本。同时,也不会引入 一些 API 变动致使的没法预料的错误。固然,若是对一些彻底信任的模块也能够考虑使用 ^ 前缀。 koa
see: koa spa
然而在编写 node 的项目的时候,咱们更加但愿可以追踪到全部依赖的任何变更,由于项目也不会有 关于自身版本更新的烦恼,所以更加倾向于写死依赖的版本,这样若是有任何因为更加容易追踪 升级依赖致使的 bug。
see: koa-todo
看完编写过程当中怎么样选择依赖的范围,回过头来看看,若是咱们须要编写一个发布到 npm 的模块, 须要如何选择发布的模块的版本。
遵循这几条规则,这样用户在引入这个模块的时候就能够轻松的经过 semver 提供的验证机制来更轻松的使用你的模块。