关于requirejs的用法

ESP32锂电池电量检测实战:从引脚选择到低功耗优化(附完整电路图) 本文详细介绍了ESP32锂电池电量检测的实战方案,从ADC引脚选择到低功耗优化,提供完整的电路图和代码实现。通过MOS管智能开关和深度睡眠技术,显著降低静态功耗至0.5μA,提升设备续航能力。适合物联网开发者解决电量检测中的常见问题。 阅读详情

今天要分享的内容是requirejs

AMD 简介

前端开发在近一两年发展的非常快,JavaScript 作为主流的开发语言得到了前所未有的热捧。大量的前端框架出现了,这些框架都在尝试着解决一些前端开发中的共性问题,但是实现又不尽相同。在这个背景下,CommonJS 社区诞生了,为了让前端框架发展的更加成熟,CommonJS 鼓励开发人员一起在社区里为一些完成特定功能的框架制定规范。AMD(Asynchronous Module Definition)就是其中的一个规范。

RequireJS 简介

RequireJS 是一个非常小巧的 JavaScript 模块载入框架,是 AMD 规范最好的实现者之一。最新版本的 RequireJS 压缩后只有 14K,堪称非常轻量。它还同时可以和其他的框架协同工作,使用 RequireJS 必将使您的前端代码质量得以提升。 目前最新版本的 RequireJS 1.0.8 在 IE 6+、Firefox 2+、Safari 3.2+、Chrome 3+、Opera 10+ 上都工作的很好。

案例一: 加载 JavaScript 文件

 <script src="./js/require.js"></script> 
      <script> 
     require(["./js/a.js", "./js/b.js"], function() { 
              myFunctionA(); 
              myFunctionB(); 
         }); 
      </script>

      这种方式,用来加载以前的js文件,就像本地引用一样,但是没有解决全局变量的问题

案例二: 页面加载后执行 JavaScript



require(["domReady!", "./js/a.js", "./js/b.js"], function() {
myFunctionA();
myFunctionB();
});

这个例子domReady!,解决了,有需要保证页面加载以后执行脚本时,RequireJS 提供了一个独立的 domReady 模块,需要去 RequireJS 官方网站下载这个模块

AMD模块的写法

require.js加载的模块,采用AMD规范。也就是说,模块必须按照AMD的规定来写。

具体来说,就是模块必须采用特定的define()函数来定义。如果一个模块不依赖其他模块,那么可以直接定义在define()函数之中。

假定现在有一个math.js文件,它定义了一个math模块。那么,math.js就要这样写:

// math.js
define(function (){
    var add = function (x,y){
      return x+y;
    };
    return {
      add: add
    };
});

加载方法如下:

// main.js
  require(['math'], function (math){
    alert(math.add(1,1));
  });

加载非规范的模块

理论上,require.js加载的模块,必须是按照AMD规范、用define()函数定义的模块。但是实际上,虽然已经有一部分流行的函数库(比如jQuery)符合AMD规范,更多的库并不符合。那么,require.js是否能够加载非规范的模块呢?

回答是可以的。

这样的模块在用require()加载之前,要先用require.config()方法,定义它们的一些特征。

举例来说,underscore和backbone这两个库,都没有采用AMD规范编写。如果要加载它们的话,必须先定义它们的特征。

require.config({
    shim: {

      'underscore':{
        exports: '_'
      },
      'backbone': {
        deps: ['underscore', 'jquery'],
        exports: 'Backbone'
      }
    }
});

require.config()接受一个配置对象,这个对象除了有前面说过的paths属性之外,还有一个shim属性,专门用来配置不兼容的模块。具体来说,每个模块要定义(1)exports值(输出的变量名),表明这个模块外部调用时的名称;(2)deps数组,表明该模块的依赖性。

比如,jQuery的插件可以这样定义:

shim: {
    'jquery.scroll': {
      deps: ['jquery'],
      exports: 'jQuery.fn.scroll'
    }
}

require.js插件

require.js还提供一系列插件,实现一些特定的功能。

