位置: 编程技术 - 正文

NodeJS学习笔记之Module的简介(nodejs实战)

编辑:rootadmin

推荐整理分享NodeJS学习笔记之Module的简介(nodejs实战),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:nodejs实战,nodejs实例教程,nodejs基础知识,nodejs基础知识,nodejs实例教程,nodejs入门,nodejs实战教程,nodejs入门教程,内容如对您有帮助,希望把文章链接给更多的朋友!

Node.js模块系统

Node.js有一个简单的模块加载系统。 在Node.js中,文件和模块是一一对应的(每个文件被视为单独的模块)。

例如,考虑下面这个名为 foo.js 的文件:

在第一行, foo.js 加载与 foo.js 同一目录的模块 circle.js 。

circle.js 的内容如下:

模块 circle.js 导出了函数 area() 和 circumference() 。 要将函数和对象添加到模块的根目录,可以将它们赋值到特殊 exports 对象上。

模块内部的变量一定是私有的,因为模块被Node.js包裹在一个函数中(参见下面的模块包装器)。 在这个例子中,变量 PI 对于 circle.js 来说是私有变量。

如果你希望模块导出的是一个函数(如构造函数),或者是要导出完整的对象,而不是一次创建一个属性,则需要将其分配给 module.exports 而不是 exports 。

在下面的 bar.js 中,使用了 square 模块,它导出一个构造函数:

在 square.js 模块中定义一个 square 方法:

此外,模块系统在 require(“module”) 模块中实现。

『main』模块

当某个 module 直接从Node.js运行时,它会将 require.main 设置该 module 。 你可以通过这个来测试这个 module 是被直接运行的还是被 require 的。

require.main === module

就拿文件 foo.js 来说,如果运行 node foo.js 这个属性就是 true 。运行 require('./foo.js') 就是 false 。

因为 module 提供了一个 filename (通常相当于 __filename ),因此可以通过检查 require.main.filename 来获取当前应用程序的入口点。

包管理器的一些提示

Node.js的 require() 函数支持一些合理的目录结构。它让软件包管理器程序(如 dpkg , rpm 和 npm )可以从Node.js模块中直接去构建本地的包而不需要修改。

下面我们给出一个可以正常工作的建议目录结构:

假设我们希望在 /usr/lib/node/<some-package>/<some-version> 中的文件夹来指定版本的包。

此外,包还可以相互依赖。 比如你想安装 foo 包,而这个包有可能需要安装指定版本的 bar 包。而 bar 包也很有可能依赖其他的包,并且在某些特殊情况下,这些依赖包甚至可能会产生循环依赖。

由于Node.js会查找加载的所有模块的 realpath (即解析软链),然后再去node_modules文件夹中查找依赖的包,因此使用以下方案可以非常简单地解决此问题:

/usr/lib/node/foo/1.2.3/ - 包含 foo 包,版本是 1.2.3

/usr/lib/node/bar/4.3.2/ - 包含 foo 所依赖的 bar 包

/usr/lib/node/foo/1.2.3/node_modules/bar - 软链到 /usr/lib/node/bar/4.3.2/

