seajs学些(5)----模块的加载启动

用grunt构建seajs项目 step by step介绍了使用纯grunt构建seajs项目的步骤 阅读详情

seajs学些(5)----模块的加载启动

Sea.js 是一个模块加载器,模块加载器需要实现两个基本功能:
  1. 实现模块定义规范,这是模块系统的基础。
  2. 模块系统的启动与运行。

模块定义规范的实现

这就是 define,require,exports,module 的实现。具体实现细节,有兴趣的可以看 Sea.js 的源码:seajs/src。可以按照Gruntfile.js 中声明的合并顺序阅读,核心是module.js 文件。

define 等方法的具体使用,请阅读:CMD 模块定义规范

模块系统的启动

有了 define 等模块定义规范的实现,我们可以开发出很多模块。但光有一堆模块不管用,我们还得让它们能跑起来。

首先就是启动问题。比如在 Node 中,启动很简单:

$ node main.js

这就是启动。

再举一个例子,操作系统的启动:大家都知道的,按一下开机键就好。

在 Sea.js 里,要启动模块系统很简单:

<script src="path/to/sea.js"></script>
<script>
  seajs.use('./main');
</script>

seajs.use Function

用来在页面中加载模块。

seajs.use seajs.use(id, callback?)

通过 use 方法,可以在页面中加载任意模块:

// 加载模块 main,并在加载完成时,执行指定回调
seajs.use('./main', function(main) {
  main.init();
});

use 方法还可以一次加载多个模块:

// // 并发加载模块 a 和模块 b,并在都加载完成时,执行指定回调
seajs.use(['./a', './b'], function(a, b) {
  a.init();
  b.init();
});

callback 参数可选。当只加载一个模块,且不需要 callback 时,可以用 data-main 属性来简化:

<script src="path/to/sea.js" data-main="./main"></script>

上面的代码等价于:

<script src="path/to/sea.js"></script>
<script>
  seajs.use('./main');
</script>

与 DOM ready 的关系

注意:seajs.use 与 DOM ready 事件没有任何关系。如果某些操作要确保在DOM ready 后执行,需要使用 jquery 等类库来保证,比如:

seajs.use(['jquery', './main'], function($, main) {
  $(document).ready(function() {
    main.init();
  });
});

sea.js 的引入

在调用 seajs.use 之前,需要先引入 sea.js 文件。引入方式有两种:

用 script 标签引入

直接在页面中用 script 标签引入:

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

这是最简单直接的方式,在绝大部分情况下推荐用这种方式引入 sea.js 文件。

用异步代码引入

为了追求极致性能,有时希望加载器本身也能异步加载。可以通过下面的方式来实现 sea.js 自身的异步加载:

<script>
// 其他代码

// sea.js 的异步载入代码:
;(function(m, o, d, u, l, a, r) {
  if(m[o]) return
  function f(n) { return function() { r.push(n, arguments); return a } }
  m[o] = a = { args: (r = []), config: f(1), use: f(2), on: f(3) }
  m.define = f(0)
  u = d.createElement("script")
  u.id = o + "node"
  u.async = true
  u.src = "path/to/sea.js"
  l = d.getElementsByTagName("head")[0]
  l.appendChild(u)
})(window, "seajs", document);

// 立刻就可以调用 seajs 的方法了:
seajs.config({
  alias: {
    'jquery': 'path/to/jquery-1.9.1.min.js' 
  }
});

seajs.use('./main', function(main) {
 // do some cool things.
});
</script>

注意:这种方式下,在 sea.js 加载完成前,只能调用 define、seajs.config、seajs.use 和seajs.on 这 4 个方法。