domready插件,可以让回调函数在页面DOM结构加载完成后再运行。

require([‘domready!’], function (doc){
    // called once the DOM is ready
  });
text和image插件,则是允许require.js加载文本和图片文件。

define([
    ‘text!review.txt’,
    ‘image!cat.jpg’
    ],

    function(review,cat){
      console.log(review);
      document.body.appendChild(cat);
    }
 );
类似的插件还有json和mdown,用于加载json文件和markdown文件。

在html中引入requirejs

在HTML中,添加这样的 < script> 标签:

<script src="/path/to/require.js" data-main="/path/to/app/config.js"></script>

通常使用requirejs的话,我们只需要导入requirejs即可,不需要显式导入其它的js库,因为这个工作会交给requirejs来做。

属性 data-main 是告诉requirejs:你下载完以后,马上去载入真正的入口文件。它一般用来对requirejs进行配置,并且载入真正的程序模块。

依赖一个不使用requirejs方式的库

前面的代码是理想的情况,即依赖的js文件,里面用了 define(…) 这样的方式来组织代码的。如果没用这种方式,会出现什么情况?

比如这个 hello.js :

function hello() {
alert("hello, world~");
}

它就按最普通的方式定义了一个函数,我们能在requirejs里使用它吗?

先看下面不能正确工作的代码:

requirejs.config({
baseUrl: '/public/js',
paths: {
  hello: 'hello'
}
});

requirejs(['hello'], function(hello) {
hello();
});

这段代码会报错,提示:

Uncaught TypeError: undefined is not a function
原因是最后调用 hello() 的时候,这个 hello 是个 undefined . 这说明,虽然我们依赖了一个js库(它会被载入),但requirejs无法从中拿到代表它的对象注入进来供我们使用。

在这种情况下,我们要使用 shim ,将某个依赖中的某个全局变量暴露给requirejs,当作这个模块本身的引用。

requirejs.config({
baseUrl: '/public/js',
paths: {
  hello: 'hello'
},
shim: {
  hello: { exports: 'hello' }
}
});

requirejs(['hello'], function(hello) {
hello();
});

再运行就正常了。

上面代码 exports: ‘hello’ 中的 hello ,是我们在 hello.js 中定义的 hello 函数。当我们使用 function hello() {} 的方式定义一个函数的时候,它就是全局可用的。如果我们选择了把它 export 给requirejs,那当我们的代码依赖于 hello 模块的时候,就可以拿到这个 hello 函数的引用了。

所以: exports 可以把某个非requirejs方式的代码中的某一个全局变量暴露出去,当作该模块以引用。

无主的与有主的模块

我遇到了一个折腾我不少时间的问题:为什么我只能使用 jquery 来依赖jquery, 而不能用其它的名字?

比如下面这段代码:

requirejs.config({
baseUrl: '/public/js',
paths: {
  myjquery: 'lib/jquery/jquery'
}
});

requirejs(['myjquery'], function(jq) {
alert(jq);
});

它会提示我:

jq is undefined
但我仅仅改个名字:

requirejs.config({
baseUrl: '/public/js',
paths: {
  jquery: 'lib/jquery/jquery'
}
});

requirejs(['jquery'], function(jq) {
alert(jq);
});

就一切正常了,能打印出 jq 相应的对象了。

为什么?我始终没搞清楚问题在哪儿。

有主的模块

经常研究,发现原来在jquery中已经定义了:

define('jquery', [], function() { ... });

它这里的 define 跟我们前面看到的 app.js 不同,在于它多了第一个参数 ‘jquery’ ,表示给当前这个模块起了名字 jquery ,它已经是有主的了,只能属于 jquery .

所以当我们使用另一个名字:

myjquery: ‘lib/jquery/jquery’
去引用这个库的时候,它会发现,在 jquery.js 里声明的模块名 jquery 与我自己使用的模块名 myjquery 冲突,便不会把它赋给 myjquery ,所以 myjquery 的值是 undefined 。

