简要理解CommonJS规范

2023-11-07

写在前面:

一个文件就是一个模块。
  另外本文中的示例代码需要在node.js环境中方可正常运行,否则将出现错误。事实上ES6已经出现了模块规范,如果使用ES6的模块规范是无需node.js环境的。因此,需要将commonJS规范和ES6的模块规范区分开来。

一、为什么制定CommonJS规范?

在后端,JavaScript的规范远远落后并且有很多缺陷,这使得难以使用JavaScript开发大型应用。比如:

  1. 没有模块系统
  2. 标准库较少
  3. 没有标准接口
  4. 缺乏包管理系统
  5. 列表内容

CommonJS规范的提出,主要是为了弥补JavaScript没有标准的缺陷,已达到像Python、Ruby和Java那样具备开发大型应用的基础能力,而不是停留在开发浏览器端小脚本程序的阶段。

二、CommonJS模块规范

CommonJS模块规范主要分为三部分:模块引用、模块定义、模块标识。

1、模块引用
  如果在a.js文件中使用如下语句

var math=require('math');

意为使用require()方法,引入math模块,并赋值给变量math。事实上,命名的变量名和引入的模块名不必相同,就像这样:

var Math=require('math');

赋值的意义在于,a.js中将仅能识别Math,因为这是已经定义的变量,并不能识别math,因为math没有定义。

带路径和不带路径
  上面例子中require的参数仅仅是模块名字的字符串,没有带有路径,引用的是a.js所在当前目录下的node_modules目录下的math模块。如果当前目录没有node_modules目录或者node_modules目录里面没有安装math模块,便会报错。
  
  如果要引入的模块在其他路径,就需要使用到相对路径或者绝对路径,例如:

var add=require('./add.js')

上面例子中引入了当前目录下的add.js文件,并赋值给add变量。

2、模块定义

module对象:在每一个模块中,module对象代表该模块自身。
export属性:module对象的一个属性,它向外提供接口。

仍然采用上一个示例,假设add.js中的代码如下:

function add(num1,num2){
	alert(num1+num2);
}

尽管a.js文件引入了add.js文件,前者却仍然无法使用后者中的add函数,在a.js文件中add(3,5)这样的代码会报错,提示add不是一个函数。
  add.js中的函数要能被其他模块使用,就需要暴露一个对外的接口,export属性用于完成这一工作。将add.js中代码改为如下:

exports.add=function (num1,num2){
	alert(num1+num2);
}

a.js文件就可以正常调用add.js中的方法,例如add.add(3,5)这样的调用能够正常执行,前一个add意为本文件中add变量代表的模块,后一个add是引入模块的add方法。

3、模块标识

模块标识指的是传递给require方法的参数,必须是符合小驼峰命名的字符串,或者以 . 、… 、开头的相对路径,或者绝对路径。

三、CommonJS模块规范的好处

CommonJS模块规范很好地解决变量污染问题,每个模块具有独立空间,互不干扰,命名空间等方案与之相比相形见绌。

CommonJS规范定义模块十分简单,接口十分简洁。

CommonJS模块规范支持引入和导出功能,这样可以顺畅地连接各个模块,实现彼此间的依赖关系。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简要理解CommonJS规范 的相关文章

