【JavaScript】经典的模块化规范——CommonJS和ES6

前端 JS 经典:CommonJs 规范 CommonJs 简称 CMJ,CMJ 的模块标准,必须在 node 的环境中才支持。在浏览器中用,是不行的。查看电脑是否安装 node,通过打开终端,运行 node -v 查看是否返回 node 版本。返回则已安装。CMJ 在 node 中怎么使用呢,其实和 JS 在浏览器环境下用法一样,变量的定义、判断、循环、数组的使用等都一样。与 JS 在浏览器中用法不同的是,API 不一样,在 node 中使用 Node API,在 JS 中使用的是 Web Api(DOM 和 BOM)。其中 Node API 很 阅读详情

模块化

什么是模块化

模块化是一种将复杂系统分解为更易管理的模块的方式。每个模块封装了特定的功能,提供使用接口,模块中的数据都是私有的,模块之间互相隔离,彼此之间互不影响。

为什么需要模块化

JavaScript语言最初设计用于浏览器的时候并没有内置的模块系统。最初我们通过<script> 标签引入文件,所有变量和函数都挂在**全局对象 window (浏览器窗口)**上。

<script src="a.js"></script>
<script src="b.js"></script>
<script src="school.js"></script>

随着node.js的出现js开始进入服务端开发,开发应用复杂度越来越高,代码量和文件数量急剧增加,加上js原有的不足,可能会引发以下问题:

  1. 全局污染:不同js文件有同名函数,调用函数时会产生混乱;如果 a.js 和 b.js 都有同名变量,后者会覆盖前者。
  2. 依赖混乱:部分js文件会与其他js文件有依赖关系,所以必须按照一定的顺序进行引入,引入的过程可能产生混乱。
  3. 数据安全问题:所有模块成员仍暴露在全局即window上,外部可以直接修改内部数据。

模块化规范有CommonJS、AMD、CMD、ES6模块化,本文只讲较为常用的两个规范,CommonJS和ES6模块化。

两个经典的模块化规范

CommonJS

CommonJS最早是当时在雅虎工作的Kevin Dangoor发起的一个社区项目(非官方模块化规范),在node.js流行的基础上发展起来,所以其规范也主要用于node.js服务器端。

导出数据的方法

该规范有两种导出数据的方式:

const name = 'Harvard'
const location1 = 'Cambridge, MA'

function getTel (){
    return '(617) 495-1000'
}

function getCity(){
    return 'Cambridge'
}

// 方法一
exports.name = name
// 方法二
module.exports = {name,getTel}

用 require() 导入

关于js文件的空对象

深入探究js文件的空对象,有助于理解CommonJS数据的导出及其导出过程中可能引发的问题。

每个模块,一开始都有this关键字、exports、modules.exports共同指向同一个空对象,该对象是js文件要导出的数据。

在每个模块文件开头,Node.js 实际上执行了类似这样的代码:

var exports = module.exports;

exports 是 module.exports 的一个引用,this 在模块作用域中也指向 module.exports,module.exports 是真正的导出目标。所以,无论如何修改导出对象,最终导出的是module.exports的值。

JS模块的作用域

js模块在执行时是被包裹在内置函数中执行的,每个模块有自己的作用域。
当你运行如下代码:

console.log(arguments.callee.toString())

会得到

function (exports, require, module, __filename, __dirname){
 // 这里是作用域,内容是模块中写的代码
 // ...
}

这是因为 Node.js 会把每个模块文件包装在一个函数中执行。

ES6模块化

ES6 (ECMAScript 2015) 是JavaScript 的官方标准规范,浏览器和node.js服务端都支持。

ES6 是正式的 ECMA-262 标准
标准号: ECMA-262 6th Edition
官方名称: ECMAScript 2015 (ES2015)

