Learn X in Y minutes 深度解析:AMD 异步模块定义——从 define/require 到 require.js 与 r.js 构建优化
文档教程【免费下载链接】learnxinyminutes-docsCode documentation written as code! How novel and totally my idea!项目地址https://gitcode.com/gh_mirrors/le/learnxinyminutes-docs点击查看免费下载AMDAsynchronous Module Definition异步模块定义是 JavaScript 模块化体系中最早面向浏览器异步加载场景的规范之一。本文以 learnxinyminutes-docs 仓库中收录的 AMD 教程英文原版 及 印地语译本为骨架系统讲解define/require双方法模型、require.js 的真实世界用法以及 r.js 的整项目构建优化流程。读完本文你将能独立读懂并写出 AMD 风格模块配置baseUrl与paths路径映射并通过r.js将开发期分散的多文件模块打包为生产环境可用的单文件脚本。AMD 是什么为浏览器而生的异步模块规范Asynchronous Module DefinitionAPI 规定了一种定义 JavaScript 模块的机制模块自身及其依赖可以被异步加载。这一点对浏览器环境尤其重要——在浏览器中模块的同步加载会带来四类典型问题性能performance同步加载会阻塞后续脚本解析与页面渲染可用性usability页面交互会被漫长的脚本下载阻塞调试debugging脚本加载顺序出错时依赖缺失的错误极难定位跨域访问cross-domain access同步脚本引用受同源策略限制难以从 CDN 或其他域加载模块。AMD 正是为解决这些问题而设计的模块定义规范。整个 API 的核心极度精简——只有两个方法define与require。所有模块的定义definition与消费consumption都围绕它们展开// define(id?, dependencies?, factory) 定义一个模块 // require(dependencies, callback) 导入一组依赖 // 并在传入的回调中消费它们基础概念define 与 require 双方法模型用 define 定义无依赖的具名模块先看最基础的用法用define定义一个具名模块named module它没有任何依赖只需传入模块名和工厂函数factorydefine(awesomeAMD, function(){ var isAMDAwesome function(){ return true; }; // 工厂函数的返回值就是其他模块或 require 调用 // 在请求 awesomeAMD 模块时接收到的导出值。 // 导出值可以是任何东西构造函数、普通对象、 // 原始类型甚至是 undefined虽然这没什么用。 return isAMDAwesome; });关键点在于工厂函数的返回值即模块的导出值。无论你导出的是构造函数、对象、原始值还是undefined其他模块拿到的就是这个值本身。定义带依赖的模块现在定义一个依赖awesomeAMD的新模块。注意define调用中多了一个参数——依赖数组define(loudmouth, [awesomeAMD], function(awesomeAMD){ // 依赖会按照声明顺序依次传给工厂函数的形参 var tellEveryone function(){ if (awesomeAMD()){ alert(This is sOoOo rad!); } else { alert(Pretty dull, isn\t it?); } }; return tellEveryone; });这里体现了 AMD 的两个核心约定依赖即参数[awesomeAMD]中声明的依赖会按顺序映射为工厂函数的形参awesomeAMD依赖先解析后执行工厂函数只有在全部依赖就绪后才会被调用。用 require 启动程序知道了如何定义模块接下来用require启动程序。require的签名是(arrayOfDependencies, callback)require([loudmouth], function(loudmouth){ loudmouth(); });require负责导入依赖集合并把它们作为参数传入回调。当页面加载完成后loudmouth被调用弹出 This is sOoOo rad!。一个极简的 AMD 实现30 行看懂原理为了让教程真正可运行原文档当场实现了一个非异步的 AMD 精简版本。这个实现虽然只有两个函数却完整揭示了 AMD 的底层机制——模块注册表 依赖注入function define(name, deps, factory){ // 注意无依赖模块的处理方式 // 没有 factory 时第二个参数deps本身就是工厂函数 define[name] require(factory ? deps : [], factory || deps); } function require(deps, callback){ var args []; // 首先取出 require 调用所需的全部依赖 for (var i 0; i deps.length; i){ args[i] define[deps[i]]; } // 满足回调的全部依赖后注入并调用 return callback.apply(null, args); }这段代码揭示了 AMD 的实质define把模块名作为键、工厂函数的执行结果作为值存入模块注册表require遍历依赖数组从注册表中按名取回已解析的模块再通过callback.apply(null, args)把依赖注入回调无依赖模块的巧妙处理factory ? deps : []即没有工厂函数时直接取deps作为工厂。这也是官方规范amdjs/amdjs-api所描述的通用模型一个模块注册表 一个依赖解析注入器。真实加载器如 require.js只是在这个模型之上补上了异步加载层。实战require.js 中的真实世界用法XHR 异步加载AMD 中的 A 被真正实现与上面的入门示例不同require.js最流行的 AMD 库真正实现了 AMD 中的A——通过 XHR 异步加载模块及其依赖/* file: app/main.js */ require([modules/someClass], function(SomeClass){ // 回调会被延迟执行直到依赖加载完成 var thing new SomeClass(); }); console.log(So here we are, waiting!); // 这行会先执行注意执行顺序console.log在回调之前执行。这正是异步加载的直观证据——require发出 XHR 请求后立刻返回页面脚本继续往下走当modules/someClass从服务器返回并解析完毕后回调才被触发。约定优于配置一文件一模块路径即模块名按照惯例通常一个文件存放一个模块。require.js 能基于文件路径解析模块名因此你不需要给模块命名直接用文件位置引用即可。以下面目录结构为例someClass被假定位于baseUrl配置所指向的modules文件夹中app/ main.js modules/ someClass.js someHelpers.js ... daos/ things.js ...这意味着我们可以不指定模块 id就定义someClass/* file: app/modules/someClass.js */ define([daos/things, modules/someHelpers], function(thingsDao, helpers){ // 模块定义同样是异步完成的 function SomeClass(){ this.method function(){/**/}; // ... } return SomeClass; });依赖数组里的daos/things、modules/someHelpers都是相对baseUrl的路径加载器会据此发起 XHR 请求。requirejs.config自定义路径映射要修改默认的路径映射行为在main.js中调用requirejs.config(configObj)/* file: main.js */ requirejs.config({ baseUrl : app, paths : { // 也可以从其他位置加载模块 jquery : //ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min, coolLibFromBower : ../bower_components/cool-lib/coollib } }); require([jquery, coolLibFromBower, modules/someHelpers], function($, coolLib, helpers){ // main 文件必须至少调用一次 require // 否则任何代码都不会被执行 coolLib.doFancyStuffWith(helpers.transform($(#foo))); });配置项语义如下配置项作用示例值baseUrl所有模块路径解析的基准目录apppaths为模块 id 指定实际加载路径可用完整 URL如 CDN或相对baseUrl的路径jquery : //ajax.googleapis.com/...、coolLibFromBower : ../bower_components/...特别值得注意paths的两种取值跨域 URLjquery直接指向 Google CDN 的压缩包路径省略.js后缀异步加载天然绕开了同步脚本的跨域限制本地相对路径coolLibFromBower指向baseUrl之外的 bower 组件目录用../跳出app目录。data-main单一入口自动加载基于 require.js 的应用通常只有一个入口main.js它作为data-main属性传给require.js的 script 标签页面加载时会自动加载并执行!DOCTYPE html html head titleA hundred script tags? Never again!/title /head body script srcrequire.js>$ npm install requirejs -g然后用配置文件喂给它$ r.js -o app.build.js-o表示 optimizer 模式app.build.js即构建配置文件。app.build.js 配置详解针对上文示例构建配置大致如下/* file : app.build.js */ ({ name : main, // 入口模块的名称 out : main-built.js, // 输出文件的名称 baseUrl : app, paths : { // empty: 告诉 r.js这个模块仍然从 CDN 加载 // 使用 main.js 中指定的位置不要打进构建产物 jquery : empty:, coolLibFromBower : ../bower_components/cool-lib/coollib } })配置项含义name入口模块名即依赖图分析的起点out构建产物文件名baseUrl与main.js中的baseUrl保持一致供模块路径解析paths与运行时配置对应其中empty:前缀是关键技巧empty:前缀的语义值得单独强调以jquery : empty:为例r.js 会跳过该依赖的本地解析与合并构建产物中保留对main.js指定 CDN 地址的引用。这样既避免了把体积庞大的第三方库打进产物又保持了开发期引用路径 生产期引用路径的一致性。生产环境切换只改一行>script srcrequire.js>赞分享文档教程【免费下载链接】learnxinyminutes-docsCode documentation written as code! How novel and totally my idea!项目地址https://gitcode.com/gh_mirrors/le/learnxinyminutes-docs点击查看免费下载相关推荐学习 AMD 异步模块定义从 define/require 到 require.js 与 r.js 构建实战学习 AMD 异步模块定义从 define/require 到 require.js 与 r.js 构建实战 导读 本篇技术指南以本仓库根目录的 amd.md文档教程AMD 异步模块定义实战指南基于 learnxinyminutes-docs 的 define/require 与 require.js 全解析AMD 异步模块定义实战指南基于 learnxinyminutes docs 的 define/require 与 require.js 全解析 本指南以仓库文档教程Learn X in Y Minutes 项目文档Learn X in Y Minutes 项目文档 1. 项目目录结构及介绍 learnxinyminutes docs 项目是一个开源文档项目旨在为各种编程文档教程上一篇KMS智能激活工具终极指南5分钟永久解决Windows和Office激活难题下一篇AI语音转换的终极实战指南检索机制驱动的商业级语音合成解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