随机推荐

  • 利用scrapy框架进行数据的爬取

    首先介绍一下什么是scrapy框架 爬虫中封装好的一个明星框架 代表性功能 高性能的持久化存储 异步的数据下载 高性能的数据解析 分布式 Scrapy是一个为了爬取网站数据 提取结构性数据而编写的应用框架 非常出名 非常强悍 其内部已经被集
  • 《UE4开发笔记》Tip 0 Rider的五个必备技巧

    在UE4的C 工程和源码开发中 过去常使用Visual Studio系列来作为IDE 但VS始终对UE4工程支持的并不友好 小番茄Visual Assist X系列插件的安装也是十分玄学 时不时就失灵 JetBrains推出了Rider F
  • Selenium WebDriver使用IE浏览器

    IEdriver插件下载地址 http www cr173 com soft 195732 html 1 配置系统环境变量 我的电脑 右键 属性 高级系统设置 环境变量 系统变量 path 注 先把IEDriverServer exe放在C
  • HTML <title> 标签

    实例 一个简单的 HTML 文档 带有尽可能少的必需的标签 The content of the document 定义和用法
  • Elasticsearch概述和DSL查询总结

    目录 Elasticsearch概述 1 什么是Elasticsearch 2 作用 3 特点 DSL Domain Specifit Language 特定领域语言 概念和作用 查询代码总结 最后附项目准备 1 创建搜索工程 maven工
  • Jmeter Springboot Redisson分布式锁并发订单操作

    Jmeter Springboot Redisson分布式锁并发订单操作 下单 取消单 完成单 加库存 br 涉及知识点 br gt java springboot mybatis开发 br gt redis分布式锁 Redisson客户端
  • Web3 用例全解析:传统品牌加速进入 Web3 的原因?

    Web3 有能力彻底改变品牌和客户相互联系的方式 许多品牌已经在尝试使用 NFT 和元宇宙来提高品牌知名度和消费者忠诚度 这是传统社交媒体和电子商务渠道根本无法做到的 NIKE Panini 和 Vodafone nbsp 是最早认识到 N
  • sql2005中的简单分页方法

    select top 10 from select top 30 ROW NUMBER over order by readerid desc as rows1 from reader as a1 where rows1 gt 21 转载于
  • 教育服务机器人总结

    现在有种新名词 用机器人来服务教育 顾名思义 指的是在人工智能领域 机器人助力中小学学生各课程从研究到开展授课过程 其中需要老师在教学环节中的集体辅助 格物斯坦表示 机器人全面帮助教育业完传道授业解课的作用 是功不可没的 随着市场需求具体化
  • K8S管理系统项目实战[API开发]-2

    后端 go gin 后端代码地址GitHub yunixiangfeng k8s platform K8s管理系统后端 go gin kubernetes v1 24 2 golang v1 18 3 5 存储与配置 5 1 ConfigM
  • catalina.home和catalina.base

    Tomcat目录结构如下 bin 运行脚本 conf 配置文件 lib 核心库文件 logs 日志目录 temp 临时目录 webapps 自动装载的应用程序的目录 work JVM临时文件目录 java io tmpdir 其中只有bin
  • 蓝桥杯Python初级组测试题之Turtle画图

    蓝桥杯Python初级测试题之Turtle画图 写这个主要是为了辅助和讲解过蓝桥杯的初级测试 难度并不高 重点在于解析过程 画圆形和以及菱形阵列 思路 第1步 设置整体参数 如循环画菱形的次数为n 12 每次旋转的角度angle 第2步 设
  • 【Spring Security】springboot + mybatis-plus + mysql 从数据库读取用户信息验证登录

    目录 前言 配置 数据库 编码 启动类 dao entity controller dao mapper service config 运行 参考 前言 实现spring security 从数据库读取用户信息验证登录 仅仅能用 不含前端
  • [机缘参悟-92]:《天道》之人生的五种思维觉醒

    目录 前言 一 本质思维 化繁为简 二 成长思维 自我迭代 三 矛盾思维 知己知彼 四 创新思维 见路不走 五 系统思维 顺应天道 前言 一个人的没一次觉醒 是一种发自内心的恍然大悟 醍醐灌顶 遮盖心灵的那层迷雾瞬间消失 豁然开朗的感觉 一
  • 智能遥测终端普适型RTU的主要功能特点及应用

    智能遥测终端机是普适型RTU 研发的融合4G Bluetooth 串口等多种通 信方式 数据采集存储传输于一体的智能遥测终端 产品内置数据采集器 实现内部模数转换 提供增量式雨量接口 RS232 RS485 采集 存储 数据处理 远程传输为
  • properties文件的编码问题

    properties文件的编码问题 背景 原因 idea的编码问题 使用流读取properties文件 如何使用Properties读取utf 8编码的文件 为什么Properties无法正常读取utf8编码的文件 读取utf8编码文件的数
  • 托管c++ (CLI) String^ 到 std::string 的相互转化

    include stdafx h include
  • Java API (Scanner, Random, String, StringBuilder)

    目录 1 Scanner 2 Random 3 String 3 1 常见构造方法及对比 3 2 字符串的比较 3 3 字符串的遍历 3 4 字符串的截取 3 5 字符串的替换 3 6 字符串的切割 3 7 成员方法小结 4 StringB
  • ImageJ如何对图像进行旋转

    坑 ImageJ如何对图像进行旋转
  • 简要理解CommonJS规范

    写在前面 一个文件就是一个模块 另外本文中的示例代码需要在node js环境中方可正常运行 否则将出现错误 事实上ES6已经出现了模块规范 如果使用ES6的模块规范是无需node js环境的 因此 需要将commonJS规范和ES6的模块规