导出数据或执行代码的方法

  1. 分别导出 exports
  2. 统一导出 export {…}(类似于对象的结构)
    (分别导入和统一导入可以用{ }里的对象进行接收)
  3. 默认导出 export default {…}
    提交的是值(default:…)而不是对象,也可以是自己设置的对象(可设置键值对)。
    在import时可以随意命名一个对象接收
  4. 命名导入:在需要导入的文件中直接import
  5. 动态导入:触发一定条件后导入,如点击事件。
  6. import可不接收任何数据,只触发引用的js中的函数。

浏览器运行ES6模块

当在浏览器中运行ES6模块时,js文件需要以模块化的方式被引入到html,这时type属性需要改为module。

<script type="module" src="./school.js"></script>

引入模块后,模块的内容都在模块中运行,不会污染全局。

node.js运行ES6模块

两种方法:

  1. 改文件后缀.mjs(不推荐)
  2. 在package.json中设置
{
  "name": "...",
  "version": "...",
  "type": "module",
  "main": "src/index.js",
  "scripts": {
    "start": "...",
    "dev": "..."
  },
  "dependencies": {
    "lodash": "..."
  }
}

index.js为对应的ES6模块。

模块辨析——数据引用问题

CommonJS规范导出的数据是值的拷贝。
ES6规范导出的数据是值的引用,与原文件数据共用同个内存,即指向同一个对象,但导入的变量是只读绑定,不能直接赋值。

觉得不错可以三连支持一下,欢迎讨论纠错~

全面理解JavaScript模块化:CommonJS与ES6模块规范 cjs 与 es6 模块化使用 阅读详情

相关推荐

一小时速通JavaScript模块化,涵盖CommonJS与ES6模块化

一小时速通JavaScript模块化,涵盖CommonJS与ES6模块化

weixin_51591826的博客 1557

简述JavaScript模块化编程(二)

前置阅读:简述JavaScript模块化(一) 在前面一文中,我们对前端模块化所经历的三个阶段进行了了解: CommonJs,由于是同步的,所以主要应用于服务器端,以Node.js为代表。 AMD,异步模块定义,预加载,推荐依赖前置。以require.js为代表。 CMD,通用模块加载,懒加载,推荐依赖就近。以Sea.js为代表。 而在ES6已经大行其道的今天,ES...

weixin_30394669的博客 431

前端Javascript模块化 CommonJS与ES Module区别

ES Module 的静态结构支持编译时删除未使用代码(如 Webpack 的 Tree Shaking),而 CommonJS 因动态加载无法实现此优化。ES Module的普及促使npm生态向ESM迁移,工具链(如Webpack、Rollup、Vite)全面支持ESM,形成从开发到构建的完整解决方案。从“脚本堆砌”到“工程化设计”,模块化推动了组件化开发、Monorepo架构和微前端实践,例如通过Webpack和Vite实现模块联邦与即时编译。模块化通过独立作用域隔离变量,避免全局命名冲突。

警警的博客 1598

JS模块化-实现一个简单的CommonJS

待续

水蓝针织 897

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

在现代 JavaScript 开发中,模块化是提升代码组织性和可维护性的关键。本文深入解析三种主流的模块化规范——CommonJS、AMD 和 ES6 Module。

Allen- 3479

惊呆了!Oracle 11g从入门到放弃的保姆级指南(新手必看)

本文为Oracle 11g数据库新手提供了一份详尽的入门指南。内容涵盖从安装配置、SQL*Plus工具使用、核心的SQL增删改查操作,到事务、索引等进阶概念的解析。文章旨在帮助初学者避开常见陷阱,快速掌握这一经典关系型数据库管理系统的基本操作与核心技能,实现从入门到上手。

ooo22的博客 266

js - CommonJs和ES6 module的使用和区别

CommonJs和ES6 module的使用和区别

尽日寻春不见春,芒鞋踏遍陇头云。归来笑拈梅花嗅,春在枝头已十分。 2441

华中科技大学头歌 交通灯系统设计 Lojisim 详细实验报告,实验图,仅供参考

