模块
编写稍大一点的程序时一般都会将代码模块化。在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模块,可与触发器配合使用 下载远程文件 可以在每个步骤上使用触发器 要求 无需要求此模块仅使用本机NodeJS模块 对于演示,我使用了[NodeJS队列管理器]( ) 版本 1.0.0 ...
一个简单的cli工具,用于试用不同的nodejs模块。 安装 npm install -g trymodule 用法 trymodule colors 如果需要,下载模块颜色,并使用当前范围内加载的颜色启动nodejs REPL,以供您使用。 trymodule colors ...
D:\Program Files\node\nodejs\node_modules” 这里写图片描述 3.用户变量的path中添加 “;D:\Program Files\node\nodejs\node_modules\npm” 如果之前安装了node,则修改这个路径 这一步完之后,就可以测试...
es6modules-nodejs, 在 node.js 中,对ES6模块讨论的总结 在 node.js ( 2016 ) 中的 ES2015 MODULE 检测。:这是什么?node 已经公开讨论了如何在未来版本的 Node.js 中实现 ES2015 modules的方法。 目前已经有几个...
just_include ======================== 包含私有模块的 NodeJS 模块。安装 npm install just_include --save为此,请勿使用 VAR 调用! 然后它创建一个可在任何文件中使用的全局函数。 它也必须在主 JS 文件中启动...
说明 本文参考Node官网文档版本为v11.12.0。 本文主要分析了Nodejs中require导入JSON和js文件时得到的结果...在Node.js的文档中,require的相关文档是在Modules目录下,属于Nodejs模块化系统的一部分。 require是一个函
主要给大家介绍了关于NodeJS模块与ES6模块系统语法及注意点的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
nodejs中用于各种字符集间高效的转码 nodejs中用于各种字符集间高效的转码 nodejs中用于各种字符集间高效的转码 nodejs中用于各种字符集间高效的转码 nodejs中用于各种字符集间高效的转码 nodejs中用于各种字符集间...
获取模块包括相对于您的根路径的本地NodeJS模块安装npm i -- save getmodule用法将getmodule添加到您的app.js (或您的应用程序的主文件)的顶部: require ( 'getmodule' ) ; 现在,您可以基于应用程序的根路径调用...
nodejs-模块 Salsita开发的用于node.js应用程序的共享模块。 -常用的错误类别 用于捕获和显示错误的顶级中间件 中间件和服务器,用于将用户重定向到生产上的安全连接 在路线上用于验证输入的中间件 配置身份...
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 模块,允许您在不需要引用的情况下访问任何其他模块,并检测其功能以促进自定义指标和日志记录。 示例用法: var hxmetrics = require('hxmetrics'); var uri = 'node_modules/mysql/lib/...
用于 NodeJS 的 AkeebaBackup 模块此模块可让您轻松使用 node.js 中的 AkeebaBackup JSON API。 AkeebaBackup ( ) 是 Joomla 的备份软件! 从 0.1.0 版本开始,它只支持原始加密,但将来,如果需要,将添加 apis ...
nodejs使用ES6中的import进行引入模块,首先对文件的后缀进行更改为.mjs,其次需要在配置文件目录中添加"type": "module",再启动node服务的时候会发生改变 需要添加--experimental-modules如(nodemon --experimental...
nashorn-commonjs-modules, CommonJS的模块支持 Nashorn CommonJS模块支持 Nashorn这个库增加了对CommonJS模块( aka require ) inside的支持( Nashorn脚本... 它基于 NodeJS模块的规范,它支持从文件夹加载模块,就像
nodejs-modules吉特git clone https://github.com/soravmobi/mobiweb-nodejs-modules.gitnpmjs https://www.npmjs.com/package/mobiweb-nodejs-modules用法基本模块,如用户注册,验证帐户,登录,社交登录,frogot...
o Core Modules 核心模块 o File Modules 文件模块 o Loading from `node_modules` Folders 从 `node_modules` 目录中加载 Optimizations to the `node_modules` Lookup Process 优化 `node_modules` 的查找过程 ...
NodeJS模块,用于根据json模式规范规范化json数据类型。 产品特点 将Json Node类型转换/转换为另一种类型: 来自Json Schema规范 从杰森路径 支持的类型: string number , integer array boolean null ...
基本标签 :baseball: basetag使您可以使用相对于Node.js项目基本路径的本地模块·· · ·basetag创建一个$在您的本地符号链接node_modules让您可以: :downcast_face_with_sweat: 转这个: const balls = require ...
在本文中,我们将讨论如何创建npm包/模块