最佳实践

  1. seajs.use 理论上只用于加载启动,不应该出现在 define 中的模块代码里。在模块代码里需要异步加载其他模块时,可以使用require.async 方法。

  2. 引入 sea.js 时,可以把 sea.js 与其他文件打包在一起,可提前合并好,或利用 combo 服务动态合并。无论哪一种方式,为了让sea.js 内部能快速获取到自身路径,推荐手动加上 id 属性:

    <script src="path/to/sea.js" id="seajsnode"></script>
    

    加上 seajsnode 值,可以让 sea.js 直接获取到自身路径,而不需要通过其他机制去自动获取。这对性能和稳定性会有一定提升,推荐默认都加上。

小结

seajs.use 是模块加载器必备的一个接口。在 seajs 上,还有用于配置的 config 方法、方便调试的cache、log 等接口,这些会在接下来的文档中详细阐述。

seajs模块之间依赖的加载以及模块的执行 本文介绍的是seajs模块之间依赖的加载以及模块的执行,下面话不多说直接来看详细的介绍。 入口方法 每个程序都有个入口方法,类似于c的main函数,seajs也不例外。系列一的demo在首页使用了seajs.use() ,这便是入口方法。入口方法可以接受2个参数,第一个参数为模块名称,第二个为回调函数。入口方法定义了一个新的模块,这个新定义的模块依赖入参提供的模块。然后设置新模块的回调函数,用以在loaded状态之后调用。该回调函数主要是执行所有依赖模块的工厂函数,最后在执行入口方法提供的回调。 // Public API // 入口地址 seajs.use = function(ids, 立即下载

相关推荐

SeaJS入门教程系列之使用SeaJS(二)

下载及安装 要在项目中使用SeaJS,你所有需要做的准备工作就是下载sea.js然后放到你项目的某个位置。SeaJS项目目前托管在GitHub上,主页为 https://github.com/seajs/seajs/ 。可以到其git库的build目录下下载sea.js(已压缩)或sea-debug.js(未压缩)。下载完成后放到项目的相应位置,然后在页面中通过[removed]标签引入,你就可以使用SeaJS了。 SeaJS基本开发原则 在讨论SeaJS的具体使用前,先介绍一下SeaJS的模块化理念和开发原则。使用SeaJS开发JavaScript的基本原则就是:一切皆为模块。引入SeaJS后

seajs模块的加载启动

模块的加载启动 Sea.js 是一个模块加载器,模块加载器需要实现两个基本功能: 实现模块定义规范,这是模块系统的基础。模块系统的启动与运行。 模块定义规范的实现 这就是 define,require,exports,module 的实现。具体实现细节,有兴趣的可以看 Sea.js 的源码:seajs/src。可以按照 Gruntfile.js 中声明的合并顺序阅读,核

qq_19647103的博客 302

ASIC--DFT可测性设计工程师

