js 模块化基础和模块规范AMD、CMD、ES6模块

简介: js 模块化基础和模块规范AMD、CMD、ES6模块

一、模块基础

1、基于文件的模块化

把相关函数写在一个文件里

<script>
  function func1() {
    //   ...
  }

  function func2() {
    //   ...
  }
</script>

缺点:污染了全局变量,无法保证不与其他模块发生变量名冲突

2、基于对象的模块化

把所有的模块成员封装在一个对象中

<script>

var myModule = {
name: "Tom",

func: function () {},
};
</script>

优点:避免了变量污染,只要保证模块名唯一即可

缺陷:外部可以随意修改内部成员

3、基于函数的模块化

通过立即执行函数返回对象

<script>
var myModule = (function () {
var name = "Tom";

function func() {}

return {
name: name,
sayHello: sayHello,
};
})();
</script>

优点:模块外部无法修改我们没有暴露出来的变量、函数

二、JavaScript 模块规范

其中【基于函数的模块化】是模块化的基础

目前,通行的 JavaScript 模块规范主要有两种:CommonJS 和 AMD

1、Node.js 实现 CommonJS

  1. 定义模块:一个文件就是一个模块,有单独的作用域
  2. 模块输出:要导出的内容放入 module.exports 对象
  3. 加载模块:require 返回 module.exports 对象
  4. eg:

定义模块

// a.js

function func() {
console.log("func");
}

module.exports = {
func: func,
};

加载模块

// b.js

const myModule = require("./a");

myModule.func();

以上方法浏览器不直接支持

2、AMD 异步模块定义

Asynchronous Module Definition

由 require.js 支持

文档:https://requirejs.org/

实现接口:

// 定义模块
define(id?, dependencies?, factory);

id:模块的标识,默认脚本文件名
dependencies:当前模块依赖的模块名称数组
factory:模块初始化要执行的函数或对象

// 加载模块
require(dependencies, callback);

dependencies: 所依赖的模块数组
callback: 前面指定的模块都加载成功后的回调函数

eg:

1、下载

2、helper.js 定义模块

// 模块名,模块依赖,模块的实现function
define(function () {
return {
func: function () {
console.log("hello");
},
};
});

2、app.js 引入模块

require(["helper"], function (helper) {
helper.func();
});

3、index.html 浏览器中使用

<script src="require.min.js" data-main="app.js"></script>

3、CMD 通用模块定义

Common Module Definition

由 Sea.js 支持

文档:https://seajs.github.io/seajs/docs/#intro

实现接口

// 定义模块
define(id?, deps?, factory)

一般不在define的参数中写依赖

factory = function(require, exports, module)
require 用来获取其他模块提供的接口:require(id)
exports 用来向外提供模块接口
module 存储了与当前模块相关联的一些属性和方法

eg:

1、下载

2、helper.js 定义模块

define(function (require, exports, module) {
exports.func = function () {
console.log("hello");
};
});

3、app.js 引入模块

define(function (require, exports, module) {
var helper = require("helper");
helper.func();
});

4、index.html 浏览器中使用

<script src="sea.js"></script>

<script>
seajs.use("app");
</script>

4、AMD 与 CMD 区别

  1. AMD 推崇依赖前置,在定义模块的时候就要声明其依赖的模块
  2. CMD 推崇就近依赖,只有在用到某个模块的时候再去 require

三、ES6 模块

1、ES6 模块与 CommonJS 模块的差异

差异点

CommonJS

ES6

模块输出

值拷贝

值引用

机制

运行时加载

编译时输出接口

顶层 this 指向

当前模块

undefined

以下这些顶层变量在 ES6 模块之中都是不存在的

arguments
require
module
exports
__filename
__dirname

2、模块加载

1、传统方法

<!-- 页面内嵌的脚本 -->
<script type="application/javascript">
// module code
</script>

<!-- 外部脚本 -->
<script type="application/javascript" src="demo.js"></script>

浏览器脚本的默认语言是 JavaScript,因此 type="application/javascript"可以省略


默认情况下,浏览器是同步加载 JavaScript 脚本,执行完脚本,再继续向下渲染


2、异步加载脚本

<!-- 渲染完再执行 -->
<script src="demo.js" defer></script>

<!-- 下载完就执行 -->
<script src="demo.js" async></script>

3、ES6 加载

<script type="module" src="./foo.js"></script>
<!-- 等同于 -->
<script type="module" src="./foo.js" defer></script>

eg:

模块文件 demo.js

export default function () {
console.log("demo");
}

主文件 index.html

<script type="module">
import Demo from "./demo.js";
Demo();
</script>

参考

  1. 前端模块化,AMD 与 CMD 的区别
  2. Module 的加载实现
            </div>
目录
相关文章
|
2天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
266 116
|
17天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
12天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
658 220
|
5天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
334 34
Meta SAM3开源:让图像分割,听懂你的话
|
10天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1528 157
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
897 61
|
7天前
|
编解码 Linux 数据安全/隐私保护
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
291 140