本实验也是参考了许多大神的做法,也是小白一个!有完整实验代码,实验报告,答辩PPT(ppt当时做得仓促,有点拉胯)~ 需要请评论或私QQ:3096524043(有偿~~) 一、数码管驱动 由真值表生成电路 二、四位无符号比较器设计 三、8位无符号比较器设计 四、一位2路选择器设计 五、八位2路选择器设计 六、BCD双向计数器状态机设计 七、BCD双向计数器输出函数设计 ...

FindXY的博客 1万+

【JS模块】common JS 规范 看这一篇足够了

为什么会有模块这个说法 我们通常在学习新的东西时,都要问一个问题:为什么需要它,它能干嘛,它解决了什么? 模块往往是语言标准中的一部门,最基本的作用就是隔离命名空间,避免出现命名冲突。 假设: 在a.js中有一个变量"name",在b.js中也有一个变量"name",那么用“script”标签加载这两个js脚本,那么最终name的值是哪一个? // a.js var name = 'I am a.js' // b.js var name = 'I am b.js' // index.html <s

www569006806的博客 4881

【中英双语】Illumina测序原理详解 | 边合成边测序/Sequencing by Synthesis

很多朋友们问我视频讲解时用的笔记可不可以分享,那当然必须是可以呐!但我当时其实没有好好记录,只是打了个草稿就开讲啦!既然大家有需求,俺就重新整理了一下,希望可以帮到大家!

weixin_43843918的博客 7872

在linux上本地大模型部署与推理

您的Python脚本(客户端)可能在您的个人电脑上,而模型服务(服务器)在远程Linux服务器上。如果您的服务器有强大的NVIDIA GPU,并且您对性能有更高的要求(例如需要高吞吐量),vLLM是更好的选择。这种方式无需向公网暴露服务器端口,而是通过加密的SSH通道将服务器的端口“映射”到您的本地电脑上。我们将启动一个API服务器,它会加载您指定的模型,并等待您的代码前来调用。如果您直接在SSH窗口运行上面的命令,一旦您关闭窗口,服务就会停止。这是根据您的原始代码修改的版本,适配本地vLLM服务。

frostmelody 全网同名,大家多多关注呀~ 持续分享优质内容! 2054

前端学习之路4-JavaScript模块化

文章目录模块模式AMD与CommonJS标准ES6 模块 模块模式 通过使用立即执行函数,我们可以隐藏指定的模块执行细节。通过添加对象和闭包,我们可以定义模块接口,通过接口暴露模块的功能。 这种在JavaScript中通过使用立即执行函数、对象和闭包来创建模块的方式称为模块模式。这是由Douglas Crockford推广,也是第一个大规模流行的JavaScript代码模块化的方法。 缺点: 扩展的模块无法共享原有模块的内部属性。 模块模式无法实现这些依赖关系 AMD与CommonJS标准 AMD设计理念基

u013257767的博客 153

zabbix5+dify+ollama+deepseek+企业微信 本地部署实现故障智能分析

zabbix5告警信息deepseek自动分析

slc14211421的专栏 3073

JS模块化总结 | CommonJS、ES6

JS模块化总结 | CommonJS、ES6

yavlgloss的博客 2331

Close-By Site Assignment,门店近邻关系在 SAP Retail 物料搜索里的真实价值

SAP零售模块中的"Close-By Site Assignment"功能常被低估,但它在门店现场业务中极为关键。该功能允许预先定义各门店间的近邻关系,当导购或店长查询商品时,系统会自动展示附近门店的库存、价格和促销信息。与单纯的地理距离不同,这种近邻关系可基于调拨频率、业务关联度等业务逻辑定义。维护入口在事务码WSD_CBP中,支持按应用场景(如销售、采购)分别设置不同近邻关系。该功能不同于组织结构,专注于增强搜索体验,特别适合多门店运营场景,能有效提升跨店查询效率。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4852

详解Linux下使用vscode编译运行和调试C/C++