DFT是什么? DFT是design for test(可测性设计)的缩写,就是在芯片设计过程中,加入可测性逻辑。有的公司把该职位归到前端设计,有的归到中端实现。 DFT职位大多分布于规模较大的数字IC设计公司里,因为大公司对芯片品质要求高,而且规模越大,芯片越贵,DFT就越复杂越重要。DFT主要是通过在芯片中加入可测性逻辑,等芯片制造出来,在ATE(AutomaticTestEquipmen...

TroubleMaker 2万+

一步步学会使用SeaJS 2.0

本文分为以下8步,熟悉之后就能够熟练使用SeaJS,从此之后你的生活会变得更加轻松愉悦! 1、SeaJS是什么? 2、下载并检阅SeaJS 3、建立工程和各种目录 4、引入SeaJS库 5、编写自己的代码 6、引入自己的代码 7、压缩合并 8、总结展望 --------------------------------------------------

C860_zy的专栏 3723

细胞膜电学特性的分数阶微积分建模

分数阶微积分在细胞膜电学特性建模中的应用主要体现在对细胞膜的电容行为和神经元放电活动的更精确描述上。

冰河世纪20的博客 623

RDMA学习笔记-IB五层网络协议和报文结构

Reference InfiniBand Architecture Specification Volume 1, Release 1.3 文章目录IBA 网络协议分层1.链路层1.1 LRH1.2 ICRC1.3 VCRC2.网络层(GRH)3.传输层3.1 BTH3.2 extended transport header4. 报文结构4.1 send request4.2 RDMA Write request4.3 RDMA Read request4.4 ACK4.5 Atomic operatio

u014114310的博客 9472

Sea.js 使用总结(3)

模版引擎是渲染页面 模版加载器是书写js

yuelinana的博客 537

SAP采购订单行项目增强实战:用BADI ME_GUI_PO_CUST添加自定义字段(避坑指南)

本文详细解析了如何通过BADI ME_GUI_PO_CUST在SAP采购订单行项目中添加自定义字段,包括技术架构理解、字段扩展步骤、自定义函数组创建及BADI实现。文章特别强调了避开官方文档未提及的陷阱,如字段映射限制和屏幕显示问题,并提供了高级优化技巧和性能建议。

weixin_30402343的博客 595

Seajs使用实例入门介绍

参考:https://www.jianshu.com/p/ebdf2233e3fe 1. seajs页面引入 index.html 思路:首先引入sea.js文件,然后通过seajs.use加载main.js文件 <!doctype html> <html> <head> <meta charset="utf-8"> &lt...

angryshan的博客 1075

YOLO11实战优化:暗光环境检测 | 引入Retinex增强模块与YOLO11联合训练,解决夜间/低照度场景抓拍痛点

本文探讨了暗光环境下目标检测的技术挑战与解决方案。研究发现,传统CNN模型在低照度条件下性能显著下降,主要由于光子数减少导致信噪比降低、目标特征被噪声淹没。针对这一问题,文章提出将可微分光照增强模块嵌入YOLO检测器的技术路线,重点分析了Retinexformer+YOLO11联合方案的优势。 文章对比了YOLO系列模型在暗光场景的表现,指出YOLO11凭借其C3k2模块、无锚检测头和多任务统一骨干网络,在低对比度图像特征提取方面优于前代产品。同时详细介绍了Retinexformer的理论基础和技术创新,包

2601_95807009的博客 206

hwasan / asan详细分析踩内存之一:Use after free

UAF漏洞全称为use after free ,即利用已经被free掉的堆块被再次利用,该漏洞的存在是因为程序编写者在free堆块部分没有将该堆块的fd指针改为0,进而导致该堆块可以被申请回来,3.内存块被free后,其对应的指针没有被设置为 NULL,但是在它下一次使用之前,有代码对这块内存进行了修改,那么当程序再次使用这块内存时,就很有可能会出现奇怪的问题。2.堆块free后,对应指针没有被设置为NULL,即还可以调用会该堆块,当我们申请一个比该堆块小于等于的size时。

1398

seajs--模块启动

首先引入seajs,然后使用seajs.use(“./a",[callback]) seajs还可以并发加载多个模块: // // 并发加载模块 a 和模块 b,并在都加载完成时,执行指定回调 seajs.use(['./a', './b'], function(a, b) { a.init(); b.init();}); seajs.use与DOM ready事件没有任何关系,若

越努力,越幸运~~ 1794

QNX系统中的密码哈希格式——数据安全深度分析

综上所述,QNX系统中的Shadowed密码哈希格式提供了一种有效的数据安全机制,能够保护用户密码的安全性。通过将用户密码的哈希值存储在系统文件中,并结合哈希算法和盐值的使用,可以有效地防止明文密码泄露和密码破解。密码哈希是一种常用的安全技术,用于将用户密码转换为不可逆的哈希值,以保护用户的敏感信息。在QNX操作系统中,存在一种称为Shadowed密码哈希格式的机制,用于存储用户密码的安全散列值。当用户登录系统时,系统会将用户输入的密码与保存的哈希值进行比对,以验证密码的正确性。在上述代码中,首先使用。

UneDatabase的博客 253

(一)页面中引入seajs以及模块的加载和启动

本文转载自官网上"模块的加载启动#260"这篇文章,seajs官网上的文档都是中文的,大部分写的也很清楚,看看就能上手了。这里之所以转载官网文档,一个是因为自己在学习阶段,自己手动敲一遍印象会更深,一个是因为GitHub访问比较慢,所以放在自己的博客,以后看着方便点。

aty 3224

荒岛逃生游戏

正负表示逃生方向(正表示向右逃生,负表示向左逃生),绝对值表示战斗力,越左边的数字表示里左边港口越近,逃生方向相同的人永远不会发生决斗。- 如果左逃生者的战斗力大于右逃生者,则左逃生者获胜,减少其战斗力,并将右逃生者出栈。- 处理完所有输入后,统计仍在右逃生者栈和左逃生者栈中的战斗力,即可得到成功逃生的人数。- 如果左逃生者的战斗力小于右逃生者,则右逃生者获胜,减少其战斗力,左逃生者出局。- 向左逃生:从右逃生者栈中取出元素,与当前逃生者进行决斗。- 继续进行决斗,直到没有右逃生者或左逃生者的战斗力用尽。

面试高手的博客 2102

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【学习】前端模块化——SeaJS和RequireJS

写在前面之前没学过nodeJS,底子不好,对AMD和CMD的实现没法理解,现在nodeJS也算是步入门槛,再回过身好好研究一下这个“模块化加载器”。SeaJS与RequireJS最大的区别 一言以蔽之:执行模块的机制大不一样 RequireJS 是执行的 AMD 规范, 所有的依赖模块都是先执行,当然 RequireJS 从 2.0 开始,也改成可以延迟执行(根据写法不同,处理方式不同)。这点和

思诚^_^ 1956

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SeaJS之use函数

有了define等模块定义规范的实现,我们可以开发出很多模块,但是光有一些模块不管用,我们还得让他跑起来,因而我们可以使用到seajs进行启动模块系统; seajs如何启动模块系统? 首先在我们需要使用seajs的包下导入sea.js文件,然后直接在在使用的地方使用seajs.use()进行模块系统的启动; seajs.use 用来在页面中加载模块。通过 use 方法,可以在页面中加载任意模块。 语法:seajs.use seajs.use(id, callback?) // 加载模块 main,并在加

z19950712的博客 1323

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

前端模块化-CMD规范与SeaJS

本文介绍了CMD规范及其在SeaJS中的实现,包括模块定义、引用、标识符以及与其他规范的区别,并探讨了SeaJS的关键原理和实现。

逍遥的前端笔记 854

JS模块化规范CMD之SeaJS

1. 在接触规范之前,我们用模块化来封装代码大多为如下: ;(function (形参模块名, 依赖项, 依赖项) { // 通过 形参模块名 修改模块 window.模块名 = 形参模块名 })(window.模块名 || {}, 依赖项, 依赖项) 分号是什么作用? 答:为了防止前面的代码没有添加分号造成语法解析错误,也可能会是 "!",...

187

前端技术 - SeaJS学习

SeaJS 是一个模块加载器,模块加载器需要实现两个基本功能: 实现模块定义规范,这是模块系统的基础。 模块系统的启动与运行。 define参数 在 CMD 规范中,一个模块就是一个文件。代码的书写格式如下: define(factory) factory 为对象、字符串时,表示模块的接口就是该对象、字符串。 fact...

aomiano55778的博客 197

转: seajs手册与文档之--模块定义

模块定义 define id dependencies factory exports require require.async require.resolve require.load require.constructor module module.id module.dependencies module.expo...

dayanwu2842的博客 152

seajs模块之间互相引用导致加载失败的问题

2018年8月10日14:37:39 问题来源 在使用seajs

万少博-FE 1339
上一篇: seajs学习(4)----require 书写约定
下一篇: seajs学习(6)----配置
jsonW
博客等级 码龄12年 3粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值