node.js 的模块化

模块的概念

为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块加载系统。

在 Node.js 中,文件和模块是一一对应的(每个文件被视为一个独立的模块),换言之,一个 Node.js 文件就是一个模块

模块是Node.js 应用程序的基本组成部分,每个模块都有自己的作用域

在 Node中,模块分为两类

一类是 Node 提供的模块,称为核心模块;另一类是用户编写的模块,称为文件模块。

核心模块部分在 Node 源代码的编译过程中,编译进了二进制执行文件。在 Node 进 程启动时,部分核心模块就被直接加载进内存中,所以这部分核心模块引入时,文件定位和 编译执行这两个步骤可以省略掉,并且在路径分析中优先判断,所以它的加载速度是最快的。 如:HTTP 模块 、URL 模块、Fs模块都是 nodejs 内置的核心模块,可以直接引入使用。

文件模块则是在运行时动态加载,需要完整的路径分析、文件定位、编译执行过程、 速度相比核心模块稍微慢一些,但是用的非常多。这些模块需要我们自己定义。接下来我 们看一下 nodejs 中的自定义模块

当前模块下的内置属性__filename

在node中,这个属性不属于全局的,是数据当前模块的,每个模块都有这样的一个属性返回当前执行的文件的文件路径该路径是经过解析后的绝对路径,在模块中,该路径是模块文件的路径

require(模块)加载示例

创建一个模块,在另外一个模块中加载上面那个模块,运行测试

模块加载机制

模块路径可以是一个以 / 开头,表示一个绝对路径 模块路径以 ./ 开头,表示当前目录下的一个相对路径

模块路径如果没有以 / 或者 ./开头,那么这个模块要么是 核心模块(node自带的系统模块) 要么是 node_modules文件夹下的 所以,需要注意的是 ./ 和 没有 ./或/ 开头的路径是和我们常理上的使用结果是不一样的

模块加载中使用绝对路径:模块路径可以是一个以 /  开头,表示一个绝对路径

模块加载中使用相对路径: 在node中相对路径一定要./开头,表示当前路径下,因为不加./的话,node会认为你加载的是原生模块或者是项目下面的node_modules文件夹下面的模块

模块加载机制中文件查找规则:如果按照文件名没有找到,那么node 自动会在文件名后面添加.js继续查找加载,如果还没有找到则会添加.json,如果还没有,则添加.node,还没有,则报错

顺序依次是 文件名 -> 文件名.js -> 文件名.json -> 文件名.node -> 错误

模块之间数据的使用

模块之间数据的使用中的作用域

在 node 中,每一个模块都有自己的作用域,在模块中使用var申明的变量的作用域范围是在该模块内,而不是node全局的 一个模块中直接去访问另外一个模块中使用var声明的变量是不允许的,会报错

模块之间数据访问的方式一:把变量作为global对象的一个属性,但是这种方式是不推荐的

模块下的module对象:使用module对象,在 node 中,每一个模块都有自己的作用域,同时还有一个 module 的变量,他代表了对当前模块的引用,但是并不是全局对象,并且每个模块都有自己的独立的 module 对象

module对象 : 保存提供和当前模块有关的一些信息

模块之间数据访问的方式二与exports对象
在这个module对象,有一个子对象:exports 对象,我们可以通过这个对象把一个模块中的局部变量对象进行提供访问

module、module.exports、exports三者之间的关系

我们可以通过module.exports 或者 exports 对外提供模块内部变量的访问 外部模块通过require(模块)方法加载模块,该函数返回的就是被加载模块的 module.exports 对象

在模块作用域,还有一个内置的模块对象,exports,他其实就是module.exports

因为module.expotrs===exports所以可以写成下面的这种方式

使用exports需要注意的地方

注意的是最好不要直接覆盖exports或者module.exports,比如 exports=1,module.exports=1,这样做会破坏exports 和 module.exports 的引用关系

module其他对象

module.loaded:模块是否已经加载完成,或正在加载中。

module.parent:最先引用该模块的模块。

module.paths:模块的搜索路径

module.id:模块的标识符。 通常是完全解析后的文件名。

原文地址:https://www.cnblogs.com/LO-ME/p/10458221.html

时间: 2024-08-01 03:08:43

node.js 的模块化的相关文章

node.js的模块化介绍