LLDAP 数据库后端迁移实战:从 SQLite 平滑切换至 PostgreSQL / MySQL / MariaDB

LLDAP 数据库后端迁移实战:从 SQLite 平滑切换至 PostgreSQL / MySQL / MariaDB

后端认证鉴权 【免费下载链接】lldap Light LDAP implementation 项目地址: https://gitcode.com/gh_mirrors/ll/lldap 点击查看 免费下载 LLDAP 是一款轻量级 LDAP 实现,其数据默认存储在 SQLite 数据库中,适合中小规模部署;但当…

2026/10/13 16:37:33 阅读更多 →
ts-jest 自定义 AST Transformer 完全指南:astTransformers 配置、编写与实战

ts-jest 自定义 AST Transformer 完全指南:astTransformers 配置、编写与实战

测试开发工具 【免费下载链接】ts-jest A Jest transformer with source map support that lets you use Jest to test projects written in TypeScript. 项目地址: https://gitcode.com/gh_mirrors/ts/ts-jest 点击查看 免费下载 astTransformers 是 ts-jest 提供…

2026/10/10 16:51:43 阅读更多 →
90DaysOfDevOps Day 83:Grafana 数据可视化实战——基于 kube-prometheus 与 Prometheus Operator 部署监控面板

90DaysOfDevOps Day 83:Grafana 数据可视化实战——基于 kube-prometheus 与 Prometheus Operator 部署监控面板

