`
zccst
  • 浏览: 3322566 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

seajs基础学习

阅读更多
作者:zccst

学习几天seajs了,发现seajs就是一个模块管理工具,唉。

既然自立门户,肯定就会有一些规则,原来CMD也是国人提出来的,赞一个。

现在就来学习吧,今天是第二次看seajs,对于第一次

1,define();写法
define(function(require, exports, module){
});


2,require书写规则
(1)拼写完整,正确
(2)不要修改。不能在任何作用域中给require重新赋值。
(3)require必须是直接量字符串。不能require一个变量;字符串拼接等;字符串函数
为什么 require 要有书写约定
在开发时,Sea.js 是如何知道一个模块的具体依赖呢?
a.js
define(function(require, exports) {
  var b = require('./b');
  var c = require('./c');
});
Sea.js 在运行 define 时,接受 factory 参数,可以通过 factory.toString() 拿到源码,再通过正则匹配 require 的方式来得到依赖信息。依赖信息是一个数组,比如上面 a.js 的依赖数组是:['./b', './c']
由于 Sea.js 的这个实现原理,使得书写 CMD 模块代码时,必须遵守 require 书写约定,否则获取不到依赖数组,Sea.js 也就无法正确运行。



3,exports
exports 是一个对象,用来向外提供模块接口。
define(function(require, exports) {
  // 对外提供 foo 属性
  exports.foo = 'bar';
  // 对外提供 doSomething 方法
  exports.doSomething = function() {};
});
除了给 exports 对象增加成员,还可以使用 return 直接向外提供接口。
define(function(require) {
  // 通过 return 直接提供接口
  return {
    foo: 'bar',
    doSomething: function() {}
  };
});
如果 return 语句是模块中的唯一代码,还可简化为:
define({
  foo: 'bar',
  doSomething: function() {}
});
上面这种格式特别适合定义 JSONP 模块。

特别注意:下面这种写法是错误的!
define(function(require, exports) {
  // 错误用法!!!
  exports = {
    foo: 'bar',
    doSomething: function() {}
  };
});
正确的写法是用 return 或者给 module.exports 赋值:
define(function(require, exports, module) {
  // 正确写法
  module.exports = {
    foo: 'bar',
    doSomething: function() {}
  };
});
提示:exports 仅仅是 module.exports 的一个引用。在 factory 内部给 exports 重新赋值时,并不会改变 module.exports 的值。因此给 exports 赋值是无效的,不能用来更改模块接口。


4,module
module 是一个对象,上面存储了与当前模块相关联的一些属性和方法。
(1)module.id  String  模块的唯一标识。
define('id', [], function(require, exports, module) {
  // 模块代码
});
上面代码中,define 的第一个参数就是模块标识。

(2)module.uri  String 根据模块系统的路径解析规则得到的模块绝对路径。
define(function(require, exports, module) {
  console.log(module.uri);
  // ==> http://example.com/path/to/this/file.js
});
一般情况下(没有在 define 中手写 id 参数时),module.id 的值就是 module.uri,两者完全相同。

(3)module.dependencies   Array  dependencies 是一个数组,表示当前模块的依赖。

(4)module.exports   Object  当前模块对外提供的接口。
传给 factory 构造方法的 exports 参数是 module.exports 对象的一个引用。只通过 exports 参数来提供接口,有时无法满足开发者的所有需求。 比如当模块的接口是某个类的实例时,需要通过 module.exports 来实现:
define(function(require, exports, module) {
  // exports 是 module.exports 的一个引用
  console.log(module.exports === exports); // true
  // 重新给 module.exports 赋值
  module.exports = new SomeClass();
  // exports 不再等于 module.exports
  console.log(module.exports === exports); // false
});
注意:对 module.exports 的赋值需要同步执行,不能放在回调函数里。下面这样是不行的:
// x.js
define(function(require, exports, module) {
  // 错误用法
  setTimeout(function() {
    module.exports = { a: "hello" };
  }, 0);
});
在 y.js 里有调用到上面的 x.js:
// y.js
define(function(require, exports, module) {
  var x = require('./x');
  // 无法立刻得到模块 x 的属性 a
  console.log(x.a); // undefined
});


自己的测试:
把工具文件util.js写成
define(function(require, exports) {
  exports.each = function (arr) {
    // 实现代码
  };
  exports.log = function (str) {
    // 实现代码
  };
});
通过 exports 就可以向外提供接口。这样,dialog.js 的代码变成
define(function(require, exports) {
  var util = require('./util.js');
  //util返回的一个对象,可以使用util.each和util.log
  //不过util到底是一个对象还是函数,取决于你在util.js的exports中如何暴露接口的
  exports.init = function() {
    // 实现代码
  };
});
关键部分到了!我们通过 require('./util.js') 就可以拿到 util.js 中通过 exports 暴露的接口。这里的 require 可以认为是 Sea.js 给 JavaScript 语言增加的一个 语法关键字,通过 require 可以获取其他模块提供的接口。

好好琢磨以上代码,我相信你已经看到了 Sea.js 带来的两大好处:
(1)通过 exports 暴露接口。这意味着不需要命名空间了,更不需要全局变量。这是一种彻底的命名冲突解决方案。
(2)通过 require 引入依赖。这可以让依赖内置,开发者只需关心当前模块的依赖,其他事情 Sea.js 都会自动处理好。对模块开发者来说,这是一种很好的 关注度分离,能让程序员更多地享受编码的乐趣。




5,动态依赖 require.async
if (todayIsWeekend)
  require("play");
else
  require("work");
从静态角度,这个模块同事需要play和work两个模块,所以加载器会把这两个模块文件都下载下来。这种情况下,推荐使用require.async进行条件加载。

require.async  用来在模块内部异步加载一个或多个模块。

define(function(require) {
  // 异步加载一个模块,在加载完成时,执行回调
  require.async('./b', function(b) {
    b.doSomething();
  });
  // 异步加载多个模块,在加载完成时,执行回调
  require.async(['./c', './d'], function(c, d) {
    c.doSomething();
    d.doSomething();
  });
});
注意:require 是同步往下执行,require.async 则是异步回调执行。require.async 一般用来加载可延迟异步加载的模块。


小结

这就是 CMD 模块定义规范的所有内容。经常使用的 API 只有 define, require, require.async, exports, module.exports 这五个。其他 API 有个印象就好,在需要时再来查文档,不用刻意去记。

与 RequireJS 的 AMD 规范相比,CMD 规范尽量保持简单,并与 CommonJS 和 Node.js 的 Modules 规范保持了很大的兼容性。通过 CMD 规范书写的模块,可以很容易在 Node.js 中运行,后续会介绍。


如果您觉得本文的内容对您的学习有所帮助,您可以微信:
分享到:
评论

相关推荐

    seajs入门完整案例,适合新手学习

    3. **Sea.js配置**:Seajs 可以通过配置文件(通常为 `seajs.config.js`)来定制加载行为,例如设置基础 URL、定义别名、配置加载策略等,这使得项目配置更为灵活。 4. **模块加载**:使用 `seajs.use` 方法可以...

    seajs官方小实例

    Seajs 源码结构清晰,易于阅读,开发者可以通过阅读源码学习到模块加载、URL 解析、异步加载等技术。 此外,Seajs 还提供了诸如 `seajs.data`、`seajs.event` 等工具方法,方便进行插件开发和事件监听。比如,你...

    seaJS框架简介和完整例子

    SeaJS 是一个轻量级的前端模块加载器,它的出现是为了改善JavaScript在浏览器环境中的组织和加载方式。本文将深入探讨SeaJS的...通过学习和应用SeaJS,开发者可以在浏览器环境中享受到类似于服务器端的模块化开发体验。

    SeaJS与RequireJS区别

    **SeaJS 和 RequireJS 是两种广泛使用的 JavaScript 模块加载器和依赖管理工具,它们的主要目的是解决 JavaScript 在浏览器端的...通过学习和实践 SeaJS&Require JS 示例,可以深入理解这两种技术并掌握它们的用法。

    seajs学习教程之基础篇

    Seajs是一个Web模块加载框架,追求简单、自然的代码书写和组织方式,Sea.js 遵循 CMD 规范,模块化JS代码。...这篇文章为seajs深入学习的第一篇,主要介绍的基础性的内容,感兴趣的朋友们可以参考学习。

    seajs入门小实例

    Seajs 是一个轻量级的前端模块加载器,它的出现是...不过随着Webpack、Rollup等现代构建工具的普及,Seajs 在大型复杂项目中的使用逐渐减少,但在理解和学习前端模块化思想的过程中,Seajs 仍是一个值得学习的案例。

    seajs simple demo

    Seajs 是一个轻量级的前端模块加载器,它的出现是为了应对JavaScript开发中日益复杂的依赖管理和文件组织...通过学习这个demo,你可以更好地理解Seajs的使用方法,并将其应用到自己的项目中,提升代码质量与维护性。

    SeaJS(Javascript模块加载框架)v0.9.1免费版

    - `脚本之家.url`和`服务器软件.url`:这两个文件看起来是链接快捷方式,可能指向了与SeaJS相关的教程、论坛或者下载页面,方便用户进一步学习和获取支持。 - `__MACOSX`:这是一个隐藏的目录,通常出现在从Mac系统...

    SeaJS(Javascript 模块加载框架)源代码

    4. **可配置性**:SeaJS 具有高度可配置性,开发者可以通过配置文件或 API 修改模块路径、基础 URL、模块映射等设置,以适应不同项目需求。 5. **社区支持**:SeaJS 社区活跃,有大量第三方插件和工具,以及详细的...

    seajs_source:SeaJS原始阅读笔记

    - `seajs.config`: 用于配置SeaJS的行为,如设置基础URL、映射模块路径、添加别名等。 - `define`: 定义模块,接受三个参数:模块ID(可选)、依赖列表和模块工厂。模块工厂可以是函数或对象,用于生成模块的输出...

    web前端零基础系统学习路线分享.docx

    Web前端零基础系统学习路线是构建前端开发技能体系的关键步骤,涵盖了从基础知识到高级技术的广泛领域。以下是对各个阶段的详细解读: **第一阶段:HTML+CSS** 在这个阶段,你需要掌握HTML的基础语法,用于创建网页...

    Seajs源码详解分析

    Sea.js 通过 script 标签加载到页面中,用户可以通过 seajs.config 配置模块加载的基本参数,例如设置基础路径 base,模块默认的加载路径,或者是定义别名 alias,方便在项目中引用模块。 在模块定义方面,Sea.js ...

    大前端学习流程

    大前端学习流程是一条完整的学习路线,可以帮助开发者从基础知识到高级特征,从HTML5到移动Web开发,再到HTTP服务和AJAX编程,最后到面向对象进阶和封装框架。该学习流程共分为九个阶段,每个阶段都涵盖了特定的知识...

    前端学习路线.doc

    学习AMD和CMD规范,以及相关的工具如RequireJS和SeaJS,可以帮助你实现模块化开发。基于组件的思想,可以提高代码复用和维护性。 **第七阶段:主流的流行框架** Web开发工作流的工具如Git版本控制、Yeoman脚手架、...

    seajs中最常用的7个功能、配置示例

    Sea.js 是一个使用简单、支持...此外,文中提及的JavaScript相关专题也是提高前端开发技能的好资源,包含扩展技巧、字符串操作、数学运算、json操作、错误调试以及数据结构与算法等多方面的内容,值得深入学习和研究。

    angularseajs

    因此,将SeaJS引入,可以在不改变AngularJS原有模块结构的基础上,进一步优化代码加载流程。 标签“源码”表明可能涉及到对这两款工具的源代码进行分析或定制。熟悉源码可以帮助开发者更深入地理解它们的工作原理,...

    关于seaJsDemo

    这个名为 "Sea.js Demo" 的项目旨在展示 Sea.js 如何在实际应用中工作,帮助开发者理解和学习如何使用 Sea.js 进行模块化开发。 **Sea.js 基础知识** 1. **模块加载机制**: Sea.js 提供了一种按需加载的方式,...

    web前端年度工作总结.docx

    Seajs等工具可以帮助实现模块化,尽管在实际工作中可能需要逐步引入。 9. **CSS的重要性**:虽然看似基础,但CSS对于前端界面的呈现至关重要,它可以极大地影响页面的布局和视觉效果。 通过以上内容,我们可以看到...

    sea.js教程

    **Sea.js 深度解析与实践教程** Sea.js 是一个用于浏览器端模块加载的工具,它遵循 CommonJS 规范,旨在简化 JavaScript 的模块化开发。...通过深入学习和实践,你将能够熟练掌握其用法,提升前端开发效率。

Global site tag (gtag.js) - Google Analytics