nodejs系列笔记02---模块路径解析
2016-11-15 17:39
330 查看
模块路径解析规则
参考这篇博客我们已经知道,require函数支持斜杠(/)或盘符(C:)开头的绝对路径,也支持./开头的相对路径。但这两种路径在模块之间建立了强耦合关系,一旦某个模块文件的存放位置需要变更,使用该模块的其它模块的代码也需要跟着调整,变得牵一发动全身。因此,require函数支持第三种形式的路径,写法类似于foo/bar,并依次按照以下规则解析路径,直到找到模块位置。
内置模块
如果传递给require函数的是NodeJS内置模块名称,不做路径解析,直接返回内部模块的导出对象,例如require('fs')
node_modules目录
NodeJS定义了一个特殊的node_modules目录用于存放模块。例如某个模块的绝对路径是/home/user/hello.js,在该模块中使用require('foo/bar')方式加载模块时,则NodeJS依次尝试使用以下路径。
/home/user/node_modules/foo/bar /home/node_modules/foo/bar /node_modules/foo/bar
可以看出module path的生成规则为:从当前文件目录开始查找node_modules目录;然后依次进入父目录,查找父目录下的node_modules目录;依次迭代,直到根目录下的node_modules目录。
NODE_PATH环境变量
与PATH环境变量类似,NodeJS允许通过NODE_PATH环境变量来指定额外的模块搜索路径。NODE_PATH环境变量中包含一到多个目录路径,路径之间在Linux下使用:分隔,在Windows下使用;分隔。例如定义了以下NODE_PATH环境变量:
NODE_PATH=/home/user/lib:/home/lib
当使用require('foo/bar')的方式加载模块时,则NodeJS依次尝试以下路径
/home/user/lib/foo/bar /home/lib/foo/bar
包(package)
把多个子模块组成的大模块称为包在组成一个包的所有子模块中,需要有一个入口模块,入口模块的导出对象被作为包的导出对象
在其它模块里使用包的时候,需要加载包的入口模块
如果想自定义入口模块的文件名和存放位置,就需要在包目录下包含一个package.json文件,并在其中指定入口模块的路径
首先搜索当前目录下的package.json文件,查找里面的mian属性,如果存在,则加载该属性所指定的的文件。 如果不存在package.json或者该文件里面没有main字段,nodejs将试图加载 index.js,都不存在那么就只有说一声Cannot find module了。
工程目录
了解了以上知识后,现在我们可以来完整地规划一个工程目录了。以编写一个命令行程序为例,一般我们会同时提供命令行模式和API模式两种使用方式,并且我们会借助三方包来编写代码。除了代码外,一个完整的程序也应该有自己的文档和测试用例。因此,一个标准的工程目录都看起来像下边这样。- /home/user/workspace/node-echo/ # 工程目录 - bin/ # 存放命令行相关代码 node-echo + doc/ # 存放文档 - lib/ # 存放API相关代码 echo.js - node_modules/ # 存放三方包 + argv/ + tests/ # 存放测试用例 package.json # 元数据文件 README.md # 说明文件
其中部分文件内容如下:
/* bin/node-echo */ var argv = require('argv'), echo = require('../lib/echo'); console.log(echo(argv.join(' '))); /* lib/echo.js */ module.exports = function (message) { return message; }; /* package.json */ { "name": "node-echo", "main": "./lib/echo.js" }
NPM
NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:允许用户从NPM服务器下载别人编写的三方包到本地使用。
允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。
相关文章推荐
- nodejs系列笔记02---模块路径解析
- NodeJS笔记(二)- 修改模块默认保存路径
- nodejs系列(5)网址处理模块url和路径处理模块path相关应用
- Nodejs内置模块不需做路径解析,外部自定义模块必须做路径解析
- 【笔记】C++自学笔记系列02:类的组合与类的友元
- nodejs的require模块(文件模块/核心模块)及路径介绍
- Freescale 9S12 系列单片机应用笔记(ECT 模块) 5
- Freescale 9S12 系列单片机应用笔记(ECT 模块) 4
- Freescale 9S12 系列单片机应用笔记(ECT 模块) 2
- Sharepoint学习笔记—习题系列--70-573习题解析 -(Q85-Q87)
- Sharepoin学习笔记—架构系列--Sharepoint的网页(Page),网页解析(Parsing)与解析安全处理(Security)
- Freescale 9S12 系列单片机应用笔记(ECT 模块) 2
- Sharepoint学习笔记—习题系列--70-573习题解析 -(Q118-Q120)
- Sharepoint学习笔记—习题系列--70-573习题解析 -(Q40-Q44)
- nodejs:csv模块解析
- nodejs的require模块及路径
- Freescale 9S12 系列单片机应用笔记(ECT 模块) 5
- Freescale 9S12 系列单片机应用笔记(ECT 模块) 1
- Freescale 9S12 系列单片机应用笔记(ECT 模块) 6
- Sharepoint学习笔记—习题系列--70-573习题解析 -(Q11-Q14)