本教程将具体详解使用Visual Studio Code在Linux环境下使用C/C++方法。 GCC C++ 编译器 (g++) 和 GDB 调试器的方法。 GCC是GNU 编译器集合; GDB 是 GNU 调试器。 1.先决条件 安装Visual Studio Code. 安装C++拓展插件。点击在vscode界面最左侧的Extensions图标(打开快捷键:ctrl+shift+X),搜索“C/C++”,点击进行安装。 确保已安装gcc. 一般ubuntu系统会预装gcc.在终端窗口中输入如下命令

休的博客 6241

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

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

皖林的博客 2万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

commonJS和ES6模块化的区别

commonJS和ES6模块化一、简述区别1.语法差异2. 什么是运行时加载呢?3. 什么是编译时加载或静态加载呢?4.在 Node.js 中使用模块化,ES6 模块与 CommonJS 模块差异二、commonJS三、ES6模块化1.语法2.在浏览器中使用ES6模块四、在 Node.js 中使用模块化1. 在Node.js 中使用ES6模块2. 在Node.js 中使用commonjs模块3.package.json 的 main 和exports字段 一、简述区别 在 ES6 之前,社区制定了一些模块

xieanna123的博客 5547

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

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

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

青春木鱼的博客 2332

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

CommonJS和ES6模块化的区别

1,使用环境 CommonJS模块的require语法是同步的,导致CommonJS模块规范只适合用在服务端。因为如果在浏览器端使用同步的方式加载一个模块,需要有网络来决定快慢,响应时间可能会很长。 ES6模块无论在浏览器端还是服务端都是可以使用的,但是在服务端,还需要遵循一些特殊的规则才能使用。 2,输出方式不同 CommonJS输出的是一个值的拷贝 ES6模块输出的是值的引用 CommonJS-值的拷贝 CommonJS输出的是值的拷贝,换句话说,一旦输出了某个值,模块内部后续的变化影响不了外部

Dax1_的博客 4635

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

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

Amelian的博客 3483

记笔记:搞清CommonJS、AMD、CMD、ES6的联系与区别

CommonJS、AMD、CMD、ES6的区别 首先我们需要考虑为什么会出现这几种规范? 其次我们要考虑模块概念的提出要解决什么问题? 然后让我们搞清楚几种规范之间存在的联系和区别   其实,CommonJS规范的提出,主要是为了弥补JavaScript没有标准的缺陷,已达到像Python、Ruby和Java那样具备开发大型应用的基础能力,而不是停留在开发浏览器端小脚本程序的阶段。模块规范主要分为三部分:模块引用、模块定义、模块标识。 同时,模块规范很好地解决变量污染问题,每个模块具有独立空间,互不干扰

寒烟说的博客 3万+

ES6的模块化和commonJS的模块化有什么区别?

ES6模块更适合于现代JavaScript开发,具有静态分析、支持异步加载、模块化和更清晰的语法。CommonJS模块主要用于Node.js环境,特点是同步加载、动态模块解析,适用于服务器端开发,但不太适合浏览器环境,除非通过打包工具进行转换。两者各有优缺点,通常在浏览器环境中使用 ES6 模块,在Node.js中则更常用 CommonJS,但在现代应用中,尤其是配合构建工具(如 Webpack、Babel)时,ES6 模块正逐渐成为标准。

dzhnb的博客 1592

require与import的区别和使用(CommonJS规范和es6规范)

CommonJS的由来 在早期没有模块化思想时代码没有很好的编写规范,导致很多代码、逻辑重复、缺乏条理性且不易管理维护,这也让很多开发者头疼不已。随着JavaScript 社区的发展,社区为JavaScript制定了相应的规范,而CommonJS规范的提出得到了大家的承认和广泛的应用,2009年CommonJS就此诞生了。 CommonJS介绍 CommonJS实现了Javascript的模块化规范,规范了模块的特性和各模块之间的相互依赖性,使得代码可以更好的编写和维护,同时提高了代码的复用性。定义每个文件

田兴的博客 8354

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

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

qq_44919431的博客 1594
上一篇: CSS Flex弹性布局之Flexbox空间分配机制
下一篇: 跟着Anthropic学用Agent实现完整项目
v0_persistent
博客等级 码龄3年 5粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值