首页 web前端 前端问答 nodejs模块是什么

nodejs模块是什么

Oct 29, 2021 pm 03:23 PM
nodejs 模块

模块是Node.js应用程序的基本组成部分,文件和模块是一一对应的,一个Nodejs模块就是一个文件,而这个文件可能是JavaScript代码、JSON或者编译过的“C/C++”扩展,引用模块可用“require('文件路径')”语句。

nodejs模块是什么

本教程操作环境:windows7系统、nodejs 12.19.0版、Dell G3电脑。

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

模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++ 扩展。

对于nodejs来说,一个文件就是一个模块,你可以export接口出去,也可以require别的模块进来。

// module1.js
exports.func1 = function(){
        console.log('func1 from module1 called');
}
登录后复制

module1把函数func1通过exports对象作为模块的公共访问接口。

//module2.js
var in_module1 = require('./module1.js');
in_module1.func1();
exports.func2 = function(){
        console.log('func2 from module2 called');
}
登录后复制

module2把module1 require进来,这个时候,in_module1就相当于module1的exports对象。当使用in_module1调用func1的时候,相当于通过module1的exports对象调用func1。

同时,module2自己的函数func2也通过模块的exports对象作为module2公共接口。

// module3.js
var in_module2 = require('./module2.js');
in_module2.func2();
登录后复制

同理,module3把module2 require进来,此时in_module2就相当于module2的exports对象。

运行结果如下:

rlan@rlan-LA:~/nodejs/nodetest$ node module2.js
func1 from module1 called
rlan@rlan-LA:~/nodejs/nodetest$ node module3.js
func1 from module1 called
func2 from module2 called
登录后复制

nodejs引入模块不仅仅得到模块的公共接口,同时会把文件里别的语句一并引用进来,比如:

module1.js改为

// module2.js
console.log('this is in module2');
var in_module1 = require('./module1.js');
  
in_module1.func1();
  
exports.func2 = function(){
       console.log('func2 from module2 called');
}
登录后复制

module2引入了module1的func1函数,同时执行了module1中的打印语句:

rlan@rlan-LA:~/nodejs/nodetest$ node module1.js
this is in module1
rlan@rlan-LA:~/nodejs/nodetest$ node module2.js
this is in module2         - module2 self
this is in module1         - require module1
func1 from module1 called  - module2 self
登录后复制

现在,module2 载入了module1,module3载入了module2,如果module3再载入一次module1会怎么样呢?

// module3.js
var in_module1 = require('./module1.js');
var in_module2 = require('./module2.js');

in_module1.func1();
in_module2.func2();
登录后复制

这时候,module3首先载入了module1,又载入了module2,module2自己又载入了module1的部分,运行结果为

rlan@rlan-LA:~/nodejs/nodetest$ node module3.js
this is in module1        -  require module1
this is in module2        -  require module2
func1 from module1 called -  require module2
func1 from module1 called -  module3 self
func2 from module2 called -  module3 self
登录后复制

假如把module3的require顺序调整一下:

// module3.js
var in_module2 = require('./module2.js');
var in_module1 = require('./module1.js');

in_module1.func1();
in_module2.func2();
登录后复制

运行结果为:

rlan@rlan-LA:~/nodejs/nodetest$ node module3.js
this is in module2         - require module2
this is in module1         - require module2
func1 from module1 called  - require module2
func1 from module1 called  - module3 self
func2 from module2 called  - module3 self
登录后复制

看起来nodejs用某种机制保证了同一个模块在另一个模块里不会被重复载入,所以

this is in module1
登录后复制

这一行只出现了一次,虽然在module3.js里似乎被载入了两次。

那么,如果循环载入了会发生什么呢?现在我们让module1来require module2:

// module1.js
console.log('this is in module1');

var in_module2 = require('./module2.js');

exports.func1 = function(){
        console.log('func1 from module1 called');
}
登录后复制
// module2.js
console.log('this is in module2');
var in_module1 = require('./module1.js');

in_module1.func1();

exports.func2 = function(){
        console.log('func2 from module2 called');
}
登录后复制

运行结果如下:

rlan@rlan-LA:~/nodejs/nodetest$ node module1.js
this is in module1
this is in module2
/home/rlan/nodejs/nodetest/module2.js:4
in_module1.func1();
           ^