/usr/lib/node/bar/4.3.2/node_modules/* - 软链到 bar 的依赖

因此,即使遇到循环依赖,或者是依赖冲突,每个模块都能加载到并使用自己所依赖指定版本的包。

当 foo 包中 require('bar') 时,它就可以软链到指定版本的 /usr/lib/node/foo/1.2.3/node_modules/bar 。然后,当 bar 包中的代码调用 require('quux') 时,它同样也可以软链到指定版本的 /usr/lib/node/bar/4.3.2/node_modules/quux 。

模块加载的全过程(重点,下面写的伪代码流程一定要记住)

NodeJS学习笔记之Module的简介(nodejs实战)

要获取在调用 require() 将被加载的确切文件名,请使用 require.resolve() 函数。

以下是模块加载的全过程以及 require.resolve 的解析过程:

模块缓存

所有的模块都会在第一次加载之后被缓存起来。 这意味着你每次调用 require('foo') 将得到完全相同的对象。

对 require('foo') 的多次调用可能并不会多次执行该模块的代码。 这是一个重要的功能。 使用它,可以返回“partially done”对象,从而允许根据依赖关系一层一层地加载模块,即使这样做可能会导致循环依赖。

如果要让某个模块在每次被加载时都去执行代码,则需要 exports 一个函数,并调用该函数即可。

模块缓存注意事项

模块是基于其解析出来的文件名进行缓存。根据调用模块的路径,被调用的模块可能会解析出不同的文件名(从node_modules文件夹加载)。如果解析出来的是不同的文件,它不保证每次 require('foo') 总是返回相同的对象。

另外,在不区分大小写的文件系统或操作系统上,不同的解析文件名可以指向相同的文件,但缓存仍将它们视为不同的模块,并将重新加载该文件多次。 例如, require('./ foo') 和 require('./ FOO') 返回两个不同的对象,而不管 ./foo 和 ./FOO 是否是同一个文件。

核心模块

Node.js有些模块被编译成二进制文件。 本文档中的其他部分将对这些模块进行更详细的描述。

核心模块在Node.js的源码 lib/ 文件夹中。

如果核心模块的模块标识传递给 require() ,则它们总是优先加载。 例如,即使有一个自定义模块叫 http ,我们去执行 require('http') 也将始终返回内置的 HTTP 模块,

循环引用

当循环引用 require() 时,返回模块可能并没有执行完成。

考虑这种情况:

a.js :

b.js :

app.js :

当 app.js 加载 a.js 时, a.js 依次加载 b.js . 此时, b.js 尝试加载 a.js . 为了防止无限循环,将 a.js 导出对象的未完成副本返回到 b.js 模块。 b.js 然后完成加载,并将其导出对象提供给 a.js 模块。

当 app.js 加载了这两个模块时,它们都已经完成。 因此,该程序的输出将是:

模块包装器

在执行模块的代码之前,Node.js将使用一个函数包装器来将模块内容包裹起来,如下所示:

通过这样做,Node.js实现了以下几点:

它将模块内部的顶级变量(定义为 var , const 或 let )的作用域范围限定为模块内部而不是全局。

它有助于给模块内部提供一些实际上只属于该模块的全局变量,例如:

module 和 exports 对象用来帮助从模块内部导出一些值

变量 __filename 和 __dirname 是当前模块最终解析出来的文件名和文件夹路径

module 对象签名

require 函数签名

详解NodeJS框架express的路径映射(路由)功能及控制 我们知道Express是一个基于NodeJS的非常优秀的服务端开发框架,本篇CSSer将提供express框架的route和routecontrol章节,route实现了客户端请求的URL的路径映射功

Node.js和Express简单入门介绍 仅仅入门如何用Node.js和Express搭建一个web服务器,没有说明太多概念性的东西。一、Nodejs简介==Node是JavaScript语言的服务器运行环境。==所谓运行环境有两

nodejs开发——express路由与中间件 路由通常HTTPURL的格式是这样的:

标签: nodejs实战

本文链接地址:https://www.jiuchutong.com/biancheng/377888.html 转载请保留说明!

上一篇:Linux使用Node.js建立访问静态网页的服务实例详解(linux安装nodejs xz格式)

下一篇:详解NodeJS框架express的路径映射(路由)功能及控制(nodejs orm框架)

  • 纳税申报表申报日期
  • 在建工程应交税费会计分录
  • 一般纳税人净利润如何计算
  • 房产代理经纪人
  • 忘记先抄税再申报了怎么办
  • 存货盘亏损失可以扣除吗
  • 纳税人提供应税服务的价格明显偏低
  • 公司冲账发票做不够该如何处理合适?
  • 车辆保险费包括
  • 工资薪金所得适用的税率是
  • 政府扶持资金是什么意思
  • 小规模纳税人纳税申报流程
  • 已经缴纳税款怎么作废申报
  • 年终一次性奖金个税计算
  • 吸收合并税费
  • 工程价款是什么意思
  • 对公支出没有发票计入什么科目
  • 收到转账支票又背书转让怎么写会计科目
  • 净资产回报率的变化
  • 利润分配属于什么科目
  • kb4532945安装失败
  • 银行承兑汇票开出后多久可以签收
  • 个人独资所得税税率表最新
  • windows11如何关闭病毒和威胁防护
  • 备用金借款有利息吗
  • 有关五险一金的知识
  • ConquerCam.exe进程的详细介绍 ConquerCam进程信息介绍
  • 印花税怎么计提和结转
  • 企业生产经营过程中的在产品属于
  • 免税货物增值税计算公式
  • 金阁寺屋顶
  • 野外生存探险家
  • 税控系统的维护包括哪些内容
  • 增值税核算应采用什么科目
  • netbeans ide 8.1
  • 电子发票重开之前的是不是就没用了
  • PHP自定义函数实现计算机整数的四次方
  • sqlserver数据库锁表如何解锁
  • 国税实名认证手机号如何解绑
  • 费用分割单使用范围
  • 政府补助分类有几种
  • 个人独资企业需要会计做账吗
  • 滴滴电子普通发票能抵扣进项税吗
  • 工会应付下级经费
  • 加盟费摊销会计分录
  • 什么情况下需要缴纳
  • 被挂靠方并收取管理费的公司怎样处理账务?
  • 资产减值损失如何计算
  • 国有资产如何保值
  • 未开票确认收入账务处理
  • 成品油生产库存
  • 免息分期付款怎么办理
  • 子公司向母公司借钱
  • 结转存货跌价准备是什么意思
  • 个体户一个月能赚多少钱
  • 残保金是否为强制缴纳
  • 盈余公积是资产类科目吗
  • sql数据分类
  • foxmail反应慢的原因
  • Windows Server 2003报错无法定位程序输入点DecodePointer解决方法
  • sendmailadmin
  • calc.exe是什么程序
  • linux中符号连接文件是什么意思
  • win7无法启动print spooler服务,错误5
  • 使用windows防火墙禁止软件联网
  • win7系统无法修复怎么办
  • win7资源管理器停止工作怎么办
  • 雷柏7100p怎么样
  • style=display:inline
  • Node.js中的事件循环是什么意思
  • shell脚本学习指南
  • 自动登入
  • 安卓网络监测
  • javascript和html区别
  • socks5代理怎么用
  • 上海个人到税务局怎么开票
  • 山东统一发票查询平台
  • 成立税务师事务所一定要执业会员吗
  • 税务师 领证
  • 龙岗区龙岗税务局地址
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设