要求模块在文件系统中使用相对路径存放,对于组织程序特定的代码很有帮助,但对于想要在程序间共享或跟其他人共享代码却用处不大。
Node 中有一个独特的模块引入机制,可以不必知道模块在文件系统中的具体位置。这个机制就是使用node_modules目录。
前面那个模块的例子中引入的是./currency
。如果省略./ ,只写currency ,Node会遵照几个规则搜寻这个模块:
用环境变量NODE_PATH可以改变 Node模块的默认路径。
如果用了它,在 Windows中NODE_PATH应该设置为用分号分隔的目录列表,在其他操作系统中则用冒号分隔。
尽管Node模块系统的本质简单直接,但还是有两点需要注意一下:
如果模块是目录,在模块目录中定义模块的文件必须被命名为index.js,除非你在这个目录下一个叫 package.json 的文件里特别指明。
要指定一个取代index.js的文件,package.json文件里必须有一个用JavaScript 对象表示法(JSON ) 数据定义的对象,其中有一个名为main的键,
指明模块目录内主文件的路径。
流程图对这些规则做了汇总。
下面是一个package.json 文件的栗子,它指定currency.js 为主文件
Node能把模块作为对象缓存起来。
如果程序中的两个文件引入了相同的模块,第一个require会把模块返回的数据存到内存中,这样第二个require就不用再去访问和计算模块的源文件了。
也就是说,在同一个进程中用require加载一个模块得到的是相同的对象。
假设你搭建了一个MVC Web应用程序,它有一个主对象 app。你可以设置好那个app 对象,导出它,然后在项目中的任何地方require它。如果你在这个app对象中放了一些配置信息,那你就可以在其他文件中访问这些配置信息的值。
举个栗子,假定目录结构如下所示:
project
app.js
models
post.js
Node 工作原理: