作为模块和包服务的工具,NPM十分便捷。它实质上已经是一个包共享平台,所有人都可以贡献模块并将其打包分享到这个平台上,也可以在许可证(大多是MIT许可证)的允许下免费使用它们。NPM提供的这些便捷,将模块链接到一个共享平台上,缩短了贡献者与使用者之间的距离,这十分有利于模块的传播,进而十分利于Node的推广。几乎没有一种语言或平台有Node这样才出现3年就拥有成千上万第三方模块的情景。这个功劳一部分是因为Node选择了JavaScript,这门语言拥有极大的开发人员基数,具有强大的生产力;另一部分是因为CommonJS规范和NPM,它们使得产品能够更好的组织、传播和使用。
潜在的问题在于,在NPM平台上,每个人都可以分享包到平台上,鉴于开发人员水平不一,上面包的质量也良莠不齐。另一个问题是,Node代码可以运行在服务器端,需要考虑安全问题。
对于包的使用者而言,包质量和安全问题需要作为是否采纳模块的一个判断条件。
尽管NPM没有硬性的方式去评判一个包的质量和安全,好在开源社区也有它内在的健康发展机制,那就是口碑效应,其中NPM模块首页([https://npmjs.org](https://npmjs.org))上的依赖榜可以说明模块的质量和可靠性。第二个可以考察质量的地方是GitHub,NPM中大多数包都是通过GitHub托管的,模块项目的观察者数量和分支数量也能从侧面反映这个模块的可靠性和流行度。第三个可以考量包质量的地方在于包中的测试用例和文档的状况,一个没有单元测试的包基本上是无法被信任的,没有文档的包,使用者使用时内心也是不踏实的。
在安全问题上,在经过模块质量的考察之后,应该可以去掉一大半候选包。基于使用者大多是JavaScript程序员,难点其实在于第三方C/C++扩展模块,这类模块建议在企业的安全部门检查之后方可允许使用。
事实上,为了解决上述问题,Isaac Z. Schlueter 计划引入CPAN社区中的Kwalitee风格来让模块进行自然排序。Kwalitee是一个拟声词,发音与quality相同。CPAN社区对它的原始定义如下:
"Kwalitee" is something that looks like quality,sounds like quality,but not quite quality.
大致意思就是确认一个模块的质量是否优秀并不是那么容易,只能从一些表象来进行考察,但即使考察都通过,也并不能确定它就是高质量的模块。这个方法能够排除大部分不合格的模块,虽然不够精确但是有效。总体而言,符合Kwalitee的模块要满足的条件与上述提及的考察点大致相同:
* 具备良好的测试
* 具备良好的文档(README、API)
* 具备良好的测试覆盖率
* 具备良好的编码规范
* 更多条件
CPAN社区制定了相当多的规范来考察模块。未来,NPM社区也会有更多的规范来考察模块。读者可以根据这些条款区分出那些优秀模块跟糟粕模块。
- 目录
- 第1章 Node 简介
- 1.1 Node 的诞生历程
- 1.2 Node 的命名与起源
- 1.2.1 为什么是 JavaScript
- 1.2.2 为什么叫 Node
- 1.3 Node给JavaScript带来的意义
- 1.4 Node 的特点
- 1.4.1 异步 I/O
- 1.4.2 事件与回调函数
- 1.4.3 单线程
- 1.4.4 跨平台
- 1.5 Node 的应用场景
- 1.5.1 I/O 密集型
- 1.5.2 是否不擅长CPU密集型业务
- 1.5.3 与遗留系统和平共处
- 1.5.4 分布式应用
- 1.6 Node 的使用者
- 1.7 参考资源
- 第2章 模块机制
- 2.1 CommonJS 规范
- 2.1.1 CommonJS 的出发点
- 2.1.2 CommonJS 的模块规范
- 2.2 Node 的模块实现
- 2.2.1 优先从缓存加载
- 2.2.2 路径分析和文件定位
- 2.2.3 模块编译
- 2.3 核心模块
- 2.3.1 JavaScript核心模块的编译过程
- 2.3.2 C/C++核心模块的编译过程
- 2.3.3 核心模块的引入流程
- 2.3.4 编写核心模块
- 2.4 C/C++扩展模块
- 2.4.1 前提条件
- 2.4.2 C/C++扩展模块的编写
- 2.4.3 C/C++扩展模块的编译
- 2.4.2 C/C++扩展模块的加载
- 2.5 模块调用栈
- 2.6 包与NPM
- 2.6.1 包结构
- 2.6.2 包描述文件与NPM
- 2.6.3 NPM常用功能
- 2.6.4 局域NPM
- 2.6.5 NPM潜在问题
- 2.7 前后端共用模块
- 2.7.1 模块的侧重点
- 2.7.2 AMD规范
- 2.7.3 CMD规范
- 2.7.4 兼容多种模块规范
- 2.8 总结
- 2.9 参考资源
- 第3章 异步I/O
- 3.1 为什么要异步I/O
- 3.1.1 用户体验
- 3.1.2 资源分配
- 3.2 异步I/O实现现状
- 3.2.1 异步I/O与非阻塞I/O
- 3.2.2 理想的非阻塞异步I/O
- 3.2.3 现实的异步I/O
- 3.3 Node的异步I/O
- 3.3.1 事件循环
- 3.3.2 观察者
- 3.3.3 请求对象
- 3.3.4 执行回调
- 3.3.5 小结
- 3.4 非I/O的异步API
- 3.4.1 定时器
- 3.5 事件驱动与高性能服务器