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天前
|
数据采集 人工智能 安全
|
12天前
|
云安全 监控 安全
|
3天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
1027 151
|
3天前
|
编解码 人工智能 机器人
通义万相2.6,模型使用指南
智能分镜 | 多镜头叙事 | 支持15秒视频生成 | 高品质声音生成 | 多人稳定对话
|
17天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1722 9
|
8天前
|
人工智能 自然语言处理 API
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸
一句话生成拓扑图!next-ai-draw-io 结合 AI 与 Draw.io,通过自然语言秒出架构图,支持私有部署、免费大模型接口,彻底解放生产力,绘图效率直接爆炸。
667 152
|
10天前
|
人工智能 安全 前端开发
AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
634 15
|
5天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
389 4