Nodejs之CommonJS规范(一)

本文介绍了CommonJS规范在Node.js中的应用,包括模块化的引入、定义和标识符。详细讲解了`module`属性,如`id`、`filename`、`exports`等,并对比了`module.exports`和`exports`的区别。此外,还讨论了`require`属性的功能,如`resolve`、`extensions`。文章通过实例展示了模块的导入导出,并强调了同步加载的特点,指出在浏览器环境中因性能问题不适用。
Commonjs规范
  1. 关于CommonJS规范
  • 诞生的目的就是为了弥补浏览器没有模块化缺陷
  • CommonJS是语言层面的规范,是一个超集,当前主要用于Nodejs
  • CommonJS规范规定模块化分为引入(通过rrquire导入其他模块)、定义(任意一个文件就是一个模块,具有独立作用域)、标识符(将模块ID传入require实现目标模块定位)三个部分
  1. module属性
  • 任意js文件就是一个模块,可以使用module属性
  • id:返回模块标识符,一般是一个绝对路径
  • filename:返回文件模块的绝对路径
  • loaded:返回布尔值,表示模块是否完成加载
  • parent:返回对象,调用当前模块的模块
  • children:返回数组,当前模块要调用的其他模块
  • exports:返回当前模块要暴露的内容
  • paths:返回不同目录下的node_modules位置
  1. module.exports 与exports的区别
  • 在commonjs规范中只规定了使用module.exports导出数据
  • 是nodejs为了方便,给每个模块加了一个exports指向module.exports的内存地址
  • 但是不能直接给exports赋值,这样它就指向新的内存地址

在这里插入图片描述

  1. requir属性
  • 基本功能是读入并且执行一个模块文件返回这个对象里的exports对象,如果没有找到该模块会报错 (加载即执行了吗)
  • resolve:返回模块文件绝对路径
  • extensions:依据不同后缀名执行解析操作,根据不同的后缀名执行不同的执行函数,.js,.json,.node,省略不写会依次判断
  • main:返回主模块对象
导入导出示例

新建module.js文件

const age = 18
const addFN= (x,y)=>{
    return x+y
}
module.exports = {
    addFN,
    age
}

新建01.js文件

let obj = require('./module')
console.log(obj,'oooo') 

执行node 01 得到如下结果:{ addFN: [Function: addFN], age: 18 }

那之前我们说过每个文件都是一个独立的模块,模块内可以使用module属性,那假设我们在01.js中打印module会发生什么呢?

let obj = require('./module')
console.log(module) 

在这里插入图片描述

其中

  • id 是模块标识
  • path是文件所在的父级路径
  • exports是一个对象,代表本模块要导出的内容,这里没有导出故而为空对象
  • parent是指谁引用了我
  • filename是指文件绝对路径
  • loaded是否加载完成
  • children是表明此模块引入了哪些子模块,我们引入了module.js这个模块
  • paths:表示node_modules查找顺序

注意:

  1. exports是nodejs为了方便使用写的语法糖,指向与module.exports同一内存地址,一旦我们对其重新赋值则切断了联系也无法完成导出
//module.js
const age = 18
const addFN= (x,y)=>{
    return x+y
}
exports = {
    addFN,
    age
}
let obj = require('./module')
console.log(obj,'oooo') // 结果为{}
  1. 我们可以通过exports[属性名]的方式进行导出,导出操作是生效的
//module.js
const age = 18
const addFN= (x,y)=>{
    return x+y
}
exports.addFN = addFN
exports.age = age
let obj = require('./module')
console.log(obj,'oooo') // 结果为{ addFN: [Function: addFN], age: 18 } oooo
  1. 如果我们没有导出,则别人加载后是一个{},因为module.exports默认是{}
同步加载

在CommonJS中,非核心模块的加载是同步加载,也就是说假设我们引入的组件耗时,那会等待加载完成继续向下执行。