所以我们在使用一个第三方的时候,一定要注意它是否声明了一个确定的模块名。

无主的模块

如果我们不指明模块名,就像这样:

define([...], function() {
...
});

那么它就是无主的模块。我们可以在 requirejs.config 里,使用任意一个模块名来引用它。这样的话,就让我们的命名非常自由,大部分的模块就是无主的。

为什么有的有主,有的无主

可以看到,无主的模块使用起来非常自由,为什么某些库(jquery, underscore)要把自己声明为有主的呢?

按某些说法,这么做是出于性能的考虑。因为像 jquery , underscore 这样的基础库,经常被其它的库依赖。如果声明为无主的,那么其它的库很可能起不同的模块名,这样当我们使用它们时,就可能会多次载入jquery/underscore。

而把它们声明为有主的,那么所有的模块只能使用同一个名字引用它们,这样系统就只会载入它们一次。

强行该名称的方法

对于有主的模块,我们还有一种方式可以挖墙角:不把它们当作满足requirejs规范的模块,而当作普通js库,然后在 shim 中导出它们定义的全局变量。

requirejs.config({
baseUrl: '/public/js',
paths: {
  myjquery: 'lib/jquery/jquery'
},
shim: {
  myjquery: { exports: 'jQuery' }
}
});

requirejs(['myjquery'], function(jq) {
alert(jq);
});

这样通过暴露 jQuery 这个全局变量给 myjquery ,我们就能正常的使用它了。

不过我们完全没有必要这么挖墙角,因为对于我们来说,似乎没有任何好处。

# 总结

关于这块部分,我是看项目里有用到这个前端的组件,而自己没有实际开发过,因此
对这个部分,理解不深刻,也就是现在能看懂的阶段了,主要是参考了好几篇关于
requirejs的文章总结的

还有就是,这个部分其实一直就有了解,因此也不是完全不懂的去学

反正是先入手学一下是很有必要的,

哎,最近发现那个requirejs的中文网,不知道怎么滴就访问不了,好像只能去看英文文档了

【高级强化学习:算法、优化与泛化】第13章 扩散模型策略优化(Diffusion Policy Optimization) \quad$ 计算均值 $\mu_t = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}} \tilde{\epsilon} \right)$.$\quad$ 组合得分估计: $\tilde{\epsilon} = \epsilon_{\text{unc}} + w \cdot (\epsilon_{\text{con}} - \epsilon_{\text{unc}})$. 阅读详情

相关推荐

高通CamX架构解析(一)——核心组件与数据流设计

本文深入解析高通CamX相机架构的核心组件与数据流设计。CamX采用模块化与数据驱动思想,将复杂处理流程拆解为Node、Pipeline、Session等独立组件,并通过CHI层实现硬件接口与定制功能的分离。文章详细阐述了从请求下发到结果返回的完整数据流,并提供了实用的调试与分析指南,帮助开发者理解这一高效、灵活的现代相机架构。

k8l9m0n的博客 235

requirejs的简单使用

AMD是比较著名的前端模块化规范之一,全称是Asynchronous Module Definition,即异步模块加载机制,完整描述了模块的定义,依赖关系,引用关系以及加载机制。异步强调的是,在加载模块以及模块所依赖的其它模块时,都采用异步加载的方式,避免模块加载阻塞了网页的渲染进度。RequireJS是一个非常小巧的JavaScript模块载入框架,是AMD规范最好的实现者之一。 1、引入re...

zhouhao620的博客 621

手把手教你用DLP4500投影仪玩转结构光3D扫描(附固件烧录与序列设置避坑指南)

本文详细解析了如何使用DLP4500投影仪搭建结构光3D扫描系统,涵盖硬件组装、固件烧录、图案生成与优化等全流程。重点解决了固件烧录失败、图像格式错误等常见问题,并提供了实用的避坑指南和进阶技巧,帮助读者快速掌握DLP4500在3D扫描中的应用。

weixin_42662293的博客 301

nodejs之jsdom插件,运行浏览器环境

