什么是模块?

  • 在 node 中,文件和模块是一一对应的,也就是一个文件就是一个模块

  • 每个模块都有自己的作用域

  • 我们使用 var 来申明的一个变量,他并不是全局的,而是属于当前模块下

模块的加载与使用

模块的引入

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

  • 模块路径可以是一个以 / 开头,表示一个 绝对路径

  • 模块路径以 ./ 开头,表示当前目录出发的 相对路径

  • 模块路径如果没有以 / 或者 ./ 开头,那么这个模块要么是 核心模块 要么是通过 npm 安装在 node_modules 文件夹下的。

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

模块的加载机制

  1. 首先按照加载的模块的文件名称进行查找

  2. 如果没有找到,则会在模块文件名称后加上 .js 的后缀,进行查找

  3. 如果还没有找到,则会在文件名称后加上 .json 的后缀,进行查找

  4. 如果还没有,则会在文件名称后加上 .node 的后缀,进行查找

  5. 最终未找到,抛出异常

模块数据的使用

与浏览器中不同 , 在 node 中,每一个模块都有自己的作用域,在模块中使用 var 申明的变量的作用域范围是在该模块内,而不是 node 全局的。
但是你忘记了使用 var 进行变量声明,恭喜你这时和浏览器中忘记使用的效果是一致的。该变量也将挂在全局对象上。
只不过在 node中,全局对象是global,而不是浏览器中的window

下面看一个简单的例子:

我们从两个文件 a.jsb.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让模块导出一个值,这样做会破坏 exportsmodule.exports 的引用关系。

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

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

Node.js 模块系统相关推荐

  1. Node.js模块系统

    2019独角兽企业重金招聘Python工程师标准>>> 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分 ...

  2. 浅谈Node.js模块系统

    模块是什么?模块用于不同node.js文件相互调用功能.也就是说,一个js文件就可以是一个模块. 1.创建模块 main.js文件: var hello = require('./hello'); h ...

  3. node mysql 模块化_Node.js 模块系统

    Node.js模块系统 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个 Node. ...

  4. Node.js 模块以及npm包的管理和使用

    Node.js模块系统 Node.js的模块系统是将可重用代码封装在各种模块中,减少了应用程序的代码量,模块系统提高了开发效率和代码的可读性,并且模块打包代码的方式不会改变全局作用域,开发人员可以在被 ...

  5. node中模块系统及核心模块、执行node文件

    node中模块系统: 1.模块系统:核心模块.第三方模块. 自己写的模块. 2.网页中所有的路径都是URL,而不是文件路径. 3.node偏底层开发,开启的服务器完全是一个黑盒子,所有的资源默认都是不 ...

  6. Node.js「一」—— Node.js 简介 / Node.js 模块 / 包 与 NPM

    本文为 Node.js 系列笔记第一篇.文章参考:nodejs 教程 -- 大地:<深入浅出 Node.js>:阮一峰 nodejs 博客 文章目录 一.Node 简介 1. 简单介绍 2 ...

  7. 编写原生的Node.js模块

    通常,我们开发原生Node.js模块包括但不仅限于以下原因: 对性能有比较苛刻要求的应用.尽管Node.js得益于libuv,在异步I/O操作很有优势,但遇到数字计算时并不是一个很好的选择. 使用更加 ...

  8. node 大写_大写Node.js模块

    node 大写 Today, let's see a third party module that helps us in working with upper-case letters witho ...

  9. Node.js 模块之Nimble流程控制

    NodeJS异步的特性有时候会导致程序非常的难看,回调一层套着一层,这个时候就要用流程控制模块来控制究竟是同步还是异步了. Nimble是一个轻量.可移植的函数式流程控制模块.经过最小化和压缩后只有8 ...

最新文章

  1. java TreeMap 源代码分析 平衡二叉树
  2. leetcode算法题--学生分数的最小差值
  3. VUE 携手神策数据,数据驱动短视频质效双升级
  4. 二叉树的四种遍历方式(递归和非递归双重实现)
  5. MySQL备份与恢复——基于Xtrabackup物理备份恢复
  6. vc++ 项目里External dependencies 的文件存放内容和各个文件的存放内容
  7. 最优化课堂笔记04:非线性规划(考点4-5例题)
  8. mysql优化要点_你需要掌握的 Mysql 优化的一些要点
  9. 【Hive】字符串函数
  10. EasyRecovery---ppt恢复技巧
  11. Linux下安装LAMP的步骤
  12. autoreconf:未找到命令
  13. Word2vector原理
  14. 十进制转换为二进制代码
  15. 加密文件夹密码忘记怎么办?
  16. 腾讯QQ空间穿越时光轴3D特效
  17. android的EditText字数检测和限制
  18. 福州大学数学与计算机科学学院复试名单,福州大学数学与计算机科学/软件学院2020年硕士研究生招生复试结果(专业型公示)...
  19. 无需会员,百度云不限速下载!
  20. [IC]浅谈嵌入式MCU软件开发之中断优先级与中断嵌套

热门文章

  1. android获取手机的IMSI码
  2. Java中常用的加密算法MD5,SHA,RSA
  3. 6 自定义控件之屏蔽控件的设计时属性
  4. 测试基础-01-软件测试的定义与分类
  5. 测试用例-其他相关知识
  6. cc java区别_cC和C++和java的问题有啥区别?
  7. 零基础学习前端开发,怎么自学javascript?
  8. acl 允许同网段访问_ENSP模拟交换环境中调用高级ACL限制不同网段之间互访
  9. python下载文件传到服务器_python实现FTP文件传输(服务器端和客户端)
  10. linux二进制安装包制作,linux下二进制安装包的创建