//module.js
const age = 18
let nTime = new Date()
while(new Date()-nTime<4000){

}
exports.age = age
console.log('页面导出完成')
let obj = require('./module')
console.log('加载完成') 

命令行执行node 01之后是隔4秒钟后打印如下内容:
页面导出完成
加载完成

注意:

  1. 可以判断,我们导入某个模块,是先把模块的内容以同步的方式装载到系统中,如果装载的过程中模块存在问题,则会导致程序中断执行,有点类似于同步引入js的那种感觉
//module.js
const age = 18
age = 20
exports.age = age
//01.js
let obj = require('./module')
console.log(obj) 
console.log('加载完成');

执行结果如下:

在这里插入图片描述

  1. 如果要加载多个模块,需要加载完第一个模块才会加载后续模块,在浏览器中同步加载会导致性能低下,因此不适合于浏览器
下载代码方式:https://pan.quark.cn/s/dd3561eca308 在软件开发领域,面向对象编程(OOP)是种普遍采纳的结构化方法,它使得开发者能够借助模拟现实环境中的实体和关系来构建软件系统。在本案例中,我们观察到的是个关于借助抽象类来执行不同几何图形面积求解的实践应用。现在,让我们详细分析这议题。 标题 "应用抽象类计算面积" 清晰地表明我们将要讨论个抽象类,此类设定了个用于测量图形面积的标准函数,但并未提供实际的执行过程。抽象类在诸如C#或Java等编程语言中通常借助`abstract`修饰符进行声明,它们无法直接创建对象实例,仅能作为其他类的基础模板。 描述部分提及的"图形界面应用"暗示这是个基于视觉用户界面(GUI)的系统,可能运用了.NET Framework的Windows Forms或WPF技术,或者是Java平台的Swing或JavaFX框架。在这样环境下,用户能够通过视觉元素与这些几何体进行互动,例如输入相关尺寸并观看到计算得出的面积值。 抽象类“几何体”内嵌了“计算面积”这抽象函数。在代码层面,这可以被表述为: ```csharp public abstract class GeometricShape { public abstract double CalculateArea(); } ``` 随后,有三个派生类:圆(Circle)、矩形(Rectangle)和三角形(Triangle),它们各自提供了这个抽象函数的具体实现。比如,圆的面积是通过π乘以半径的平方得到的,矩形的面积是长和宽的乘积,而三角形的面积可能是底乘以高再除以2的结果。这些类将提供具体实现来计算它们各自的面积: ```csharp p...
内容概要:本文系统研究了移相控制全桥LLC谐振变换器的工作特性,深入分析其在不同工作模式下的运行机理与性能表现,重点探讨了软开关实现、高效率能量转换及宽范围电压调节等关键技术优势。通过Simulink搭建精确的仿真模型,对谐振腔参数、开关频率、电压增益、系统效率等关键指标进行仿真分析,验证了理论设计的正确性。同时,详细研究了移相控制策略对系统动态响应、稳定性和轻载/重载工况适应性的影响,揭示了控制参数与电路参数之间的耦合关系,为高频高效电源设计提供了理论依据和实践指导。; 适合人群:具备电力电子技术、模拟电路及自动控制理论基础,从事开关电源、新能源变换器、电动汽车充电模块或高频电源系统研发的工程师及高校研究生。; 使用场景及目标:①掌握全桥LLC谐振变换器的拓扑结构、工作原理与关键参数设计方法;②理解移相控制在实现零电压开通(ZVS)和零电流关断(ZCS)中的作用机制;③通过Simulink仿真掌握变换器建模、参数优化与性能评估流程,服务于实际产品开发与学术课题研究。; 阅读建议:建议读者结合提供的Simulink仿真模型进行同步操作,重点关注谐振网络(Lr, Lm, Cr)参数与移相角之间的匹配设计,深入理解软开关条件的形成过程,并通过调整负载和输入电压进行多工况仿真,以全面掌握系统动态特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值