文档/教程 【免费下载链接】90DaysOfDevOps This repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Pri…

2026/10/9 17:08:58 阅读更多 →

最新新闻

C语言停车场管理系统完整代码:从数据结构到计费持久化

C语言停车场管理系统完整代码:从数据结构到计费持久化

简介:这份资源是面向C语言初学者与课程设计学习者的停车场管理系统完整代码包,围绕车辆进出登记、车位分配、计时计费与数据记录等核心业务,帮助读者理解如何用C语言实现一套可运行的管理程序。压缩包共22个文件,约1.9MB&#xff…

2026/10/13 16:38:11 阅读更多 →
深度解读43PR/dotfiles的install.sh:AUR自动引导与符号链接智能安装器源码剖析

深度解读43PR/dotfiles的install.sh:AUR自动引导与符号链接智能安装器源码剖析

【免费下载链接】dotfiles Hyprland Quickshell Setup for Arch-based distributions 项目地址: https://gitcode.com/gh_mirrors/dotfiles3241/dotfiles 点击查看 免费下载 43PR/dotfiles 是一套面向 Arch 系发行版的 Hyprland Quickshell 桌面方案&#xff0c…

2026/10/13 16:38:11 阅读更多 →
微信小程序开发实战第2版源码解析与教学项目改造指南

微信小程序开发实战第2版源码解析与教学项目改造指南

简介:这份资源是人邮教育出版社《微信小程序开发实战(第2版)》的配套课本项目源代码,面向正在学习微信小程序开发的学生、K12课程教师以及希望系统练手的入门开发者。内容按教材章节组织,从个人信息、本地生活、婚礼邀…

2026/10/13 16:38:11 阅读更多 →
VB6基础教程与示例:老系统维护、编译与ActiveX控件实战

VB6基础教程与示例:老系统维护、编译与ActiveX控件实战

简介:面向VB6初学者的综合资料合集,整合基础教程、入门到精通、MSDN、入门例子、控件属性大全与函数速查,覆盖语法、窗体、控件到API调用的学习路径,另附Visual C 6.0入门提高讲义(全500页),可解…

2026/10/13 16:38:11 阅读更多 →
中国天气网Python爬虫实战:从入门到生产部署

中国天气网Python爬虫实战:从入门到生产部署

简介:本资源是一套面向Python初学者与数据实践者的网页爬虫实战项目,聚焦中国天气网(weather.com.cn)的结构化天气数据采集与解析,帮助用户掌握HTTP请求发送、HTML页面解析及多字段信息提取等核心爬虫技能。资源包共14…

2026/10/13 16:38:11 阅读更多 →
Rust性能优化实战:五个技巧榨干硬件性能

Rust性能优化实战:五个技巧榨干硬件性能

很多人聊 Rust 性能优化,第一反应是“这语言天生就快,还用得着调?”我最初也这么想,直到接手一个用 Rust 写的日志处理服务,在单机 8 核上处理一千万条日志要跑十几秒,调完之后压缩到两秒出头,C…

2026/10/13 16:37:10 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →