`

NodeJS模块Modules

    博客分类:
  • WEB
阅读更多
模块

    编写稍大一点的程序时一般都会将代码模块化。在NodeJS中,一般将代码合理拆分到不同的JS文件中,每一个文件就是一个模块,而文件路径就是模块名。
    在编写每个模块时,都有require、exports、module三个预先定义好的变量可供使用。

require
    require函数用于在当前模块中加载和使用别的模块,传入一个模块名,返回一个模块导出对象。
var foo1 = require('./foo');
var foo2 = require('./foo.js');
var foo3 = require('/home/user/foo');
var foo4 = require('/home/user/foo.js');
var data = require('./data.json');
var formidable = require("formidable"), util = require("util"), http = require("http"), url = require("url");


exports
    exports对象是当前模块的导出对象,用于导出模块公有方法和属性。别的模块通过require函数使用当前模块时得到的就是当前模块的exports对象。以下例子中导出了一个公有方法。
function route(handle, pathName, response, postData) {
	console.log("About to route a request for " + pathName);
	if(typeof handle[pathName] === 'function') {
		handle[pathName](response, postData);
	} else {
		console.log("No request handler found for " + pathName);
		response.writeHead(404, {"Content-Type": "text/plain"});
		response.write("404 not found");
		response.end();
	}
}

exports.route = route;


module
    通过module对象可以访问到当前模块的一些相关信息,但最多的用途是替换当前模块的导出对象。例如模块导出对象默认是一个普通对象,如果想改成一个函数的话,可以使用以下方式。
module.exports = function () {
    console.log('Hello NodeJS!');
};


模块初始化
    一个模块中的JS代码仅在模块第一次被使用时执行一次,并在执行过程中初始化模块的导出对象。之后,缓存起来的导出对象被重复利用。

主模块
    通过命令行参数传递给NodeJS以启动程序的模块被称为主模块。主模块负责调度组成整个程序的其它模块完成工作。例如通过以下命令启动程序时,main.js就是主模块。

二进制模块
    虽然一般我们使用JS编写模块,但NodeJS也支持使用C/C++编写二进制模块。编译好的二进制模块除了文件扩展名是.node外,和JS模块的使用方式相同。虽然二进制模块能使用操作系统提供的所有功能,拥有无限的潜能,但难以跨平台使用。
    NodeJS使用CMD模块系统,主模块作为程序入口点,所有模块在执行过程中只初始化一次

1.内置模块
    如果传递给require函数的是NodeJS内置模块名称,不做路径解析,直接返回内部模块的导出对象,例如require('fs')。

[color=blue]2.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


3.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


4.包(package)
    多个子模块组成的大模块称做包,所有子模块放在同一个目录里。在组成一个包的所有子模块中,需要有一个入口模块,入口模块的导出对象被作为包的导出对象。例如有以下目录结构。
- /home/user/lib/
    - cat/
        head.js
        body.js
        main.js

其中cat目录定义了一个包,其中包含了3个子模块。main.js作为入口模块,其内容如下:
var head = require('./head');
var body = require('./body');

exports.create = function (name) {
    return {
        name: name,
        head: head.create(),
        body: body.create()
    };
};

在其它模块里使用包的时候,需要加载包的入口模块。接着上例,使用require('/home/user/lib/cat/main')能达到目的

4.1 index.js
当模块的文件名是index.js,加载模块时可以使用模块所在目录的路径代替模块文件路径,因此接着上例,以下两条语句等价。
var cat = require('/home/user/lib/cat');
var cat = require('/home/user/lib/cat/index');

这样处理后,就只需要把包目录路径传递给require函数,感觉上整个目录被当作单个模块使用,更有整体感。

4.2 package.json
如果想自定义入口模块的文件名和存放位置,就需要在包目录下包含一个package.json文件,并在其中指定入口模块的路径。上例中的cat模块可以重构如下。
- /home/user/lib/
    - cat/
        + doc/
        - lib/
            head.js
            body.js
            main.js
        + tests/
        package.json

其中package.json内容如下。
{
    "name": "cat",
    "main": "./lib/main.js"
}

如此一来,就同样可以使用require('/home/user/lib/cat')的方式加载模块。NodeJS会根据包目录下的package.json找到入口模块所在位置。

5.1 在Linux系统下,我们可以把JS文件当作shell脚本来运行
    5.1.1 在shell脚本中,可以通过#!注释来指定当前脚本使用的解析器。所以我们首先在node-echo.js文件顶部增加以下一行注释,表明当前脚本使用NodeJS解析。NodeJS会忽略掉位于JS模块首行的#!注释,不必担心这行注释是非法语句。
 
#! /usr/bin/env node

    5.1.2 然后,我们使用以下命令赋予node-echo.js文件执行权限。
 
 $ chmod +x /home/user/bin/node-echo.js

    5.1.3 最后,我们在PATH环境变量中指定的某个目录下,例如在/usr/local/bin下边创建一个软链文件,文件名与我们希望使用的终端命令同名,命令如下:
 
$ sudo ln -s /home/user/bin/node-echo.js /usr/local/bin/node-echo

    这样处理后,我们就可以在任何目录下使用node-echo命令了。
    5.2 Windows系统下
    得靠.cmd文件来解决问题。假设node-echo.js存放在C:\Users\user\bin目录,并且该目录已经添加到PATH环境变量里了。接下来需要在该目录下新建一个名为node-echo.cmd的文件,文件内容如下:
   
@node "C:\User\user\bin\node-echo.js" %* 

    这样处理后,我们就可以在任何目录下使用node-echo命令了


分享到:
评论

相关推荐

    NodeJS-download:一个用于将远程文件下载到本地的小型NodeJS模块,可与触发器配合使用

    一个用于将远程文件下载到本地的小型NodeJS模块,可与触发器配合使用 下载远程文件 可以在每个步骤上使用触发器 要求 无需要求此模块仅使用本机NodeJS模块 对于演示,我使用了[NodeJS队列管理器]( ) 版本 1.0.0 ...

    trymodule:try尝试使用nodejs模块从未如此简单!

    一个简单的cli工具,用于试用不同的nodejs模块。 安装 npm install -g trymodule 用法 trymodule colors 如果需要,下载模块颜色,并使用当前范围内加载的颜色启动nodejs REPL,以供您使用。 trymodule colors ...

    实例分析nodejs模块xml2js解析xml过程中遇到的坑

    本文实例讲述了nodejs模块xml2js解析xml过程中遇到的坑。分享给大家供大家参考,具体如下: 在一个项目中,用到nodejs模块xml2js解析xml,xml的数据如下: <xml> <MsgId>6197906553041859764 </xml> ...

    nodejs-node -modules.zip

    Node.js 的核心特性之一是它的模块系统,这在"nodejs-node-modules.zip"文件中得到了体现。这个压缩包很可能包含了项目中使用的各种第三方模块,这些模块通常位于项目的 `node_modules` 目录下。 在 Node.js 中,...

    NodeJS packages with basic modules

    这个"NodeJS packages with basic modules"的压缩包可能包含了NodeJS的基础模块,使得初学者或者开发者能够快速搭建一个具备基本功能的开发环境。 **npm(Node Package Manager)**是NodeJS的包管理器,它允许...

    nodejs iconv-lite模块

    nodejs中用于各种字符集间高效的转码 nodejs中用于各种字符集间高效的转码 nodejs中用于各种字符集间高效的转码 nodejs中用于各种字符集间高效的转码 nodejs中用于各种字符集间高效的转码 nodejs中用于各种字符集间...

    include:包含私有模块的 NodeJS 模块

    just_include ======================== 包含私有模块的 NodeJS 模块。安装 npm install just_include --save为此,请勿使用 VAR 调用! 然后它创建一个可在任何文件中使用的全局函数。 它也必须在主 JS 文件中启动...

    nodejs中模块定义实例详解

    当模块引用路径没有使用'/'、'./'或'../'等相对路径或绝对路径时,Node.js会在当前模块的node_modules目录中查找所需的模块。如果当前目录中没有找到,Node.js会按照目录结构逐级向上查找,直到根目录。这种机制使得...

    NodeJS模块与ES6模块系统语法及注意点详解

    下面将详细介绍NodeJS模块系统和ES6模块系统,并指出在使用过程中的注意点。 ### NodeJS模块系统 NodeJS最开始使用的是CommonJS模块规范,该规范由社区提出并广泛使用于NodeJS服务端开发中。CommonJS模块规范中...

    es6modules-nodejs, 在 node.js 中,对ES6模块讨论的总结.zip

    es6modules-nodejs, 在 node.js 中,对ES6模块讨论的总结 在 node.js ( 2016 ) 中的 ES2015 MODULE 检测。:这是什么?node 已经公开讨论了如何在未来版本的 Node.js 中实现 ES2015 modules的方法。 目前已经有几个...

    Nodejs中的require函数的具体使用方法

    说明 本文参考Node官网文档版本为v11.12.0。 本文主要分析了Nodejs中require导入JSON和js文件时得到的结果...在Node.js的文档中,require的相关文档是在Modules目录下,属于Nodejs模块化系统的一部分。 require是一个函

    nodejs-模块

    本篇文章将深入探讨Node.js的模块系统,包括模块的加载机制、常见模块类型以及如何创建和使用自定义模块。 1. **模块加载机制** Node.js采用CommonJS规范,通过`require`函数来加载模块。当调用`require('模块路径...

    getmodule:包括相对于您的根路径的本地NodeJS模块

    获取模块包括相对于您的根路径的本地NodeJS模块安装npm i -- save getmodule用法将getmodule添加到您的app.js (或您的应用程序的主文件)的顶部: require ( 'getmodule' ) ; 现在,您可以基于应用程序的根路径调用...

    通过实例了解Nodejs模块系统及require机制

    3. 如果路径不是核心模块且不以相对路径开头,Node.js会在当前模块的`node_modules`目录下查找模块,如果没有找到,会向上遍历父级目录,直到文件系统的根目录。 4. 如果始终找不到匹配的模块,`require`会抛出一个`...

    nodejs-modules:用于node.js支持的服务器服务的可重用模块

    nodejs-模块 Salsita开发的用于node.js应用程序的共享模块。 -常用的错误类别 用于捕获和显示错误的顶级中间件 中间件和服务器,用于将用户重定向到生产上的安全连接 在路线上用于验证输入的中间件 配置身份...

    NodeJs:NodeJs的一些自用模块 (Some nodejs modules used myself)

    NodeJsNodeJs的一些自用模块 (Some nodejs modules used myself)1、LinkedListthe linked-list module based on basic link-list基于基础链表的上层封装(the linked-list module based on basic link-list)双向链表...

    Nodejs模块载入运行原理

    这个过程首先会尝试从缓存中加载模块,如果未找到,则按照预定的路径规则(如当前目录、`node_modules`目录等)搜索模块的`package.json`文件,解析其`main`字段确定入口文件,然后进行加载和执行。 在应用启动的...

    hxMetrics:在不接触源代码的情况下检测 NodeJS 模块

    这是一个 NodeJS 模块,允许您在不需要引用的情况下访问任何其他模块,并检测其功能以促进自定义指标和日志记录。 示例用法: var hxmetrics = require('hxmetrics'); var uri = 'node_modules/mysql/lib/...

Global site tag (gtag.js) - Google Analytics