【代码】nodejs之jsdom插件,运行浏览器环境。

老衲爱洗头的博客 4199

总结所有的池化(Pooling)方法

为什么池化? 池化(Pooling)层和卷积层、全连接层一样,都是卷积神经网络的组成部分。 卷积神经网络中的卷积层会将卷积Filter应用于输入图像,以便创建特征映射来总结输入中这些特征的存在。 卷积层被证明是非常有效的,在深层模型中叠加卷积层可以让接近输入的层学习低层特征(如线条),在模型中更深(高)的层用于学习高阶或者更抽象的特征,如形状或特定对象。 卷积层特征映射输入的一个局限性是它们只能精确记录特征在输入层的位置。这意味着在输入图像中特征位置的小幅移动将导致不同的特征映射。这可以随着重新裁剪

大脸猫的博客 1万+

双系统引导修复:GRUB消失后恢复Windows与Ubuntu启动菜单

在UEFI引导架构下,操作系统启动依赖于EFI系统分区(ESP)中存储的引导加载程序。当多个系统共存时,引导管理器负责识别并加载不同操作系统的引导文件。然而,Windows更新或系统调整时常会重置UEFI启动顺序,导致GRUB引导菜单消失,直接进入Windows。这一问题的技术价值在于理解UEFI启动流程与多系统引导管理机制,掌握ESP分区结构与引导文件修复方法。常见的应用场景包括双系统安装后的引导修复、系统更新后的启动项丢失以及磁盘分区调整导致的引导故障。本文针对**GRUB引导菜单消失**和**UEFI

weixin_29895109的博客 295

requirejs插件-domReady插件

