JS模块化总结 | CommonJS、ES6

news2024/11/14 13:59:18

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.coloradmin.cn/o/2049000.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ 设计模式——工厂方法模式

工厂方法模式 工厂方法模式主要组成部分代码实现工厂方法模式模式的 UML 图工厂方法模式 UML 图解析优点和缺点适用场景 工厂方法模式 工厂方法模式是一种创建型设计模式&#xff0c;它通过定义一个接口用于创建对象&#xff0c;但由子类决定实例化哪个类。与简单工厂模式不同…

笔记 5 : 彭老师课本第 5 章 , 开始代码编程

&#xff08;49&#xff09;大纲&#xff1a; &#xff08;50&#xff09; 系统&#xff1a; &#xff08;51&#xff09; 学习路线&#xff1a; &#xff08;52&#xff09;该款 soc 的内存布局&#xff1a; 细化的 SFR 地址空间 &#xff1a; &#xff08;53&#xff09; soc…

IMX8M核心板偶发系统启动失败排查实录

一. 基本情况介绍 1. 硬件方案组成 产品中采用的是IMX8M核心板的方案&#xff0c;如图1所示是产品的硬件系统整体组成示意图。 图1 产品硬件组成框图 2. 问题描述 今年5月份有一台设备出现系统偶发启动失败&#xff0c;uboot阶段都无法通过&#xff0c;表面现象是显示屏黑屏…

Android持久化技术—SharedPreferences存储

文章目录 Android持久化技术—SharedPreferences存储将数据存储到SharedPreferences中Context类中的getSharedPreferences()方法Activity类中的getPreferences()方法PreferenceManager类中的getDefaultSharedPreferences()方法 从SharedPreferences中读取数据 Android持久化技术…

【自动驾驶】ROS远程节点的分布式通信

目录 固定IP的设置将IP地址改成手动配置文件修改配置主从机的~/.bashrc 文件配置主机的 IP 地址配置从机IP ROS是一个分布式计算环境。一个运行中的ROS系统可以包含分布在多台计算机上多个节点。根据系统的配置方式&#xff0c;任何节点可能随时需要与任何其他节点进行通信。 …

XSS靶场————XSS.pwnfunction

目录 第一关&#xff1a;Ma Spaghet! 第二关&#xff1a;Jefff 第三关&#xff1a;Ugandan Knuckles​编辑 第四关&#xff1a;Ricardo Milos ​编辑 第五关&#xff1a;Ah Thats Hawt​编辑 第六关&#xff1a;Ligma 第七关&#xff1a;Mafia​编辑 第八关&#xff1a…

交易系统JVM内存优化

背景 新交易系统上线以后&#xff0c;业务指标&#xff08;成单率&#xff09;和系统指标&#xff08;CPU、QPS、JVM内存&#xff09;是我们重点关注的指标。 CPU较高&#xff1a;可以通过Arthas等工具查看繁忙线程的堆栈信息&#xff0c;定位具体的代码&#xff0c;具体分析…

谷歌浏览器字体模糊不清怎么办

许多小伙伴在使用谷歌浏览器时&#xff0c;可能都遇见过字体模糊不清的情况&#xff0c;这将对我们的浏览体验大打折扣。为了解决这以问题&#xff0c;本文将为大家带来谷歌浏览器字体模糊不清的解决方法&#xff0c;帮助你享受到更清晰舒适的阅读环境。&#xff08;本文由chro…

聚星文社AI工具官方

聚星文社是一键AI推文生成工具超强功能极速版介绍聚星文社AI工具官方https://docs.qq.com/doc/DRU1vcUZlanBKR2xy 同时集成原创和反推搬运功能 并可一键切换MJ或SD进行批量出库 一键自动智能分镜或手动快速分镜 精准排布镜头功能全预设 超简化流程 3秒即可完成参数配置全网最全…

Java 并发(五)—— 线程池

线程池核心参数&#xff1f;&#xff08;核心线程数、最大线程数、任务队列&#xff09;线程池构造方法中除了保存参数以外还要做什么事&#xff1f;&#xff08;设置线程工厂、任务拒绝策略&#xff09;提交任务时线程池要做什么&#xff1f;&#xff08;任务执行机制&#xf…

