JavaScript模块化怎么理解?

JavaScript模块化的理解是:1、Module模式,它通过闭包的特性打开了一个新的作用域,缓解了全局作用域命名冲突和安全性的问题;2、CommonJS模式,主要用在Node开发上,每个文件就是一个模块,没个文件都有自己的一个作用域。

JavaScript模块化怎么理解?

JavaScript模块化的理解是:

1、Module模式

在模块化规范形成之前,JS开发者使用Module设计模式来解决JS全局作用域的污染问题。Module模式最初被定义为一种在传统软件工程中为类提供私有和公有封装的方法。在JavaScript中,Module模式使用匿名函数自调用 (闭包)来封装,通过自定义暴露行为来区分私有成员和公有成员。

let myModule = (function (window) {    let moduleName = 'module'  // private    // public    function setModuleName(name) {      moduleName = name    }    // public    function getModuleName() {      return moduleName    }    return { setModuleName, getModuleName }  // 暴露行为  })(window)

登录后复制

上面例子是Module模式的一种写法,它通过闭包的特性打开了一个新的作用域,缓解了全局作用域命名冲突和安全性的问题。但是,开发者并不能够用它来组织和拆分代码,于是乎便出现了以此为基石的模块化规范。

立即学习“Java免费学习笔记(深入)”;

相关学习推荐:javascript视频教程

2、CommonJS

CommonJS主要用在Node开发上,每个文件就是一个模块,没个文件都有自己的一个作用域。通过module.exports暴露public成员。例如:

// 文件名:x.jslet x = 1;function add() {  x += 1;  return x;}module.exports.x = x;module.exports.add = add;

登录后复制

 

此外,CommonJS通过require()引入模块依赖,require函数可以引入Node的内置模块、自定义模块和npm等第三方模块。

// 文件名:main.jslet xm = require('./x.js');console.log(xm.x);  // 1console.log(xm.add());  // 2console.log(xm.x);   // 1

登录后复制

 

从上面代码我们可以看出,require函数同步加载了x.js,并且返回了module.exports输出字面量的拷贝值。

可能有人会问module.exports.x = x;不是赋值吗,怎么肥事呢?我们说,Module模式是模块化规范的基石,CommonJS也是对Module模式的一种封装。我们完全可以用Module模式来实现上面的代码效果:

let xModule = (function (){  let x = 1;  function add() {    x += 1;    return x;  }  return { x, add };})();let xm = xModule;console.log(xm.x);  // 1console.log(xm.add());  // 2console.log(xm.x);   // 1

登录后复制

 

通过Module模式模拟的CommonJS原理,我们就可以很好的解释CommonJS的特性了。因为CommonJS需要通过赋值的方式来获取匿名函数自调用的返回值,所以require函数在加载模块是同步的。然而CommonJS模块的加载机制局限了CommonJS在客户端上的使用,因为通过HTTP同步加载CommonJS模块是非常耗时的。

3、AMD

// 定义AMD规范的模块define([function() {  return 模块})

登录后复制

区别于CommonJS,AMD规范的被依赖模块是异步加载的,而定义的模块是被当作回调函数来执行的,依赖于require.js模块管理工具库。当然,AMD规范不是采用匿名函数自调用的方式来封装,我们依然可以利用闭包的原理来实现模块的私有成员和公有成员:

define(['module1', 'module2'], function(m1, m2) {  let x = 1;  function add() {    x += 1;    return x;  }  return { add };})

登录后复制

 

4、CMD

CMD 是 SeaJS 在推广过程中对模块定义的规范化产出。AMD 推崇依赖前置,CMD 推崇依赖就近。

define(function(require, exports, module) {  //  同步加载模块  var a = require('./a');  a.doSomething();  // 异步加载一个模块,在加载完成时,执行回调  require.async(['./b'], function(b) {    b.doSomething();  });  // 对外暴露成员  exports.doSomething = function() {};});// 使用模块seajs.use('path');

登录后复制

 

CMD集成了CommonJS和AMD的的特点,支持同步和异步加载模块。CMD加载完某个依赖模块后并不执行,只是下载而已,在所有依赖模块加载完成后进入主逻辑,遇到require语句的时候才执行对应的模块,这样模块的执行顺序和书写顺序是完全一致的。因此,在CMD中require函数同步加载模块时没有HTTP请求过程。

5、ES6 module

ES6的模块化已经不是规范了,而是JS语言的特性。随着ES6的推出,AMD和CMD也随之成为了历史。ES6模块与模块化规范相比,有两大特点:

模块化规范输出的是一个值的拷贝,ES6 模块输出的是值的引用。

模块化规范是运行时加载,ES6 模块是编译时输出接口。

模块化规范输出的是一个对象,该对象只有在脚本运行完才会生成。而 ES6 模块不是对象,ES6 module 是一个多对象输出,多对象加载的模型。从原理上来说,模块化规范是匿名函数自调用的封装,而ES6 module则是用匿名函数自调用去调用输出的成员。

以上就是JavaScript模块化怎么理解?的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2727181.html

(0)
上一篇 2025年3月7日 23:42:06
下一篇 2025年2月24日 08:03:55

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • JS对象基础知识的巩固学习笔记

    1、对象具有唯一标识性,即使完全相同的两个对象也不是同一个对象。 (js创建的对象内存地址不同) 2、对象具有状态 同一对象可能处于不同的状态下 (js对象的属性) 3、对象具有行为 对象的状态 可能因为他的行为发生改变 (js对象的属性)…

    编程技术 2025年3月7日
    200
  • 用JavaScript写一个js解释器

    用 js 来 编译 js 看起来是个高大上的东西,实际原理其实很简单,无非就是利用 js 对象属性可以用字符串表示 这个特性来实现的黑魔法罢了。之所以看起来那么 深奥, 大概是由于网上现有的教程,都是动不动就先来个 babylon / @b…

    2025年3月7日
    200
  • JS中splice()方法是什么?

    splice()方法是从数组中添加或删除项目,然后返回被删除的项目,该方法会改变原始数组,语法为【arrayObject.splice(index,howmany,item1,…..,itemX)】。 JS中splice()方法…

    2025年3月7日
    200
  • 如何取消JavaScript中的异步任务?

    有时候执行异步任务可能是很困难的,尤其是在特定的编程语言不允许取消被错误启动或不再需要的操作时。幸运的是 JavaScript 提供了非常方便的功能来中止异步活动。在本文中,你可以学到如何创建可中止的函数。 中止信号(Abort signa…

    2025年3月7日
    200
  • 深入了解ajax(图文详解)

    1.1 什么是ajax: Ajax即“Asynchronous Javascript And XML”(异步JavaScript 和XML),是指一种创建交互式网页应用的网页开发技术。Ajax=异步JavaScript和XML(标准通用标记…

    2025年3月7日 编程技术
    200
  • 弄懂promise、async、await

    上一篇呢,主要是聊了聊同步、异步,他们各自引申出来的‘执行栈’、‘消息队列’,以及‘宏任务’、‘微任务’,如果大家对这几个概念不太了解,可以去这个链接: https://www.jianshu.com/p/61e7844e68d8 宏任务与…

    编程技术 2025年3月7日
    200
  • 正则表达式在javascript中怎么使用?

    本节讲正则表达式在js中的使用,注意正则对象是一个引用类型。 初始化:字面量和对象使用 与对象的定义一样,我们可以使用字面量定义正则表达式,也可以使用正则对象来定义正则表达式,他们的区别是使用的转义有一定差别。 在使用字面量的时候,使用/ …

    2025年3月7日 编程技术
    200
  • 一文谈谈JavaScript和ECMAScript的关系

    JS和ES 每一个学习JS的同学都听说过ES5,ES6,但是,是否所有的同学都清除的知道他们之间的关系呢?我们通常认为这两个是一个东西,事实上他们的关系如下:从上面的图中我们清除的看到,他们不是并列关系,而是包含关系,那么下面就分别介绍一下…

    2025年3月7日
    200
  • 了解JS中的执行上下文、 执行栈、事件循环

    本篇文章带大家了解一下javascript中的执行上下文和执行栈、事件循环。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 下面的这些概念,无论是执行上下文、 还是执行栈,它在规范中的概念都很抽象,很多内容的理解实际靠的都…

    2025年3月7日 编程技术
    200
  • 聊聊JavaScript人脸识别技术

    我一直对人工智能识别技术非常感兴趣,因为我无法想象这究竟是一种什么样的算法,什么样的分析过程。无论是声音识别、人脸识别或其它种识别,人们的外貌、说话的方式都是如此不同,一种图片你可以用不同的方式、从不同的角度拍摄,我不能理解这些识别技术是如…

    2025年3月7日
    200

发表回复

登录后才能评论