RequireJS加载模块速度很快,很有可能在页面DOM Ready之前脚本已经加载完毕。需要与DOM交互的工作应等待DOM Ready。现代的浏览器通过DOMContentLoaded事件来知会。 但是,不是所有的浏览器都支持DOMContentLoaded。domReady模块实现了一个跨浏览器的方法来判定何时DOM已经ready。下载并在你的项目中如此用它: require(['do...

张营的技术博客 2716

使用JAVA 的 POI 库 将DOC文件转为DOCX文件

java使用POI库,将doc文件转为docx文件

qq_45808266的博客 5708

前端模块化——RequireJS

为什么模块很重要?因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块。但是,这样做有一个前提,那就是大家必须以同样的方式编写模块。目前,通行的Javascript模块规范共有两种:CommonJS和AMD。AMD是"Asynchronous Module Definition"的缩写,即"异步模块定义"。它采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这...

sleepwalker_1992的专栏 3245

基于jeecgboot3.9.0的项目管理——项目工作台(二)

基于jeecgboot3.9.0的项目管理——项目工作台(二)

宁波阿成的博客 206

ABAP Cloud 开发教程的文章目录

本教程涵盖 ABAP 云端 Client 处理、多租户架构、ABAP Cloud开发、动态编程优化、SQL语法改进等技术主题。最新版本1.0.0(更新至2025-12-12),包含197篇文章,重点文章包括《ABAP Client Handling与隔离机制》《ABAP Platform 2021泛型编程》《SAP BTP ABAP多租户应用开发》等,为开发者提供从基础到进阶的实战指南。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1810

使用 jsdom 模块在 Node.js 中模拟 DOM 环境

在这个例子中,我们首先引入了 `jsdom` 模块,并从中导入 `JSDOM` 类。在这个例子中,我们使用 `querySelector` 方法选择了第一个 `<p>` 元素,并输出了其文本内容。`jsdom` 是一个用于在 Node.js 中模拟 DOM 环境的库,它可以让你在 Node.js 中使用类似于浏览器中的 DOM API。// 输出 "Hello world"通过使用 `jsdom` 模块,我们可以在 Node.js 中模拟浏览器环境,从而使我们能够使用 DOM API 进行操作。

初学者的专栏 1851

Docker-Nvidia(NVIDIA Container Toolkit)

安装NVIDIA Container Toolkit工具,支持docker使用GPU。

周陽讀書 3821

requireJS的基本用法

引言    目前项目中的前端架构采用的是RequireJS+AngularJS,小编在工作之余对这个前端框架比较感兴趣,在开始的时候对这个框架不是很懂,因为里面有很多平台自己封装的东西,所以在理解起来不是很容易,经过这一段时间在项目中的运用有了一定的理解,下面先来总结总结一下其中的一个技术点——RequireJS的基本用法。    基本介绍     RequireJS

Jack 架构师之路 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

requirejs基本用法

简要介绍了requirejs的基本使用

qq_38652603的博客 825

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

requireJS用法

一份超详细的requireJS用法 转载于http://www.php.cn/js-tutorial-392533.html requireJS 可以很轻易的将一个项目中的JavaScript代码分割成若干个模块(module)。并且requireJS推荐一个模块就是一个文件,所以,你将获得一些零碎的具有互相依赖关系的JS文件。模块化的好处也浅显意见,那就是大大增强代码的可读性、易维护性、可...

skyline小菜的博客 3662

requireJS常用用法

为什么使用requirejs?1、异步加载文件; 2、模块化开发:一个文件即是一个模块,减少全局变量。相关方法1、define()定义模块define('moduleName可选', [依赖的模块], function ( 依赖的模块别名) { return 返回值; });2、require()加载模块require([加载模块], function (加载模块别名) { 具体实

css_styles的博客 4361

RequireJS 2.0 API之用法

最近学习RequireJS,没什么中文资料,只能看官方网站。 对于我这样英文不好的程序猿,很痛苦。看完顺便翻译下吧,免得日后自己还有需要,又要看英文原文。 官方原文地址:http://requirejs.org/docs/api.html#usage 下一篇: RequireJS 2.0 API之配置项 -----------------------------------------

技进乎道 5423

requirejs的简要用法

以前看过一些关于requirejs的介绍和使用,脑子太笨,一直没明白,总结一下其中的简单用法,希望能对大家有用: requirejs的使用包括三个方法: 1、require.config——初始化定义,定义别名,路径, 示例代码: require.config({ paths:{ "jquery":"http://cdn.bootcss.com/jquery/3.0.0-al

a909197213的博客 526

requirejs 用法

requirejs 用法

m0_47165403的博客 1013

RequireJS用法解析

概述 requirejs 的相关说明: RequireJS是一个非常小巧的JavaScript模块载入框架,是AMD规范最好的实现者之一。最新版本的RequireJS压缩后只有14K,堪称非常轻量。它还同时可以和其他的框架协同工作,使用RequireJS可以提升前端代码质量。 主要特点: 异步加载模块 按依赖顺序加载 模块依赖前置 define 和 require 在整个require中,主要...

Aimee的博客 2101

RequireJS的入门,基础用法

最近学了requireJS模块化开发,所以现在赶紧过来写个博客记录一下,便于下次查阅。 RequireJS主要就是用来加载模块的,有了他,可以使我们的应用程序在开发中简洁明了,不会显得乱糟糟的。 首先啦,我们肯定是要有一份RequireJS的啦,那么就去官网下载一份吧。下载:RequireJS官网下载将下载回来的RequireJS放进我们的项目的中,哪个都行,新建的libs文件夹也行,只要放在目

LFW的博客 972

requirejs的用法

requirejs的用法 2014年11月6日 8099次浏览 之前我的一片文章介绍过requirejs,具体地址是:http://www.haorooms.com/post/RequireJS_mkh_jz ,今天看到阮一峰博客上面对于requirejs的介绍比较通俗易懂,今天转载一下! 一、为什么要用require.js? 最早的时候,所有Javascript代码都

guoyuhua_123456的博客 293

RequireJS - 用法

它采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。

行到水穷处,坐看云起时。 1万+
上一篇: 汤姆大叔的深入理解JavaScript读后感四(完结篇)
下一篇: 关于Java中的ThreadLocal用法
Scofield-
博客等级 码龄14年 12粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值