javascript模块化编程commonjs,cmd,amd规范之间的区别

2023-05-16

    模块化编程是javascript语言的一个特性,其实不光javascript语言有模块化思想,java9也支持模块化,所以说模块化是一种编程的趋势,也是一种新的解决方案。模块化编程将我们以前单独编写的组件或者工具等等通过某种方式变为了一种可以很方便调用的代码。在模块化编程之前,我们编写的组件或者工具都是零散的,有些组件依赖另一个组件,当他们加载的时候,需要严格指定先后顺序,否则出现报错。

    模块化编程通过定义模块,标识模块,引用模块的方式解决了组件依赖之间的关系。模块化编程主要由commonjs,cmd,amd等规范组成,nodejs实现了commonjs规范,seajs实现了cmd规范,requirejs实现了amd规范。

    这里需要说明的是cmd是common module define即通用模块定义规范的简称,而amd是asynchronous module define即异步模块定义的规范简称。他们之间孰优孰劣曾经在网上有很精彩的辩论,玉帛似乎更坚持cmd规范优于amd规范,毕竟seajs是他创作的。

    nodejs实现commonjs规范,应用在服务端,seajs和requirejs分别实现了cmd规范和amd规范,应用在浏览器端,但是也不是绝对的,seajs和requirejs都提供了nodejs的npm模块,可以通过npm install seajs或者npm install requirejs的方式安装seajs和requirejs,并且可以让seajs和requirejs在服务端使用。

    先来看看nodejs实现commonjs规范的语法以及调用示例。我们通过 两个文件来演示他们的用法和区别math.js定义一个add函数,计算两个数字之和,main.js是调用math模块的js。一般需要通过exports或者module.exports对外暴露模块,如下所示:

math.js

function add(a,b){
	return a+b;
}
module.exports = {add:add}

main.js

var math = require("./math");
console.log("math.add(1,2)="+math.add(1,2));

运行node main.js,打印信息如下:

     

   这里module.exports对外暴露模块,其实可以通过exports = {add:add}也是一样的效果,或者exports.add = function(a,b){return a+b;}也是可以的,最简单的就是利用lambda表达式了:

    math.js

exports.add = (a,b)=>a+b

    main.js 

var math = require("./math");
console.log("math.add(1,2)="+math.add(1,2));

  运行,打印结果如下:

    

    以上两种方式都是exports={}或者exports.xxx = yyy,对外暴露的是一个json对象,我们访问的时候直接通过require引入模块,然后调用模块中的对应暴露的方法或者变量。还有一种简单的暴露方式,就是以匿名函数的形式暴露,如下所示:

    math.js

module.exports = (a,b) => a+b;

    main.js

var add = require("./math");
console.log("add(1,2)="+add(1,2));

    这种方式暴露的时候,只是暴露一个匿名函数,当我们引用这个模块的时候,其实就是指定的函数,调用的时候,直接通过module()就可以调用了。而不能使用module.func()的方式。运行结果如下所示:

     

    值得一说的是,当我们使用typescript语言编写es6模块化,然后通过tsc --module  commonjs 编译出来的js模块化是通过闭包的形式来编写相应的函数,以及函数的方法,最后暴露函数,这个时候,我们调用模块,需要new Function(),然后进行对象的方法调用,如下所示:

  Math.ts

export class Math{
    public add(a:number,b:number){
        return a + b;
    }
}

   运行tsc -m commonjs Math.js

     

    当我们在main.js中调用add方法的时候,需要引入Math模块,然后new module.Math().add(1,2)的方式调用,如下所示:

     main.js

var math = require("./Math");
console.log("Math.add(1,2)="+new math.Math().add(1,2));

    运行截图:

     

    以上都是介绍nodejs作为实现了commonjs规范的模块化编程的一些思路和实战,有很多有意思的地方。下面我们来看实现了amd规范的requirejs的使用。

    requirejs一般用在浏览器中,但是npm也提供了requirejs的安装依赖,可以通过npm i requirejs的方式安装,其实requirejs也可以作为模块化在nodejs中使用,只不过需要做一些设置,下面给出一个可以通过nodejs来运行的requirejs示例。

    我们还是以math.js,main.js为例,math.js提供一个add(a,b)函数 ,然后main.js在代码中引入math依赖模块,然后调用add()函数,打印结果,我们重点关注requirejs作为实现了amd规范的语法特征,这里引入关键字define,我们通过define来定义模块,在define函数体中,通过return的方式暴露模块。

    math.js