TypeError: in_module1.func1 is not a function
    at Object.<anonymous> (/home/rlan/nodejs/nodetest/module2.js:4:12)
    at Module._compile (module.js:410:26)
    at Object.Module._extensions..js (module.js:417:10)
    at Module.load (module.js:344:32)
    at Function.Module._load (module.js:301:12)
    at Module.require (module.js:354:17)
    at require (internal/module.js:12:17)
    at Object.<anonymous> (/home/rlan/nodejs/nodetest/module1.js:3:18)
    at Module._compile (module.js:410:26)
    at Object.Module._extensions..js (module.js:417:10)
rlan@rlan-LA:~/nodejs/nodetest$ node module2.js
this is in module2
this is in module1
func1 from module1 called
登录后复制

nodejs似乎阻止了载入自己的行为,运行module2的时候,行为跟module1没有载入module2的结果一样,并没有报错。而在运行module1的时候,当走到module2里面,忽略了require module1的语句之后,module2调用了module1的func1,程序出错。

综上,nodejs里嵌套重复载入模块(或者载入自己)的require语句是不能正确执行的。

【推荐学习:《nodejs 教程》】

以上是nodejs模块是什么的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

nodejs和tomcat区别 nodejs和tomcat区别 Apr 21, 2024 am 04:16 AM

Node.js和Tomcat的主要区别在于:运行时:Node.js基于JavaScript运行时,而Tomcat是Java Servlet容器。I/O模型:Node.js采用异步非阻塞模型,而Tomcat是同步阻塞的。并发处理:Node.js通过事件循环处理并发,而Tomcat使用线程池。应用场景:Node.js适用于实时、数据密集型和高并发应用程序,Tomcat适用于传统Java Web应用程序。

nodejs和vuejs区别 nodejs和vuejs区别 Apr 21, 2024 am 04:17 AM

Node.js 是一种服务器端 JavaScript 运行时,而 Vue.js 是一个客户端 JavaScript 框架,用于创建交互式用户界面。Node.js 用于服务器端开发,如后端服务 API 开发和数据处理,而 Vue.js 用于客户端开发,如单页面应用程序和响应式用户界面。

nodejs是后端框架吗 nodejs是后端框架吗 Apr 21, 2024 am 05:09 AM

Node.js 可作为后端框架使用,因为它提供高性能、可扩展性、跨平台支持、丰富的生态系统和易于开发等功能。

nodejs安装目录里的npm与npm.cmd文件有什么区别 nodejs安装目录里的npm与npm.cmd文件有什么区别 Apr 21, 2024 am 05:18 AM

Node.js 安装目录中有两个与 npm 相关的文件:npm 和 npm.cmd,区别如下:扩展名不同:npm 是可执行文件,npm.cmd 是命令窗口快捷方式。Windows 用户:npm.cmd 可以在命令提示符下使用,npm 只能从命令行运行。兼容性:npm.cmd 特定于 Windows 系统,npm 跨平台可用。使用建议:Windows 用户使用 npm.cmd,其他操作系统使用 npm。

nodejs是后端开发语言吗 nodejs是后端开发语言吗 Apr 21, 2024 am 05:09 AM

是的,Node.js 是一种后端开发语言。它用于后端开发,包括处理服务器端业务逻辑、管理数据库连接和提供 API。

nodejs中的全局变量有哪些 nodejs中的全局变量有哪些 Apr 21, 2024 am 04:54 AM

Node.js 中存在以下全局变量:全局对象:global核心模块:process、console、require运行时环境变量:__dirname、__filename、__line、__column常量:undefined、null、NaN、Infinity、-Infinity

nodejs和java的差别大吗 nodejs和java的差别大吗 Apr 21, 2024 am 06:12 AM

Node.js 和 Java 的主要差异在于设计和特性:事件驱动与线程驱动:Node.js 基于事件驱动,Java 基于线程驱动。单线程与多线程:Node.js 使用单线程事件循环,Java 使用多线程架构。运行时环境:Node.js 在 V8 JavaScript 引擎上运行,而 Java 在 JVM 上运行。语法:Node.js 使用 JavaScript 语法,而 Java 使用 Java 语法。用途:Node.js 适用于 I/O 密集型任务,而 Java 适用于大型企业应用程序。

nodejs和java选哪个 nodejs和java选哪个 Apr 21, 2024 am 04:40 AM

Node.js 和 Java 在 Web 开发中各有优劣,具体选择取决于项目要求。Node.js 擅长实时应用程序、快速开发和微服务架构,而 Java 则在企业级支持、性能和安全性方面占优。

See all articles