Golang Map 深度剖析:原理、实践与面试要点

嘿,小伙伴们!我是 k 哥。今天,咱们来聊聊 Map 。 在 Go 语言这个神奇的世界里,Map 这个有点神秘的数据结构一直都是开发者们特别关注的。 你是不是在用 Map 的时候,对它里面咋工作的感到好奇?是不是碰到复杂操作的时候,特别想弄明白它背后的原理?别着急,今天这篇文章…

Java流程控制06:嵌套for循环

本节教学视频链接&#xff1a;https://www.bilibili.com/video/BV12J41137hu?p41&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p41&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 在Java中&#xff0c;‌嵌套for循环是指将…

使用三菱PLC源码进行PLC读取写入操作

安装 MX Component 。 我的安装地址在&#xff1a; 打开 utl 文件夹下的 Communication Settings Utility 执行。 配置PLC 添加当前需要配置的PLC 注意 logical station Namber 就是程序里需要对接的逻辑站点编号 5.配置选择对应的COM操作选择对应的cpu型型号&#xff0c;…

Ah That‘s Hawt

目录 一、题目 二、思路 三、payload 3.1 方案一 3.1 方案二 四、思考与总结 一、题目 <!-- Challenge --> <h2 id"will"></h2> <script>smith (new URL(location).searchParams.get(markassbrownlee) || "Ah Thats Hawt")sm…

甄选系列“论软件开发过程RUP及其应用”,软考高级论文,系统架构设计师论文

论文真题 RUP(Rational Unified Process)是IBM公司的一款软件开发过程产品,它提出了一整套以UML为基础的开发准则,用以指导软件开发人员以UML为基础进行软件开发。RUP汲取了各种面向对象分析与设计方法的精华,提供了一个普遍的软件过程框架,可以适应不同的软件系统、应用…

ant -design 框架以及具体调试

1.介绍 Ant-Design-Vue 是一个基于 Ant Design 设计体系的 Vue 实现。Ant Design 是由阿里巴巴开源的一个企业级 UI 设计语言&#xff0c;旨在提升用户体验和开发效率。Ant-Design-Vue 将 Ant Design 的设计理念和组件库带入了 Vue 生态系统&#xff0c;使得开发者能够在 Vue …

RabbitMQ集群 - 普通集群搭建、宕机情况

文章目录 RabbitMQ 普通集群概述集群搭建数据准备启动容器宕机情况 RabbitMQ 普通集群 概述 1&#xff09;普通模式中所有节点没有主从之分&#xff0c;所有节点的元数据&#xff08;交换机、队列、绑定等&#xff09;都是一致的. 例如只要有任意一个节点上面 新增交换机&…

迈出Python自动化测试的第一步

一、思考❓❔ 1.什么是性能自动化测试? 性能 系统负载能力超负荷运行下的稳定性系统瓶颈 自动化测试 使用程序代替手工提升测试效率 性能自动化 使用代码模拟大批量用户让用户并发请求多页面多用户并发请求采集参数&#xff0c;统计系统负载能力生成报告 2.Python中的性能自…

C++竞赛初阶L1-12-第五单元-while(27~28课)531: T456440 含 k 个 3 的数

题目内容 输入两个正整数 m 和 k&#xff0c;其中 1<m≤1015&#xff0c;1<k≤15 &#xff0c;判断 m 是否恰好含有 k 个 3&#xff0c;如果满足条件&#xff0c;则输出 YES&#xff0c;否则&#xff0c;输出 NO。 输入格式 输入一行&#xff0c;为两个整数 m,k&#x…

【js面试题】js原型,原型链?有什么特点

在 JavaScript 中&#xff0c;原型&#xff08;Prototype&#xff09;和原型链&#xff08;Prototype Chain&#xff09;是实现继承和共享属性与方法的核心机制。理解它们对于深入掌握 JavaScript 的对象模型非常重要。 原型&#xff08;Prototype&#xff09; 每个 JavaScri…