Node.js 模块系统
什么是模块?
在 node 中,文件和模块是一一对应的,也就是一个文件就是一个模块
每个模块都有自己的作用域
我们使用 var 来申明的一个变量,他并不是全局的,而是属于当前模块下
模块的加载与使用
模块的引入
在 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:
var a = '这是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() {return new Date();
}
module_b.js:
var a = 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:
var a = 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/
Node.js 模块系统相关推荐
- Node.js模块系统
2019独角兽企业重金招聘Python工程师标准>>> 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分 ...
- 浅谈Node.js模块系统
模块是什么?模块用于不同node.js文件相互调用功能.也就是说,一个js文件就可以是一个模块. 1.创建模块 main.js文件: var hello = require('./hello'); h ...
- node mysql 模块化_Node.js 模块系统
Node.js模块系统 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个 Node. ...
- Node.js 模块以及npm包的管理和使用
Node.js模块系统 Node.js的模块系统是将可重用代码封装在各种模块中,减少了应用程序的代码量,模块系统提高了开发效率和代码的可读性,并且模块打包代码的方式不会改变全局作用域,开发人员可以在被 ...
- node中模块系统及核心模块、执行node文件
node中模块系统: 1.模块系统:核心模块.第三方模块. 自己写的模块. 2.网页中所有的路径都是URL,而不是文件路径. 3.node偏底层开发,开启的服务器完全是一个黑盒子,所有的资源默认都是不 ...
- Node.js「一」—— Node.js 简介 / Node.js 模块 / 包 与 NPM
本文为 Node.js 系列笔记第一篇.文章参考:nodejs 教程 -- 大地:<深入浅出 Node.js>:阮一峰 nodejs 博客 文章目录 一.Node 简介 1. 简单介绍 2 ...
- 编写原生的Node.js模块
通常,我们开发原生Node.js模块包括但不仅限于以下原因: 对性能有比较苛刻要求的应用.尽管Node.js得益于libuv,在异步I/O操作很有优势,但遇到数字计算时并不是一个很好的选择. 使用更加 ...
- node 大写_大写Node.js模块
node 大写 Today, let's see a third party module that helps us in working with upper-case letters witho ...
- Node.js 模块之Nimble流程控制
NodeJS异步的特性有时候会导致程序非常的难看,回调一层套着一层,这个时候就要用流程控制模块来控制究竟是同步还是异步了. Nimble是一个轻量.可移植的函数式流程控制模块.经过最小化和压缩后只有8 ...
最新文章
- java TreeMap 源代码分析 平衡二叉树
- leetcode算法题--学生分数的最小差值
- VUE 携手神策数据,数据驱动短视频质效双升级
- 二叉树的四种遍历方式(递归和非递归双重实现)
- MySQL备份与恢复——基于Xtrabackup物理备份恢复
- vc++ 项目里External dependencies 的文件存放内容和各个文件的存放内容
- 最优化课堂笔记04:非线性规划(考点4-5例题)
- mysql优化要点_你需要掌握的 Mysql 优化的一些要点
- 【Hive】字符串函数
- EasyRecovery---ppt恢复技巧
- Linux下安装LAMP的步骤
- autoreconf:未找到命令
- Word2vector原理
- 十进制转换为二进制代码
- 加密文件夹密码忘记怎么办?
- 腾讯QQ空间穿越时光轴3D特效
- android的EditText字数检测和限制
- 福州大学数学与计算机科学学院复试名单,福州大学数学与计算机科学/软件学院2020年硕士研究生招生复试结果(专业型公示)...
- 无需会员,百度云不限速下载!
- [IC]浅谈嵌入式MCU软件开发之中断优先级与中断嵌套
热门文章
- android获取手机的IMSI码
- Java中常用的加密算法MD5,SHA,RSA
- 6 自定义控件之屏蔽控件的设计时属性
- 测试基础-01-软件测试的定义与分类
- 测试用例-其他相关知识
- cc java区别_cC和C++和java的问题有啥区别?
- 零基础学习前端开发,怎么自学javascript?
- acl 允许同网段访问_ENSP模拟交换环境中调用高级ACL限制不同网段之间互访
- python下载文件传到服务器_python实现FTP文件传输(服务器端和客户端)
- linux二进制安装包制作,linux下二进制安装包的创建