1. 模块化介绍 1.1. 由于JavaScript不是一个模块化语言,存在两大缺陷: a.文件中的代码会造成全局污染: b. 依赖的加载顺序无法完全保证,例如jquery插件要在引入jquery后引入. 1.2.  Node中的模块化: a. 文件天生就是一个私有的作用域 b. 文件与文件之间通过特定的规则进行交互(导入导出) c.  程序最终由n个文件组成整个应用程序 d. 在每个模块内部,module代表当前模块,这个对象有一个属性exports,通过require函数加载这个模块,其实就

node.js的模块化开发

node.js的代码都是构建在模块化开发的基础之上,模块化开始也是node.js的核心之一. 传统非模块化开发的缺点:1.命名冲突   2.文件依赖 标准的模块化规范: 1.AMD -requirejs 2.CMD- seajs 模块化的规范定义的一些写代码的规则,只要遵循了同样的标准,基本上风格都是一致的 服务端的模块化规范: 1.Common.js  -Node.js 模块化相关的规则: 1.一个js文件 都是一个独立的模块,模块内部的成员都是相互独立的 2.模块化的导入和导出 案例1(ex

Node.js 概述

JavaScript 标准参考教程(alpha) 草稿二:Node.js Node.js 概述 GitHub TOP Node.js 概述 来自<JavaScript 标准参考教程(alpha)>,by 阮一峰 目录 简介 安装与更新 版本管理工具nvm 基本用法 REPL环境 异步操作 全局对象和全局变量 模块化结构 概述 核心模块 自定义模块 异常处理 try-catch结构 回调函数 EventEmitter接口的error事件 uncaughtException事件 unhandled

node.js 的 exports 和 module.exports 的区别

commonjs node.js 的模块系统就是按照模块化规范 commonjs 来实现的: var math = require("math"); math.add(1, 2); exports 和 module.exports node.js 实现模块化最常用的函数就是 exports 和 module.exports. exports 是指向 module.exports 的引用.它们初始化都是为{},require() 返回的是 module.exports,所以当改变了 mo

Node.js的UnitTest单元测试

body{ font: 16px/1.5em 微软雅黑,arial,verdana,helvetica,sans-serif; } 在专业化的软件开发过程中,无论什么平台语言,现在都需要UnitTest单元测试. Node.js有built-in的Assert. 今天让我们来看一下Node.js的单元测试.在这儿我们使用nodeunit, 通过NPM安装: npm install nodeunit -g 支持命令行,浏览器运行. 各种断言. 在node.js下模块化对于方法导出exports,

node.js的总结-可以应付bat的社招面试

什么是NodeJS Node.js采用模块化结构,按照CommonJS规范定义和使用模块.模块与文件是一一对应关系,即加载一个模块,实际上就是加载对应的一个模块文件. JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器. 每一种解析器都是一个运行环境,不但允许JS定义各种数据结构,进行各种计算,还允许JS使用运行环境提供的内置对象和方法做一些事情.例如运行在浏览器中的JS的用途是操作DOM

当Node.js遇见Docker

Node.js Best Practices - How to Become a Better Developer in 2017提到的几点,我们Fundebug深有同感: 使用ES6 使用Promise 使用LTS 使用Docker ... 想必大家都知道ES6,Promise以及LTS,那Docker是啥玩意啊?翻遍Node文档也没见踪迹啊! GitHub仓库: Fundebug/nodejs-docker 什么是Docker? Docker是最流行的的容器工具,没有之一.本文并不打算深入介

Node.js中的模块化

每天一篇文章来记录记录自己的成长吧.大二,该静心了.加油~ 好了,废话不多说,今天说说nodejs中的模块化.(注:此文为自己对书nodejs实战的总结) nodejs一个重要的特性就是模块化,模块就是node.js对常用功能进行分组的方式.而且,node无需真正辨别模块到底是我们自己编写的还是从外部仓库中获取的.这样我们只需要一个额外的json文档和一两行代码,我们就能引用别人的代码或者别人引用我们的代码,是不是很酷~. 好,下面我们来编写一个简单的模块: exports.hello_worl

鼓捣phantomjs(二) node.js模块化集成

著作权所有:http://www.cnblogs.com/zeusro/ 引用(爬虫)不给稿费的,切你jj 一.追忆似屎年华 在上一篇post(http://www.cnblogs.com/zeusro/p/4185196.html)里面,我留下了3个坑没有填平. 2模块化 加载到nodejs里面,用于批量采集. 方法:把变动的参数做成 3淘宝的反采集 4数据的持久化 其实呢,还有一个,就是中文编码的问题, 那么今天把其中2个解决了.持久化给个思路,反采集就算了,哥已经宣布弃坑了. 二.正文 2