define(function(){
	var add = function(a,b){
		return a+b;
	};
	return {
		add:add
	}
});

    main.js

var requirejs = require("requirejs");
requirejs.config({
	nodeRequire:require
});
requirejs(["math"],function(math){
	console.log("math.add(1,2)="+math.add(1,2));
});

    在main.js中相对复杂一点,因为我们不能像以前commonjs规范那样,直接require就可以使用了,我们需要设置requirejs,然后通过requirejs([module],function(module){ module.func() ;})的形式来调用。其中requirejs.config({nodeRequire:require})这一步是可选的,运行node main.js,结果如下:

    

    最后来看看实现了cmd规范的模块化框架seajs的使用,seajs和requirejs一样,都是使用在浏览器端的,但是npm同样提供了安装依赖,可以通过npm i seajs的方式安装,而且同样的,我们可以通过在nodejs服务端使用seajs,也是需要和requirejs一样稍作配置,我们先来看看seajs模块化书写方式。

    math.js

define(function(require,exports){
	exports.add = function(a,b){
		return a + b;
	}
})

    main.js

require("seajs");
var math = require("./math");
console.log("math.add(1,2)="+math.add(1,2));

    在nodejs环境中使用seajs模块化,需要在使用的时候引入seajs,然后就和普通的模块一样使用了,运行node main.js,打印信息如下:

    

    以上通过一些实例,简单介绍了一下commonjs,cmd,amd作为模块化编程规范的区别,以及实现了他们各自规范的具体框架,其中nodejs使用在服务端,requirejs和seajs主要使用在浏览器端。

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

javascript模块化编程commonjs,cmd,amd规范之间的区别 的相关文章

