node 笔记
《Node.js 实战》《The Node Beginner Book》等笔记。
《Node.js 实战》
5.2 npm:Node 包管理器
安装模块:npm install mysql
搜索模块:npm search sql
npm 将模块包安装到项目的 node_modules/ 子目录下。如果一个模块包本身包含依赖,那么这些依赖都会被安装到这个模块所在的文件下的 node_modules/ 子目录下。
+ project/
+ node_modules/
module1
module2
+ node_modules
dependency1
查看模块清单:npm ls
更新模块:npm update mysql
如果没有提供模块的名字,则会更新所有的模块包
5.3 使用模块
var http = require("http");
5.3.1 查找模块
- 如果请求的是内置模块,Node 会直接使用这些模块。
- 如果模块名是以路径符开始的(./,../),Node 会在指定的目录中查找模块并加载。如果没有在模块名指定 .js 扩展名,Node 会首先查找基于同名文件夹的模块。如果没有找到,它会添加扩展名 .js、.json、.node,并依次尝试加载这些类型的模块(带有 .node 扩展名的模块会被编译成附加模块)。
- 如果模块名没有路径符,Node 会在当前文件夹的 node_modules/ 子文件夹下查找模块,如果找到,则加载该模块,否则,Node 会在当前位置的路径树下搜寻 node_modules/ 文件夹,如果依然失败,则会在默认的路径下搜寻,例如:/usr/lib/ 或 /usr/local/lib。
- 如果在以上任何一个位置都没有找到模块,则抛出错误。
5.3.2 模块缓存
当模块从指定文件或目录上加载了之后,Node 会将它缓存。之后所有的 require 调用都会加载相同的模块。但是有时候当两个文件都尝试加载一个指定的模块时,可能得到的并不是同一个。例:
+ project
+ node_modules/
+ special_widget/
+ node_modules/
mail_widget(v2.0.1)
mail_widget(v1.0.0)
main.js
utils.js
在这个例子中,如果 main.js 与 utils.js 都引入了 mail_widget,根据 Node 的搜索规则,它会在项目的 node_modules/ 子目录下搜寻模块,最终获取 mail_widget 的 1.0.0 版本。但是,如果引入 special_widget,而这个模块使用了 mail_widget,那么 special_widget 会获取自己私有的 mail_widget(2.0.1) 版本。
所以,在 Node 中可以自由的已经引入不同版本的模块,而不会互相干扰。
《The Node Beginner Book》