JavaScript中的模块化之AMD和CMD

echart自定义主题 (function (root, factory) { if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(['exports', 'echarts'], factory); } else... 阅读详情

前言:
为什么我们需要模块化开发,模块化开发的好处有哪些? 首先我们先说一下非模块化的开发方式带来的弊端。 非模块化开发中会导致一些问题的出现,变量和函数命名可能相同,会造成变量污染和冲突,并且出错时候很难排查。耦合程度高,不符合软件开发中的高内聚和低耦合的原则,所以我们就可以总结一下模块化开发的好处了:
① 解决项目中的变量污染问题。
② 开发效率高,有利于多人协同开发。
③ 职责单一,方便代码重用和维护 。
③ 解决文件依赖问题,无需关注引包顺序 。

模块化开发的演变过程

  • 普通的函数封装
  • 封装成对象
  • 私有公有成员分离 (使用自执行函数,避免变量污染)
  • 模块的维护和扩展(用多个自执行函数把模块分离开来,使用开闭原则—去增添功能,而尽量不要修改原来的代码,)
  • 可以添加模块的第三方依赖(比如添加jQuery的$,$作为一个编程的接口,降低程序之间的耦合度)

模块化的规范

服务端规范 — CommonJs

以为作为服务器端的开发,不会经过网络传输,所以包的加载几乎都是瞬间完成的,只有加载完成了,才能执行操作,所以commonjs是同步的,nodejs就是实现了这种规范。

有关规范的具体详情,找了两篇文章:
http://www.open-open.com/doc/view/f7df10bb81c347f79b436faa85dcfd81
http://blog.jobbole.com/49290/

浏览器端规范 — AMD 和 CMD

浏览器端的规范,因为所有的文件请求都要经过网络传输,很多文件的加载会有不确定因素存在为了解决这个问题,浏览器端出来了这两个规范。

AMD规范:

异步模块定义规范(Asynchronous Module Definition)制定了定义模块的规则,这样模块和模块的依赖可以被异步加载。这和浏览器的异步加载模块的环境刚好适应(浏览器同步加载模块会导致性能、可用性、调试和跨域访问等问题)。具体规范链接在这里:中文版   英文版 ,requireJs就是AMD规范的实现。

  • requirejs的基本使用:
    ① 引入requirejs包,并且设置入口文件

    <script data-main='js/main' src='http://apps.bdimg.com/libs/require.js/2.1.9/require.min.js'></script>
    

    ② 定义主模块 在main.js文件中

    define(['module1','module2',function(m1,m2) {
        // 说明:上面两个module是依赖模块,通过m1,m2的方式来使用
        // 在这里我们写自己的业务逻辑 todo
        // 如果我们需要暴露出去,需要 return ,不是用exports或者module.exports
        // return {};
    }]);

    后续的使用,直接看文档吧,以后有机会再来补充。
    requirejs官网
    requirejs中文官网

CMD规范:

通用模块定义 (Common Module Definition) 是 SeaJS 在推广过程中对模块定义的规范化产出。类似的还有 CommonJS Modules/2.0 规范。
这些规范的目的都是为了 JavaScript 的模块化开发,特别是在浏览器端的。
目前这些规范的实现都能达成浏览器端模块化开发的目的。有两篇文档相关文档: 文档1   文档2 , 下面简要说一下seajs, 详细资料还得戳旁边的资料文档。

  • seajs 的基本使用

    • 引入包文件

      <script src='http://apps.bdimg.com/libs/seajs/2.3.0/sea.js'></script>
      
    • 定义一个模块,比如在这个文件 student.js 中

      define(function(require,exports,module){
          function Student(){
              this.name = '张三';
          }
          // 对外暴露该模块的接口:
          module.exports = new Student();
      })
    • 使用模块:通过 seajs.use() 来实现,第一个参数是使用模块的路径,第二个回调函数中的参数是所要使用模块暴露出来的一个接口。

      seajs.use('./student.js',function(stu){
          console.log(stu.name); // 张三
      });
      
  • seajs 暴露出接口的方式

    • 通过 module.exports 方式导出对象
    • 通过 exports.属性或方法 方式导出
    • 两者的区别和联系:module.exports 和exports 指向的是同一个对象。exports是函数内的一个形式参数,而module.exports是一个实实在在的对象,一般在导出的时候用 module.exports 指向一个新的对象,而最终模块都是用module.exports来导出的。
  • seajs 内部的异步加载简单小demo — 写个小demo来阐述一下这个异步加载机制,在demo中,有以下几个文件 index.html ,loadJs.js ,module1.js:

    1. index.html文件中的关键代码

      <!--引入cdn上的seajs文件-->
      <script src='http://apps.bdimg.com/libs/seajs/2.3.0/sea.js'></script>
      <script src='loadJs.js'></script>
      <script>
          loadJs('module1.js',function(){
              console.log('回调内的函数最后执行');
          });
      </script>
      
    2. loadJs.js文件中的代码

      function loadJs(path,callback) {
          var head = document.getElementsByTagName('head')[0];
          var script = document.createElement('script');
          script.setAttribute('src',path);
          head.appendChild(script);
          if(!/*@cc_on!*/false) {
              // 非IE浏览器
              script.onload = function() {
                  console.log('非IE浏览器');
                  callback();
              }
          }else{
              script.onreadystatechange = function(){
                  if(script.readyState === 'loaded' || script.readyState === 'complete') {
                      console.log('IE');
                      callback();
                  }
              }
          }
      }
    3. module1.js文件中的代码:

      console.log('我是module1文件内的');
      
    4. 在Chrome下测试,最后控制台的输出结果:

      我是module1文件内的
      非IE浏览器
      回调内的函数最后执行
    5. 总结:在模块加载的过程中,先执行依赖模块内的逻辑,最后再去执行回调函数内的逻辑

      • seajs 异步加载 require 中的async方法:

        require.async() 方法用来在模块内部异步加载模块,并在加载完成后执行指定回调。callback 参数可选。 require 是同步往下执行,require.async 则是异步回调执行。require.async 一般用来加载可延迟异步加载的模块。

      • seajs 的第三方依赖库的引入:比如 jquery,我们需要使用jquery,加入到我们的项目中,首先我们需要对jquery 进行改造,在高版本的jquery文件比如2.2中支持amd规范但不支持cmd规范,在文件中的最后找到如下代码:

        if ( typeof define === "function" && define.amd ) {
            define( "jquery", [], function() {
                return jQuery;
            } );
        }

        我们把它改造为:

        if ( typeof define === "function" && (define.amd || define.cmd) ) {
            define( "jquery", [], function() {
                return jQuery;
            } );
        }

        然后我们可以通过加载模块的方式,把jQuery加载进去了。

  • seajs的配置调试:

    • https://github.com/seajs/seajs/issues/262
      API上讲的很详细。
    • 简单的写一写:

      seajs.config({
        // 别名配置
        alias: {
          'es5-safe': 'gallery/es5-safe/0.9.3/es5-safe',
          'json': 'gallery/json/1.0.2/json',
          'jquery': 'jquery/jquery/1.10.1/jquery'
        },
        // 路径配置
        paths: {
          'gallery': 'https://a.alipayobjects.com/gallery'
        }
      })
    • 通过对 sea.js 进行配置,让模块编写、开发调试更方便。

  • seajs 中的module

    • 看 API 中的module Object
Seajs和RequireJS的区别

— 引自 玉伯

  1. 两者定位有差异。RequireJS 想成为浏览器端的模块加载器,同时也想成为 Rhino / Node 等环境的模块加载器。SeaJS 则专注于 Web 浏览器端,同时通过 Node 扩展的方式可以很方便跑在 Node 服务器端。
  2. 两者遵循的标准有差异。RequireJS 遵循的是 AMD(异步模块定义)规范,SeaJS 遵循的是 CMD (通用模块定义)规范。规范的不同,导致了两者 API 的不同。SeaJS 更简洁优雅,更贴近 CommonJS Modules/1.1 和 Node Modules 规范。
  3. 两者社区理念有差异。RequireJS 在尝试让第三方类库修改自身来支持 RequireJS,目前只有少数社区采纳。SeaJS 不强推,而采用自主封装的方式来“海纳百川”,目前已有较成熟的封装策略。
  4. 两者对调试等的支持有差异。SeaJS 通过插件,可以实现 Fiddler 中自动映射的功能,还可以实现自动 combo 等功能,非常方便便捷。RequireJS 无这方面的支持。
  5. 两者的插件机制有差异。RequireJS 采取的是在源码中预留接口的形式,源码中留有为插件而写的代码。SeaJS 采取的插件机制则与 Node 的方式一致:开放自身,让插件开发者可直接访问或修改,从而非常灵活,可以实现各种类型的插件。插件开发者可直接访问或修改,从而非常灵活,可以实现各种类型的插件。
  6. 对于依赖的模块,AMD 是提前执行,CMD 是延迟执行。不过 RequireJS 从 2.0 开始,也改成可以延迟执行(根据写法不同,处理方式不同)。CMD 推崇 as lazy as possible.
  7. CMD 推崇依赖就近,AMD 推崇依赖前置。

更多阅读:http://www.cppblog.com/guojingjia2006/archive/2014/09/10/208263.aspx

GEO优化实战:用AnswerBit量化AI搜索可见度与品牌监控体系 生成式引擎优化(GEO)正取代传统SEO,成为品牌在AI搜索生态中获取可见度的关键。当用户习惯从“翻列表”转向“直接问AI”,品牌能否被生成式引擎识别、引用并正向推荐,直接决定了其在用户决策链条中的存在感。AI搜索可见度因此从模糊概念演变为可度量的运营指标,涵盖提及率、引文率、情感分与回源质量等维度。腾讯AnswerBit作为答案侧分析工具,帮助运营者拆解AI回复中的品牌语境与引用来源,让优化动作有据可循。从内容结构化改造、品牌实体建设到第三方权威背书,GEO要求团队建立“度量-优化-再度量”的闭环。文章结 阅读详情

相关推荐

别再手动写JSON了!用Node-RED OPC UA节点5分钟搞定楼宇温湿度数据采集

本文介绍了如何利用Node-RED和OPC UA节点快速实现楼宇温湿度数据的自动化采集与JSON格式转换。通过可视化工具Node-RED,开发者无需编写复杂代码,5分钟内即可完成从传感器到数据输出的全流程配置,大幅提升智慧楼宇和工业物联网项目的实施效率。

weixin_30368405的博客 433

前端模块化

如果需要用到外界的全局变量,可以通过参数传入,如图中的this,这个this实际上是Window对象,通过传入this,使得Window由全局变量变为局部变量,当在后面那个代码块中访问this时,不需要将作用域链回退到顶层作用域,这样可以更快的访问Window对象;模块化是一种自顶向下的过程,通过把一个大的系统,逐步划分为一个个小的模块,这些模块内部封装了一些特定的功能,通过约定的接口对外暴露。factory是模块初始化要执行的函数或对象,如果是函数,只执行一次,如果是对象,即为模块输出值。...

waidyj的专栏 1249

华硕天选3 win11+ubuntu20.04双硬盘双系统配置(包括ubuntu重启后无法成功进入、没有wifi图标的设置)

1、制作系统盘 2、分区 3、重启电脑按F2

baidu_38431960的博客 1万+

JS(二十六)jQuery插件编写技巧

1、典型的插件开头写法;(function (a) { "use strict"; if ("function" === typeof define &amp;&amp; define.amd) define(["jquery", "moment", "commonMethod"], a); else if ("object" ===

前端产品工程师 427

芯片缺陷检测全流程:从光学成像到AI自动判别的实战路线

在半导体制造中,良率是衡量产线效率的核心指标,而缺陷检测则是守住良率的关键防线。传统人工显微镜目检已难以应对微米级乃至纳米级缺陷的挑战,工业界正加速转向机器视觉与深度学习相结合的技术方案。其核心原理在于:先通过明场、暗场或DIC等光学成像获取高对比度图像,再借助传统图像处理算法快速提取候选缺陷区域,最后利用CNN等深度学习模型对缺陷进行精准分类与判定。这一技术路线不仅大幅提升检测效率与准确性,还能有效降低漏检和误报,广泛应用于晶圆制造、封装测试等环节。本文从成像选型、算法分工、数据标注到模型部署,系统梳理了

weixin_29053577的博客 269

containerd镜像加速配置全解析:从host.toml到config.toml的演进与实践

本文全面解析了containerd镜像加速的配置方法,重点对比了传统的config.toml集中式配置与现代的host.toml模块化配置的演进与优劣。文章通过实战演示,详细指导如何为docker.io、registry.k8s.io等常见仓库配置host.toml加速,并提供了生产环境下的最佳实践、故障排查与性能优化建议,帮助用户显著提升镜像拉取效率与系统稳定性。

jenkins8butler的博客 698

微信分享功能实现

之前项目上开发微信分享功能使用 页面html里需引用入下js jweixin-1.0.0.js 使用微信官方的js !function(e,n){"function"==typeof define&&(define.amd||define.cmd)?define(function(){return n(e)}):n(e,!0)}(this,function(e,n...

开发猫 1659

中国银行信息科技岗位笔试

收到笔试只剩四天了,收集的资料,后续会更新

weixin_46050242的博客 4598

浅谈模块化

写这篇文章是因为最近在网上看了很多关于模块化的文章,所以进行总结。Js发展之初,只是为了解决基础的表单验证问题,以及基础的页面交互,代码非常简单,不存在模块化的概念和问题。但是随着ajax的发展,web进入2.0时代,Js成为一门应用非常广泛的语言。这个时候js作为一门嵌入型语言,劣势就展示出来了,没有一个权威的规范,问题总是要解决,在前端发展的这几十年,也就顺势而为的产生了很多的js规范。在最早的js中,想要实现分模块开发,最简单的就是函数,因为函数能形成一个相对封闭的空间,通过函数来实现简单的模块化也是

浮游的博客 792

高缺失率时空数据插补实战:从随机森林到扩散模型的性能对比

数据缺失是数据分析与机器学习建模中普遍面临的挑战,尤其在时空数据领域,传感器故障、传输中断等问题常导致数据不完整。数据插补技术旨在基于已知数据的模式和关联性,合理估算缺失值,为后续分析提供可靠基础。其核心原理在于利用数据的时空相关性(如时间周期性、空间邻近性)及与外部驱动因素(如交通、气象)的关联构建预测模型。这项技术的价值在于能将不完整的数据集转化为可用于高质量分析和预测的可用资产,广泛应用于环境监测、交通流量预测、金融风控等领域。本文聚焦于一个极具挑战性的场景——PM2.5监测数据缺失率高达82%,通过

weixin_30363285的博客 546

AI 辅助编程全景:演进、提效场景与未来趋势

本文系统梳理了AI辅助编程的发展历程与应用场景。演进路径分为三代:从代码补全工具(2023)、对话式助手(2024)到自主编程代理(2025)。在软件全生命周期中,AI可显著提升各环节效率:需求分析阶段节省30-60%文档编写时间;设计阶段缩短40-60%技术调研周期;编码阶段通过智能补全提升55%任务速度;测试阶段减少30-60%测试编写时间。数据显示,2025年84%开发者使用AI工具,41%代码由AI生成,平均每周节省3.6小时。AI正推动开发者角色从编写者转变为审核者,但复杂业务逻辑和架构设计仍需人

甘蓝的专栏 475

javascript模块化之CommonJS、AMD、CMD、UMD、ES6

这是一篇关于js模块化编程的总结记录 javascript模块化之CommonJS、AMD、CMD、UMD、ES6

皖林的博客 2万+

Windows 11 WSL2环境下OpenClaw部署的兼容性问题分析与解决方案研究

本文研究了OpenClaw在Windows 11 WSL2环境下的部署方案。WSL2通过无缝集成Linux与Windows系统,为OpenClaw提供了良好的运行环境,支持GPU加速和跨平台开发。文章详细分析了硬件配置要求(推荐8核CPU/16GB内存/NVMe SSD)、系统选择(Windows 11 Pro+Ubuntu 22.04)以及部署步骤,包括WSL2启用、Linux发行版安装、Python/Node.js/Redis等依赖配置。通过优化.wslconfig文件参数(如内存分

博客 2284

一文搞懂 JavaScript 模块化规范:CommonJS、AMD、CMD、ES6 Module

CommonJS是一个规范,最初提出来是在浏览器以外的地方使用,并且当时被命名为ServerJS,后来为了体现它的广泛性,修改为CommonJS,也可简称为CJS。● Node是CommonJS在服务器端一个具有代表性的实现;● Browserify是CommonJS在浏览器中的一种实现;● Node中对CommonJS进行了支持和实现,让我们在开发node的过程中可以方便的进行模块化开发,Node 应用由模块组成,采用 CommonJS 模块规范。每个文件就是一个模块,有自己的作用域。

qq_44919431的博客 1595

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

JavaScript中的模块化、CommonJS、AMD、CMD区别

前言 这三个规范都是为Js模块化加载而生的,使模块能够按需加载,使系统同庞杂的代码得到组织和管理。模块化的管理代码使多人开发得到了更好的合作 函数封装 我们在讲函数的时候提到,函数一个功能就是实现特定逻辑的一组语句打包,而且JavaScript的作用域就是基于函数的,所以把函数作为模块化的第一步是很自然的事情,在一个文件里面编写几个相关函数就是最开始的模块了 function fn1(){ statement } function fn2(){ statement } 这样在需要的以后夹

Amelian的博客 384

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

JS模块化开发-CMD、AMD模式

JS模块化开发是目前非常流行的JS开发模式,目前模块化开发主要有两种形式,一种是以CommonJS为代表的CMD(Common Module Definition--通用模块定义)模式,一种是以require.js为代表的AMD(Asynchronous Module Definition--异步模块定义)模式。 AMD模式,它采用异步模式加载模块,模块的加载不影响后面的代码运行,所有依赖这

4387

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

浅谈JavaScript模块化规范AMD与CMD

1、模块化 模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问题进行系统性的分解以之处理。模块化是一种处理复杂系统分解为代码结构更合理,可维护性更高的可管理的模块的方式。模块化使得系统被分解为一组高内聚,低耦合的模块,在理想状态下只需要完成自己部分的核心业务逻辑代码,其他方面的依赖可以通过直接加载被人已经写好模块进行使用即可。 一个模块化系统所必须的能力: 1) 定

筱葭的博客 876

JS模块化的发展历程,CommonJS、AMD、CMD、UMD、ES6模块化

你应该听过 CommonJS、AMD、CMD、UMD、JS 模块化等等,这篇文章讲的就是这些名称都是什么意思,为什么会出现JS模块化,以及他们分别是如何实现JS模块化的。最早,我们就是直...

530

JS模块化规范:AMD/CMD/CommonJS

一、模块化规范的由来随着网页的复杂化,javascript代码也相应变得庞大起来,代码之间的分工合作就尤为重要了,这时候有了模块,我们就可以只关注自己业务的核心逻辑,其他想要实现的功能直接加载他人的模块便足够了。考虑到模块的统一,便有了模块规范化。接下来介绍的模块化规范,包含:CommonJS,AMD,CMD。 二、三者的区别 AMD CMD CommonJS 预先加载 延迟加载

Horzen的博客 1305

JS | CommonJS、AMD、CMD、ES6-Module、UMD五种JS模块化规范

在JavaScript中,常用的模块化规范有以下几种:CommonJS规范:主要用于服务器端编程,是Node.js采用的模块化规范。通过require方法加载模块,通过module.exports和export对象输出模块。AMD规范:主要用于浏览器端编程,是RequireJS采用的模块化规范。通过定义方。ES6模块规范:是ECMAScript 6采用的模块化规范,是JavaScript官方标准。通过export关键字输出模块,通过import。

青春木鱼的博客 2333

【JS】【前端】JavaScript 模块化演进之路(CJS/AMD/UMD/CMD/ESM)

JavaScript模块化演进经历了多个阶段:CommonJS(CJS)最早用于Node.js服务器端,采用同步加载和值拷贝;AMD为浏览器设计,支持异步加载;CMD强调就近依赖;UMD通过环境判断实现跨平台兼容;最终ES Modules(ESM)成为官方标准,支持静态加载和符号引用,实现浏览器与服务器统一。目前ESM已成为主流方案,取代了其他模块化规范

XPRNB的博客 1119

JS模块化-CJS,ESM,AMD,CMD,UMD

AMD规范采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。这里介绍用require.js实现AMD规范的模块化:用require.config()指定引用路径等,用definde()定义模块,用require()加载模块。首先我们需要引入require.js文件和一个入口文件main.js。main.js中配置require.config()并规定项目中用到的基础模块。

qq_43320218的博客 1414

JS模块化——AMD、CMD、CommonJs、UMD,ES6 的对比

AMD、CMD、CommonJs 是 ES5 中提供的模块化编程的方案,import/export 是 ES6 中定义新增的 CommonJS CommonJS 规范是通过 module.exports 定义的,例如 Nodejs,即由服务端兴起 一个文件就是一个模块,拥有单独的作用域 普通方式定义的变量、函数。对象都属于该模块 通过require加载模块 通过exports导入,module.exports来暴露模块 eg: const fs = require('fs'); module.e.

KID963931445的博客 566

JS中的几种模块化规范(CommonJS、AMD、CMD、ES6 Module)

引入问题:为什么要进行模块化? 1)模块化就是将系统分离成独立功能的模块,这样我们需要什么功能,就加载什么功能 2)模块化的好处: 避免命名空间的冲突(减少命名空间的污染) 更好的分离,实现按需加载 提高可代码的复用性 提高了代码的维护性 JS模块化大致发展过程 CommonJS(服务端)=》AMD(浏览器)=》CMD=》ES6 Module模块化 模块化规范的种类 模块化规范的发展趋势 终极:现代工具webpack webpack自己实现了一套模块机制,无论是CommonJs模块的require

Amelian的博客 3483

Javascript模块化规范之CommonJs,AMD,CMD

Javascript的模块化编程;AMD、CMD、CommonJs、ES6的对比

weixin_43862492的博客 3647

JS-模块化AMD和CMD

函数封装 —> 对象 —> 立即执行函数 —> 模块化规范 是一种项目的构架模式, 这种构架模式让JS代码重用性变得非常高,让项目构架的一些复杂问题全部得以解决。 例如,多个script标签不会再出现了,我们只要用一个script标签进行引入就可以了。 模块化那有两个规范,AMD规范和CMD规范,当然还有针对于nodejs后台的commonJS规范; 1. 首先对于依赖: AMD提前执行(不管什么时候用, 先加载过来) //特点 : 前期消耗网络资源大, 但是后期运行效率高. CMD需求执

itsNekoDeng的博客 667
上一篇: nodejs笔记之:事件驱动,线程池,非阻塞,异常处理等
下一篇: Angular和jQuery之间的区别
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值