node.js学习三简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

一、一个简单的node程序

1、新建一个txt文件

2、修改后缀

修改之后会弹出这个,点击“是”

3、运行test.js

源文件

使用node.js运行之后的。

如果该路径下没有该文件,会报错

4、运行test2.js

 

 

二、模块简单使用

为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Node环境中,一个.js文件就称之为一个模块(module)。

 

模块化的开发的好处:提高代码的可维护性,避免修改代码对其他部分造成修改。

 

我们编写了一个test.js文件,这个test.js文件就是一个模块,模块的名字就是文件名(去掉.js后缀),所以test.js文件就是名为test的模块。

 

1、首先。我们把test.js改造一下,创建一个函数,这样我们就可以在其他地方调用这个函数:

函数greet()是自模块中定义的,最后一行是一个赋值语句,意识就是说,把函数greet作为模块的输出暴露出去,这样其他模块就可以使用greet函数了。

2、然后。其他模块怎么使用test模块的这个greet函数?在编写一个main.js文件,调用test模块的greet函数。

PS:引入test模块用Node提供的require函数:

引入模块作为变量保存在greet变量中,那greet变量到底是什么东西?其实变量greet就是test.js中我们使用module.exports=greet,输出的greet函数。所以,main.js就成功引用

 test.js模块中定义的greet函数,接下来我们将使用。

 

3、注意事项:

在使用require()引入模块时候,注意模块的相对路径,因为main.js和test.js处于同一个目录,所以我们使用当前的目录:

greet=require();

如果你写

greet=require();

Node就会依次在内置模块、全局模块和当前模块下查找test.js,容易出现错误。

 

写代码:

1、模块名是否写对

2、模块文件是否存在

3、相对路径是否写对

 

三、CommonJS规范

这种模块加载机制被称为CommonJS规范。在这个规范下,每一个.js文件都是一个模块,他们内部各自使用的变量名和函数名都互不冲突,例如:test.js和main.js都申明全局变量var s=‘XXX’,但是互不影响。

 

一个模块想对外暴露变量,可以使用

module.exports = variable;

 一个模块要引用其他模块的变量,使用

= require();

 

 当我们编写JavaScript代码时候,我们可以申请全局变量:

s = ;

在浏览器中,大量的使用全局变量可不好。如果你在a.js中使用全局变量s,那么在b.js中也使用全局变量s,将会造成冲突,b.js中对s赋值会改变a.js的运行逻辑。

 

也就是说,JavaScript语言本身并没有一种模块化的机制来保证不同模块之间可以使用相同的变量名。

 

那么Node.js是如何实现这一点?

实现这个模块的功能,并不需要语法层面的支持。Node.js也并不会增加任何JavaScript语法。实现模块功能在于JavaScript是一种函数式的变成语言,它支持闭包。如果我们把一段JavaScript代码用一个函数包装起来,这段代码的所有“全局”变量就了函数内部的局部变量。

 

test.js代码是这样的

var s='hello';
var name='world';

console.log(s+' '+name+'!')

Node.js加载test.js后,可以把代码包装一下,变成这样:

s= name=console.log(s+<span style="color: #800000;">' <span style="color: #800000;">'+name+<span style="color: #800000;">'<span style="color: #800000;">!<span style="color: #800000;">'<span style="color: #000000;">);
})();

这样一来,原来的全局变量s变成了匿名函数内部的局部变量。如果Node.js继续记载其他模块,这些模块中定义的“全局”变量s也互不干扰。

所以Node.js利用JavaScript的函数式编程的特性,轻而易举实现模块的隔离。

 

模块输出modeule.exports怎么实现?

Node可以先准备一个对象module:

module= load= +name+= exported= save(module,exported);

可见,变量module是Node在加载js文件之前准备的一个变量,并将其传入加载函数,test.js中可以直接使用变量module原因在于它实际上是函数的一个参数:

module.exports=greet;

通过把参数module传递给load()函数,hello.js就顺利吧一个变量传递给Node执行环境,Node会把module变量保存起来。

 

由于Node保存了所有导入的module,当我们用require()获取module时,Node找到相应的module,把这个module的exports变量返回,这样,另外一个模块就可以顺利拿到模块的输出:

greet=require();

以上是Node实现JavaScript模块的一个简单的原理介绍。

学习网址(参考廖雪峰):http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001434502419592fd80bbb0613a42118ccab9435af408fd000

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


问题背景 最近小伙伴提了一个希望提高后台下拉列表可操作性的需求,原因是下拉列表选项过多,每次下拉选择比较费时费力且容易出错,硬着头皮啃了啃前端知识,网上搜寻了一些下拉列表实现的资料,这里总结一下。 P
// n位随机数生成 function randomNum(n) { let sString = &quot;&quot;; let strings = &quot;abcdefghijklmnopq
HTML是HyperText Markup Language的简称,中文名称:超文本标记语言,它是一种用于创建网页的 标准标记语言
层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。
JavaScript 是脚本语言,是一种解释性脚本语言(代码不进行预编译)
本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 一名开发者或设计师通常可以在一秒内指出优秀的设计,但对于糟糕的设计只需最多半
本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 Excel是我们办公中常用的工具 ,它几乎能为我们处理大部分数据,友好的交互
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://blog.bitsrc.io/8-tips-for-an-awesome-sign
本文由葡萄城技术团队于博客园翻译并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 如果我们自己编写从URL中分析和提取元素的代码,那么有可能会比较痛苦
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://blog.bitsrc.io/what-is-deno-and-will-it-r
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://blog.bitsrc.io/4-reasons-to-use-sass-in-y
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://blog.bitsrc.io/vuejs-3-0-0-beta-features-
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://blog.bitsrc.io/sessionstorage-and-localst
一直以来,JavaScript使用数组和对象来定义和存放结构化数据, 在这篇文章中,我们将一起深挖另一种对象Map的一切,我们将会去了解它是什么、如何遍历、都包括什么属性和方法以及优缺点是什么。
由于CSS的出现,现在的网站风格已经与它们很早之前的样子有了很大的不同。CSS的出现为原本平平无奇的网页注入了活力。这也是网站的用户体验得到进一步进化的原因。这可能就是当今几乎所有的网站或多或少都在使
自苹果推出了iPhone应用商店以来,App成为了我们生活中不可或缺的一部分,而对于实体业务也是如此,现在各行业都在推出自己的App,但有没有人想过这样一种场景,如果自己的潜在客户还没有安装你的App
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://blog.bitsrc.io/10-top-chrome-extensions-f
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://blog.bitsrc.io/do-your-buttons-lead-or-mi
本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前段时间在开发【葡萄城社区】公众号时有一个功能是需要用网页授权认证地址生成二
本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 HTML5的发展改变了互联网技术趋势,前端热度依旧不减,所以对于应用开发人员