随机推荐

  • vs2017开发第一个desktop应用程序

    desktop应用程序也叫窗口程序 xff0c 我们平时在电脑上安装的APP xff0c 都是桌面程序 xff0c 比如QQ xff0c 各种播放器 xff0c 包括浏览器 桌面程序最主要的特点 xff0c 就是点击运行之后 xff0c 会
  • 量子编程入门第一篇环境搭建dotnet-sdk+Microsoft.Quantum.IQSharp+python3.6+qsharp

    量子编程已经提上日程 xff0c 微软提供了quantum开发工具包 Microsoft Quantum Development Kit简称QDK xff0c 在visual studio 2019环境下 xff0c 可以安装quantum
  • ROS2学习笔记(十)-- ROS2 launch启动文件

    简介 xff1a 接触过ROS1的同学对launch肯定不陌生 xff0c 在ROS1中 xff0c 我们常用launch实现node和master同时启动 多节点同时启动配置等功能 xff0c ROS2中的launch也是用于多节点启动
  • 记录一次解决TypeError: 'NoneType' object is not callable的办法

    如题所示 xff0c 这是python运行时报错 xff0c 关键信息就是 xff1a TypeError 39 NoneType 39 object is not callable xff0c 错误栈信息如下 xff1a 有的文章提示 x
  • windows下VC++6.0编写c++程序连接mysql示例

    windows下通过c 43 43 编码连接mysql数据库 xff0c 需要做一些设置 xff0c 因为我们需要连接mysql并执行相关操作 xff0c 需要使用mysql提供的api xff0c 这api在mysql h头文件中定义了
  • windows修改cmd命令行字体

    默认情况下 xff0c windows命令行字体只有两种 xff0c 点阵字体和新宋体 如果你想使用系统自带的其他字体 xff0c 需要更改注册表 这里介绍如何修改 windows系统字体在目录C Windows Fonts 下 xff0c
  • centos7安装与配置DNS服务器

    centos7上安装DNS服务器可以实现域名与IP的双向解析 xff0c 即通过域名可以找到主机IP xff0c 也可以通过IP找到域名 在postfix搭建邮件服务器中 xff0c 需要用到DNS正向解析与反向解析 xff0c 因此DNS
  • springboot项目单元测试

    springboot项目和普通的spring项目一样也可以做单元测试 xff0c 一般是测试service层的方法 xff0c 在进行项目构建的时候 xff0c 需要在springboot默认依赖的基础上 xff0c 再加上spring b
  • ipfs星际文件系统初体验

    ipfs是InterPlanetary File System的简称 xff0c 即星际文件系统 xff0c 他不同于一般的操作系统文件系统 xff0c 也不同于分布式文件系统 xff0c 因为分布式文件系统最终访问文件还是采用的http协
  • truffle构建以太坊应用并测试第一个helloworld智能合约

    最近因为国家对区块链又重视起来了 xff0c 相信今年年底到明年年初会是一个区块链的新的爆发点 xff0c 也是碰巧学习了一下以太坊构建区块链应用 xff0c 以前都是简单的了解 xff0c 并没有实际动手演练 今天趁机会也学习一下区块链
  • docker启动报错:standard_init_linux.go:211: exec user process caused "no such file or directory"

    如题所示 xff0c 根据自己构建的镜像启动docker容器 xff0c 直接退出 xff0c 查看容器日志报错信息 xff0c 没有任何别的信息 网上搜索这个问题 xff0c 发现很多人都遇到过 xff0c 解决办法也各不相同 xff0c
  • windows下telnet回显解决办法

    telnet相信大家都用过 xff0c 在tcp连接中 xff0c 我们可以用来模拟发送客户端请求 xff0c 当我们输入telnet 127 0 0 1 8888连接本机的tcp 8888端口时 xff0c 连接成功后 xff0c 会进入
  • springboot与flyway集成做数据迁移

    flyway是一种用来做数据迁移的框架 xff0c 如果你的项目不是jpa 43 hibenate xff0c 比如使用的mybatis xff0c 那么你需要在实体创建之前 xff0c 在数据库中生成表结构 xff0c 然后逆向工程 xf
  • ROS2学习笔记(十一)-- ROS2 bag数据记录与回放

    简介 xff1a ROS2提供了ros2 bag命令 xff0c 可以记录指定主题的数据到文件中 xff0c 也可以将记录下的内容再发布出来 xff0c 相当于是数据的回放 xff0c 除了通过命令行的方式实现数据记录以外 xff0c 也可
  • C++实现简单链表

    链表是最常用的一种数据结构 xff0c 无论什么语言 xff0c 学习数据结构 xff0c 都绕不开链表 xff0c 下面通过c 43 43 来实现简单链表 xff0c 所谓简单链表 xff0c 就是构建链表 xff0c 然后遍历打印链表
  • 二分查找算法介绍

    二分查找算法的实现过程如下 xff1a 在排序数组中查找某一个数据项 xff0c 首先让待查数据与中间下标元素开始比较 xff0c 如果相等则返回 xff0c 如果小于中间下标元素 xff0c 重新开始从低位开始 xff0c 中间下标 1
  • centos7下安装gitlab-ci持续集成实战

    gitlab提供了ci cd持续集成 持续部署的功能 xff0c 当我们安装了gitlab之后 xff0c 需要单独再安装gitlab ci multi runner xff0c 其实就是gitlab runner xff0c 为了试验 x
  • centos7下安装单机版kubernetes实战

    kubernetes是docker分布式解决方案 xff0c 是当前最火的docker解决方案 xff0c 一般初学者适合玩单机安装 kubernetes安装很简单 xff0c 只需要通过yum安装etcd kubernetes即可 默认k
  • c++使用malloc来做内存分配创建链表

    c 43 43 中创建链表可以直接通过new对象的方式创建节点 xff0c 然后将节点之间的关系通过next指针来关联起来 xff0c 另外 xff0c 也可以通过malloc来分配内存 xff0c 创建节点 这里介绍如何通过malloc来
  • javascript模块化编程commonjs,cmd,amd规范之间的区别

    模块化编程是javascript语言的一个特性 xff0c 其实不光javascript语言有模块化思想 xff0c java9也支持模块化 xff0c 所以说模块化是一种编程的趋势 xff0c 也是一种新的解决方案 模块化编程将我们以前单