JS模块化总结 | CommonJS、ES6

BV13W42197jR 个人笔记

目录

  • JS模块化基础知识
  • 1. 概述
    • 1.1 什么是模块化
    • 1.2 为什么需要模块化?
  • 2 模块化规范
  • 3 导入&导出
  • 4 CommonJS规范
    • 4.1 初步体验
    • 4.2 导出数据
    • 4.3 导入数据
    • 4.4 扩展理解
    • 4.5 浏览器端运行
  • 5 ES6模块化规范
    • 5.1 初步体验
    • 5.2 Node中运行ES6
    • 5.3 导出数据
      • ①分别导出
      • ②统一导出
      • ③默认导出
    • 5.4 导入数据
    • 练习题
    • 6 AMD
    • 7 CMD

JS模块化基础知识

1. 概述

1.1 什么是模块化

  • 将程序文件依据一定规则拆分成多个文件,这种编码方式就是模块化的编码方式。简单来说就是一个 .js文件太大了,把它拆成几个js文件
  • 拆分出来每个文件就是一个模块,模块中的数据都是私有的,模块之间互相隔离
  • 同时也能通过一些手段,可以把模块内的指定数据“交出去”,供其他模块使用。

1.2 为什么需要模块化?

随着应用的复杂度越来越高,其代码量和文件数量都会急剧增加,会逐渐引发以下问题:
1.全局污染问题
2.依赖混乱问题 比如script标签引入有顺序问题
3.数据安全问题

2 模块化规范

