未加星标

Node.js 模块系统

字体大小 | |
[前端(javascript) 所属分类 前端(javascript) | 发布者 店小二03 | 时间 2016 | 作者 红领巾 ] 0人收藏点击收藏

在 node 中,我们使用 require('模块') 的形式将一个模块引入到我们的当前的文件中来。关于 require 路径的写法也有如下几种:

模块路径可以是一个以 / 开头,表示一个 绝对路径 模块路径以 ./ 开头,表示当前目录出发的 相对路径 模块路径如果没有以 / 或者 ./ 开头,那么这个模块要么是 核心模块 要么是通过 npm 安装在 node_modules 文件夹下的。

看到上面的不同路径写法, 我们就想起来在 web 中引入当前文件夹中的文件时是不需要加上 ./ 的, 但在 node 中使用 ./ 或 / 开头的路径和不使用时,有着很大的差别。

模块的加载机制 首先按照加载的模块的文件名称进行查找 如果没有找到,则会在模块文件名称后加上 .js 的后缀,进行查找 如果还没有找到,则会在文件名称后加上 .json 的后缀,进行查找 如果还没有,则会在文件名称后加上 .node 的后缀,进行查找 最终未找到,抛出异常 模块数据的使用

与浏览器中不同 , 在 node 中,每一个模块都有自己的作用域,在模块中使用 var 申明的变量的作用域范围是在该模块内,而不是 node 全局的。

但是你忘记了使用 var 进行变量声明,恭喜你这时和浏览器中忘记使用的效果是一致的。该变量也将挂在全局对象上。

只不过在 node 中,全局对象是 global ,而不是浏览器中的 window

下面看一个简单的例子:

我们从两个文件 a.js 和 b.js 就可以简单的看到 node 的声明变量的作用域。

a.js:

vara ='这是a声明的变量'; console.log('这是a.js模块');

b.js:

require('./2.js'); console.log('bbbb'); console.log(a); console.log(global.a);

node b.js 输出结果:

这是2.js模块 bbbb console.log(a);//ReferenceError: a is not defined

至于去掉 var 之后会是怎么样,大家自己试试吧 ^ ^

暴露模块API

module、module.exports、exports

如同上面代码中所展示的,在 nodejs 中不能直接去拿到另一个模块中的变量函数等等。要让模块暴露一个API成为 require 调用的返回值,我们就需要通过 module.exports 或者 exports 对外提供模块内部变量的访问。

默认情况下,每个模块都会暴露处一个空对象,如果你想要在该对象上添加属性,那么简单的使用 exports 即可。

看这个例子:

module_a.js:

console.log(exports ===module.exports) exports.name = 'module_a.js' exports.data = 'this is module_a.js data' exports.getDate = function(){ returnnewDate(); }

module_b.js:

vara =require('./module_a.js') console.log(a.name) console.log(a.data) console.log(a.getDate())

node module_b.js 输出:

true module_a.js this is module_a.js data Thu Sep 22 2016 22:23:59 GMT+0800 (CST)

可以看到这里实际上在模块内部 exports 就是对于 module.exports 的引用,并且在使用 require 引入模块之后,a 是一个对象。可见外部模块通过 require(模块) 方法加载模块,该函数返回的就是被加载模块的 module.exports 对象

如果这样在 module.exports 对象上一个一个添加属性还满足不了你的需求,你还可以将 module.exports 彻底重写。我们将上面的两个文件改写:

module_a.js:

module.exports =function(text){ console.log('printf: '+ text); }

module_b.js:

vara =require('./module_a.js') a('ok');

node module_b.js 输出: printf: ok

这样有一个需要注意的地方是:直接覆盖 exports 或者 module.exports 让模块导出一个值,这样做会破坏 exports 和 module.exports 的引用关系。

这是对于 node 的模块系统的学习,理解有限,如果有错误之处,请指出,谢谢!

本文地址: https://guowenfh.github.io/2016/10/15/node-module-system/

本文前端(javascript)相关术语:javascript是什么意思 javascript下载 javascript权威指南 javascript基础教程 javascript 正则表达式 javascript设计模式 javascript高级程序设计 精通javascript javascript教程

主题: Node.js浏览器变量数据GM需求
分页:12
转载请注明
本文标题:Node.js 模块系统
本站链接:http://www.codesec.net/view/483135.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 前端(javascript) | 评论(0) | 阅读(36)