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

定义模块:一个文件就是一个模块,有单独的作用域

模块输出:要导出的内容放入 module.exports 对象

加载模块:require 返回 module.exports 对象

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、下载


wget https://cdn.bootcdn.net/ajax/libs/require.js/2.3.6/require.min.js

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、下载


wget https://cdn.bootcdn.net/ajax/libs/seajs/3.0.3/sea.js

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 区别

AMD 推崇依赖前置,在定义模块的时候就要声明其依赖的模块

CMD 推崇就近依赖,只有在用到某个模块的时候再去 require

三、ES6 模块

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

image.png


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>

参考


前端模块化,AMD 与 CMD 的区别

Module 的加载实现

相关文章
|
3天前
|
人工智能 JSON 供应链
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
LucianaiB分享零成本畅用JVS Claw教程(学生认证享7个月使用权),并开源GeoMind项目——将JVS改造为科研与产业地理情报可视化AI助手,支持飞书文档解析、地理编码与腾讯地图可视化,助力产业关系图谱构建。
23298 2
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
|
5天前
|
人工智能 API 开发工具
Claude Code国内安装:2026最新保姆教程(附cc-switch配置)
Claude Code是我目前最推荐的AI编程工具,没有之一。 它可能不是最简单的,但绝对是上限最高的。一旦跑通安装、接上模型、定好规范,你会发现很多原本需要几小时的工作,现在几分钟就能搞定。 这套方案的核心优势就三个字:可控性。你不用依赖任何不稳定服务,所有组件都在自己手里。模型效果不好?换一个。框架更新了?自己决定升不升。 这才是AI时代开发者该有的姿势——不是被动等喂饭,而是主动搭建自己的生产力基础设施。 希望这篇保姆教程,能帮你顺利上车。做出你自己的作品。
8084 18
Claude Code国内安装:2026最新保姆教程(附cc-switch配置)
|
13天前
|
缓存 人工智能 自然语言处理
我对比了8个Claude API中转站,踩了不少坑,总结给你
本文是个人开发者耗时1周实测的8大Claude中转平台横向评测,聚焦Claude Code真实体验:以加权均价(¥/M token)、内部汇率、缓存支持、模型真实性及稳定性为核心指标。
4765 24
|
8天前
|
人工智能 JSON BI
DeepSeek V4 来了!超越 Claude Sonnet 4.5,赶紧对接 Claude Code 体验一把
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro 的真实体验与避坑记录 本文记录我将 Claude Code 对接 DeepSeek 最新模型(V4Pro)后的真实体验,测试了 Skills 自动化查询和积木报表 AI 建表两个场景——有惊喜,也踩
3349 11
|
7天前
|
人工智能 缓存 BI
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro,跑完 Skills —— OA 审批、大屏、报表、部署 5 大实战场景后的真实体验 ![](https://oscimg.oschina.net/oscnet/up608d34aeb6bafc47f
2725 9
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
|
25天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
20412 62
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)