历史背景(了解即可): 2009年,随着Node.js的出现,JavaScript 在服务器端的应用逐渐增多,为了让Node.js 的代码更好维护,就必须要制定一种Node.,js环境下的模块化规范,来自Mozilla的工程师Kevin Dangoor提出了CommonJS规范(CommonJS初期的名字叫ServerJS,随后Node.js 社区采纳了这一规范。

随着时间的推移,针对JS的不同运行环境(浏览器、服务端),相继出现了多种模块化规范,按时间排序,分别为:

1. CommonJS —— 服务端应用广泛
2. AMD
3. CMD
4. ES6模块化 —— 浏览器端应用广泛

3 导入&导出

模块化的核心思想就是:模块之间是隔离的,通过导入和导出进行数据和功能的共享。

  • 导出(暴露):模块公开其内部的一部分(如变量、函数等),使这些内容可以被其他模块使用。
  • 导入(引入):模块引用和使用其他模块导出的内容,以重用代码和功能。
    在这里插入图片描述

4 CommonJS规范

一般用在node环境下

4.1 初步体验

导入 require
在这里插入图片描述

  • school.js
const name = '大学'
const slogan = '厚德载物'function getTel() {return '0101010'
}function getCities() {return ['beijing', 'shanghai', 'guangzhou', 'shenzhen']
}exports.name = name
exports.slogan = slogan
exports.getTel = getTel
  • student.js
const name = '李三'
const motto = '加油'function getTel() {return '13555555'
}function getHobby() {return ['swimming', 'badminton', 'football', 'basketball']
}exports.name = name
exports.motto = motto
exports.getTel = getTel
  • index.js
const school = require('./school.js')
const student = require('./student.js')
console.log(school);
console.log(student);
  • 入口文件运行
    在这里插入图片描述

4.2 导出数据

在CommonJS标准中,导出数据有两种方式
第一种方式:module.exports = value //赋值为新对象
第二种方式:exports.name = value

  • 示例
***第二种方式*******************
exports.name = name
exports.slogan = slogan
exports.getTel = getTel***第一种方式*******************
module.exports = {name: name,slogan: slogan,getTel: getTel
}***简写*******************
module.exports = {name,slogan,getTel
}

注意点:
① 每个模块内部的: this,exports, modules.exports 在初始时,都指向同一个空对象,该
空对象就是当前模块导出的数据,如下图:
在这里插入图片描述
② 无论如何修改导出对象,最终导出的都是 module.exports 的值。

③ exports是对 module.exports 的初始引用,仅为了方便给导出象添加属性,所以不能使用exports = value 的形式导出数据,但是可以使用module.exports = xxxx导出数据。

4.3 导入数据

导入语法 const school = require('./school.js')

常搭配对象解构使用 const {name, slogan, getTel} = require('./school.js')

  • 出现的问题:多个require可能导致变量名冲突
  • 解决方法:重命名 const {name: stuName, motto , getTel: stuTel} = require('./student.js')

4.4 扩展理解

怎么做到模块之间是隔离的?
怎么能直接使用module?exports?

一个JS模块在执行时,是被包裹在一个内置函数中执行的,所以每个模块都有自己的作用域
可以通过下面的语句打印验证 console.log(arguments.callee.toString())

内置函数的大致形式如下:function(exports, require, module, __filename, __dirname) {}

4.5 浏览器端运行

CJS设计之初就是为了在浏览器中运行的,以前的名字叫serverJS,但是通过引入JS却无法在浏览器上运行。

Node.js 默认是支持CommonJS规范的,但浏览器端不支持,所以需要经过编译,步骤如下:
第一步:全局安装browserify npm i browserify -g
第二步:编译 browserify index.js -o build.js 注:index.js是源文件,build.js是输出的目标文件
第三步:在页面中引入使用<script type="text/javascript" src="./build.js"> </script>

5 ES6模块化规范

ES6模块化规范是一界官方标准的规范,它是在语言标准的层面上实现了模块化功能,是目前最流行的模块化规范,且浏览器与服务端均支持该规范。

5.1 初步体验

在这里插入图片描述

  • school.js 导出
export const name = '大学'
export const slogan = '厚德载物'export function getTel() {return '0101010'
}//没导出
function getCities() {return ['beijing', 'shanghai', 'guangzhou', 'shenzhen']
}
  • index.js导入
import * as school from './school.js'
console.log(school);
  • index.html 注意ES6要在页面中运行
    这里一定要写为type="module"
<body><script type="module" src="./index.js"></script>
</body>

5.2 Node中运行ES6

  • 方法一
    如果node版本是12及以上,可以直接把js文件后缀名改成 .mjs,这样node+index.js就可以运行了

  • 方法二

在工程文件中新增一个 package.json
在这里插入图片描述

package.json里面加这一句话

{"type": "module"
}

运行成功:
在这里插入图片描述

5.3 导出数据

ES6模块化提供3种导出方式
①分别导出
②统一导出
③默认导出
备注:「上述多种导出方式,可以同时使用」

①分别导出

export const name = '大学'
export const slogan = '厚德载物'export function getTel() {return '0101010'
}export function getCities() {return ['beijing', 'shanghai', 'guangzhou', 'shenzhen']
}

②统一导出

export {name,slogan,getTel} 这个不是对象

const name = '大学'
const slogan = '厚德载物'function getTel() {return '0101010'
}function getCities() {return ['beijing', 'shanghai', 'guangzhou', 'shenzhen']
}//统一导出
export {name,slogan,getTel} //这个不是对象

③默认导出

默认的英文名是default export default name
这里是对象

export default {name:name,slogan:slogan,getTel:getTel
}
  • 用了三种导入方式后:
    在这里插入图片描述

5.4 导入数据

对于ES6模块化来说,使用何种导入方式,要根据导出方式决定。

(1)导入全部 (通用)

import * as school from './school.js'

(2)命名导入:对应导出方式——分别导出、统一导出

import {name, slogan, getTel} from './school.js'
console.log(name);
console.log(slogan);
console.log(getTel);

可以改名 import {name as schoolName} from './school.js'
在这里插入图片描述
在这里插入图片描述

(3)默认导入:对应导出方式——默认导出
在这里插入图片描述

(4)命名导入 & 与默认导入可以混合使用
在这里插入图片描述

(5)动态导入 (通用)
现在不想用,以后用到的时候再导入
在这里插入图片描述

(6)import可以不接收任何数据
import './log.js' 这个JS模块可能是打印随机数的

  • 解决了全局污染问题,神奇的 type=“module” <script type="module" src="./index.js"></script>

练习题

  • 打印什么(答案:1 1)
    在这里插入图片描述
  • 思考2:使用CommonJS规范,编写如下代码,输出结果是什么?
let sum = 1
function increment() {sum += 1
}
module.exports = {sum, increment}
const {sum, increment} = require('./data.js')
console.log(sum)
increment()
increment()
console.log(sum)

答案:1, 1

  • 思考3:使用ES6模块化规范,编写上述代码,输出结果是什么?
  • 在这里插入图片描述

答案:1 ,3

是编写代码中很重要的部分,export交出去就要只读了,所以sum要用const修饰

ES6 import和export共用一块内存,但CJS是复制

6 AMD

7 CMD

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/403832.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文掌握 Web 测试:功能、界面、兼容与安全的综合测试指南!

随着Web技术的不断演进&#xff0c;测试除了对应用的功能性、界面美观性、跨平台兼容性的基本要求外、安全性和性能的要求也逐步增高。因此&#xff0c;全面、系统的测试思维和策略成为了保证Web应用高质量的关键因素。本篇文章将从功能测试、界面测试、兼容性测试和安全测试四…

【数据结构】PTA 带头结点的链式表操作集 C语言

本题要求实现带头结点的链式表操作集。 函数接口定义&#xff1a; List MakeEmpty(); Position Find( List L, ElementType X ); bool Insert( List L, ElementType X, Position P ); bool Delete( List L, Position P ); 其中List结构定义如下&#xff1a; typedef struc…

Kotlin学习-01创建kotlin学习环境

安装idea https://www.jetbrains.com/zh-cn/ 创建项目 选择kotlin 修改Main.kt fun main() {print("Hello World!") }运行

APP支付宝授权获取code uniapp

1.点击使用plus.runtime跳转打开支付宝 //打开支付宝授权&#xff0c;在支付宝APP中授权后会在支付宝中跳转到你填写的h5地址//urls是授权地址可以后端拼接也可以前端写死 //以下是一个拼接示例&#xff0c;需修改app_id的值和redirect_uri的值即可 //app_id是商户的APPID&…

计算机网络系统速成

Http与Https Http与Https是两种重要的网络通信协议&#xff0c;它们在Web通信中扮演着关键角色。以下是对Http与Https的详细解析&#xff1a; 一、Http&#xff08;超文本传输协议&#xff09; 1. 定义与功能 定义&#xff1a;Http&#xff08;HyperText Transfer Protocol…

Vue如何给计算属性computed传参的思考,看完就明白了!

一、缘起 事情的起因是这样的&#xff0c;有位朋友&#xff08;无中生友&#xff09;遇到了如下需求&#xff1a; 上面是一个商品列表&#xff0c;每个商品对应一个价格、优惠、数量&#xff0c;并且数量可以动态改变&#xff0c;最后动态计算出一个总价。当然&#xff0c;这只…

Ubuntu修改命令提示符格式PS1

命令提示符组成 通过Xshell进入Ubuntu的默认提示符是这样的 rootDESKTOP:~# root: 当前登录用户DESKTOP&#xff1a;主机名~: 当前目录名&#xff08;即用户主目录&#xff09;#&#xff1a;超级用户权限(root用户显示)$: 普通用户权限(非root用户显示) 修改命令提示符 step1…

nginx实战演练

目录 一.Nginx架构和安装&#xff08;未完待续&#xff09; <1>.Nginx概述 <2>.Nginx架构和进程 <3>.Nginx模块 <4>.Nginx安装(编译安装) 二.Nginx基础配置 <1>.关闭debug <2>.将nginx软件添加到环境变量 <3>.开机自启动脚…

Qt/C++地图标注点的添加删除移动旋转/指定不同图标和动图/拿到单击信号

一、前言说明 标注点在地图开发中是最常见的应用场景之一&#xff0c;比如在地图上需要显示设备的位置&#xff0c;基本上都是添加标注点&#xff0c;指定图片和尺寸已经经纬度坐标位置。这个功能在每种地图内核中都提供的&#xff0c;这个并没有任何难点&#xff0c;在这个功…

CeresPCL 最小二乘插值(曲线拟合)

一、简介 在多项式插值时,当数据点个数较多时,插值会导致多项式曲线阶数过高,带来不稳定因素。因此我们可以通过固定幂基函数的最高次数 m(m < n),来对我们要拟合的曲线进行降阶。之前的函数形式就可以变为: 既然是最小二乘问题,那么就仍然可以使用Ceres来进行求解。 …

★ C++基础篇 ★ vector 类

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将继续和大家一起学习C基础篇第六章----vector类 ~ 目录 一 vector的介绍及使用 1.1 vector的介绍 1.2 vector的使用 1.2.1 vector的定义 1.2.2 vector iterator 的使用 1.2.3 vector 空间增长问题 1.2.4 vecto…

使用 Fyne 构建 GUI 应用:设置标签文本和自增计数器

引言 Fyne 是一个用 Go 语言编写的跨平台 GUI 框架&#xff0c;它提供了一套丰富的组件来帮助开发者快速构建出漂亮的用户界面。在本文中&#xff0c;我们将通过一个简单的案例来演示如何使用 Fyne 创建 GUI 应用程序&#xff0c;该程序包含设置标签文本和自增计数器的功能。 …

高可用集群keepalived从部署到实战一篇解决

目录 一.高可用集群 1.1 集群类型 1.2 系统可用性 1.3 系统故障 1.4 实现高可用 1.5.VRRP&#xff1a; 1.5.1 VRRP 相关术语 1.5.2 VRRP 相关技术 二.Keepalived 部署 2.1 keepalived 简介 2.2keepalived架构 2.3 Keepalived 环境准备 2.4 Keepalived 相关文件 2.…

Python编写Word文档

目录 0. 安装依赖 1. 创建word文档 2. 添加标题、居中、字体16大小 3. 添加标题一 4. 添加一段话并设置字体颜色 封装函数 5. 换页 6. 插入表格 0. 安装依赖 python-docx1.1.2 1. 创建word文档 from docx import Documentdoc Document() 2. 添加标题、居中、字体1…

智碳云/高能耗企业 水-电-气-热-油-空压机等能源数据采集系统【源码】

智碳云/高能耗企业 水-电-气-热-油-空压机等能源数据采集系统【源码】 介绍基于SpringCloud的能源管理系统-能源管理平台源码-能源在线监测平台-双碳平台源码-SpringCloud全家桶-能管管理系统源码-能管系统软件架构

【记git 重命名文件失败,和正确方法】

【背景】 想要重命名一个文件&#xff0c;并同步到远程 【过程】 1.我是直接把 “驱动增加he.c” 文件重命名为 “驱动增加播放he接口方法” &#xff0c;想着直接提交就会同步重命名git仓记录的文件名。然后就可以推送到远程仓库&#xff0c;同步重命名远程仓库的文件名。 2.然…

全球滑坡(降雨诱发的)数据(有时间属性)

滑坡一般指狭义概念的滑坡,是指构成斜坡的有滑动历史和滑动可能性的岩、土体边坡,在重力作用下伴随着其下部软弱面(带)上的剪切作用过程而产生整体性运动的现象。 滑坡的发育阶段滑坡的发生、发展过程是有阶段性的。根据大量的现场实际资料、观测成果、滑坡模型试验和相关的岩土…

ant design pro v6 如何做好角色管理

先上图&#xff1a; 整个角色管理是如何做的吗&#xff1f; 首先你要处理后端&#xff0c;要先把角色存到用户那。 这是用户管理部分的内容&#xff1a; 可以看到一个用户是有多个角色的。 看到没有&#xff0c;存的是数组 数组的是一个 role 对象 role 对象是这样&#xf…

【专题】2024年7月人工智能AI行业报告合集汇总PDF分享(附原数据表)

原文链接:https://tecdat.cn/?p37350 随着人工智能技术的飞速发展&#xff0c;AI已经成为当今时代的重要驱动力。本报告将聚焦于人工智能AI行业的最新动态&#xff0c;涵盖客户服务、体验营销、资产管理以及国产AI大模型应用等多个领域。通过深入研究和分析&#xff0c;我们…

C++ 设计模式——抽象工厂模式

抽象工厂模式 抽象工厂模式 抽象工厂模式主要组成部分代码实现抽象工厂模式模式的 UML 图抽象工厂模式 UML 图解析优点和缺点适用场景 抽象工厂模式提供一个接口&#xff0c;用于创建一系列相关或相互依赖的对象&#xff0c;而无需指定它们的具体类。它通常用于需要创建多个产品…