《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 查找模块

  1. 如果请求的是内置模块,Node 会直接使用这些模块。
  2. 如果模块名是以路径符开始的(./,../),Node 会在指定的目录中查找模块并加载。如果没有在模块名指定 .js 扩展名,Node 会首先查找基于同名文件夹的模块。如果没有找到,它会添加扩展名 .js、.json、.node,并依次尝试加载这些类型的模块(带有 .node 扩展名的模块会被编译成附加模块)。
  3. 如果模块名没有路径符,Node 会在当前文件夹的 node_modules/ 子文件夹下查找模块,如果找到,则加载该模块,否则,Node 会在当前位置的路径树下搜寻 node_modules/ 文件夹,如果依然失败,则会在默认的路径下搜寻,例如:/usr/lib/ 或 /usr/local/lib。
  4. 如果在以上任何一个位置都没有找到模块,则抛出错误。

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》

url-and-querystring