node.js开发系列[2]-npm
模块
模块缓存
模块是有缓存的
原生模块在 Node.js 源代码编译的时候编译进了二进制执行文件,加载的速度最快。另一类文件模块是动态加载的,加载速度比原生模块慢。但是 Node.js 对原生模块和文件模块都进行了缓存,于是在第二次 require 时,是不会有重复开销的。其中原生模块都被定义在 lib 这个目录下面,文件模块则不定性
http://www.infoq.com/cn/articles/nodejs-module-mechanism
npm
已经 publish 的 npm 包,现在是不允许撤回的,因为你的包可能被别人依赖,一旦撤回、删除,可能引发连锁反应的故障。曾经 npm 发生过类似的事件,一个 left-padding
的库作者删除掉后,引发了 babel 等知名包的故障。 所以这种允许撤回的机制是有潜在风险的。详情: http://www.jianshu.com/p/2d2a8dd58f21
一个符合 CommonJS 规范的包应该是如下这种结构:
一个 package.json 文件应该存在于包顶级目录下
二进制文件应该包含在 bin 目录下。
JavaScript 代码应该包含在 lib 目录下。
文档应该在 doc 目录下。
单元测试应该在 test 目录下。
npm 技巧
使用 npm init 来初始化一个项目的 package.json 时,总要输入一些 author 之类的信息,我们可以配置.npmrc 的全局配置,从而让他有一些默认值。 可以直接使用 npm config 命令来完成这件事:
1 | npm config set init.author.email "websheldoncui@gmail.com" |
最新版本的 npm 如果发现当前目录里没有 node_modules, 但上层目录又 node_modules, 则会选择把依赖安装到上层目录的 node_modules 里面。并自动记录或更新 package.json 文件。
打包
npm pack 可以本地打包,其实包就是 tgz 格式,即采用 gz 压缩的一个 tar 包。
发布
有时需要 rebuild
有些项目(例如 hexo)的依赖里面会使用了二进制编译的一些模块,例如 hexo 依赖了一个 Dtrace 的模块,如果你的 Node 升级了很可能会报出:
1 | Error: Cannot find module './build/default/DTraceProviderBindings' |
这是因为 在你把系统的 Node 版本升级后这个二进制包可能就不适用于当前 Node 版本了,此时你需要执行 npm rebuild
来重新编译该二进制包。
使用 nvm 管理 node 版本
注意这里说的是 nvm,不是 npm。nvm 是个第三方的管理 node 版本的工具。