seajs笔记

小小坤      2022-02-13     369

关键词:

Amd和Cmd的区别有哪些?

1. 对于依赖的模块,AMD 是提前执行,CMD 是延迟执行。不过 RequireJS 从 2.0 开始,也改成可以延迟执行(根据写法不同,处理方式不同)。CMD 推崇 as lazy as possible.

2. CMD 推崇依赖就近,AMD 推崇依赖前置。看代码:

// CMD
define(function(require, exports, module) {
var a = require(‘./a‘)
a.doSomething()
// 此处略去 100 行
var b = require(‘./b‘) // 依赖可以就近书写
b.doSomething()
// ...
})

// AMD 默认推荐的是
define([‘./a‘, ‘./b‘], function(a, b) { // 依赖必须一开始就写好
a.doSomething()
// 此处略去 100 行
b.doSomething()
...
})

虽然 AMD 也支持 CMD 的写法,同时还支持将 require 作为依赖项传递,但 RequireJS 的作者默认是最喜欢上面的写法,也是官方文档里默认的模块定义写法。


3. AMD 的 API 默认是一个当多个用,CMD 的 API 严格区分,推崇职责单一。比如 AMD 里,require 分全局 require 和局部 require,都叫 require。CMD 里,没有全局 require,而是根据模块系统的完备性,提供 seajs.use 来实现模块系统的加载启动。CMD 里,每个 API 都简单纯粹


4. 还有一些细节差异,具体看这个规范的定义就好,就不多说了。

 seajs使用

1.seajs.config--用来对 Sea.js 进行配置。

seajs.config({
      // 设置路径,方便跨目录调用
      paths: {
        ‘domes‘: ‘http://127.0.0.1:8020/seajs-master‘
      },
    
      // 设置别名,方便调用
      alias: {
        ‘dom‘: ‘domes/dome/dom‘
      },
       // 变量配置
      vars: {
           ‘locale‘: ‘zh-cn‘
      }
});
seajs.use(‘dom‘,function(d){
    //=> 加载的是 http://127.0.0.1:8020/seajs-master/dome/dom.js
    d.d();
});

别名起到了变量的作用,‘dom‘代表‘domes/dome/dom‘,‘domes‘代表‘http://127.0.0.1:8020/seajs-master‘ 则‘domes/dome/dom‘解析为http://127.0.0.1:8020/seajs-master/dome/dom.js。

变量配置

define(function(require, exports, module){
    // 获取模块 dom_1 的接口    
    var som=require(‘./dom/{locale}.js‘);
    //加载的地址http://127.0.0.1:8020/seajs-master/dome/dom/zh-cn.js
    som.s();
    exports.dom_2=function(){
        console.log("dom_2");
    };
});

{locale}就代表‘zh-cn‘

2.seajs.use

// 加载一个模块
seajs.use(‘./a‘);

// 加载一个模块,在加载完成时,执行回调
seajs.use(‘./a‘, function(a) {
  a.doSomething();
});

// 加载多个模块,在加载完成时,执行回调
seajs.use([‘./a‘, ‘./b‘], function(a, b) {
  a.doSomething();
  b.doSomething();
});

3.define--用来定义模块

define(id?, deps?, factory)
也可以接受两个以上参数。字符串 id 表示模块标识,数组 deps 是模块依赖。比如:
define(‘hello‘, [‘jquery‘], function(require, exports, module) {

});
id 和 deps 参数可以省略。省略时,可以通过构建工具自动生成。
注意:带 id 和 deps 参数的 define 用法不属于 CMD 规范,而属于 Modules/Transport 规范。

define(function(require, exports, module) {
  
  //exports 用来在模块内部对外提供接口。
   
  // 对外提供 foo 属性
  exports.foo = ‘bar‘;

  // 对外提供 doSomething 方法
  exports.doSomething = function() {};
  //注意:require, exports, module这三个回掉函数参数切勿改变。
});

4.require--用来获取指定模块的接口

//注意,require 只接受字符串直接量作为参数,详细约定请阅读
//require.async 用来在模块内部异步加载一个或多个模块。
define(function(require) {

  // 获取模块 a 的接口
  var a = require(‘./a‘);

  // 调用模块 a 的方法
  a.doSomething();
  
  // 异步加载多个模块,在加载完成时,执行回调
  require.async([‘./c‘, ‘./d‘], function(c, d) {
    c.doSomething();
    d.doSomething();
  });
  
  
});

5.exports--用来在模块内部对外提供接口

define(function(require, exports, module) {
  
  //exports 用来在模块内部对外提供接口。
   
  // 对外提供 foo 属性
  exports.foo = ‘bar‘;

  // 对外提供 doSomething 方法
  exports.doSomething = function() {};
  //注意:require, exports, module这三个回掉函数参数切勿改变。
});

6.module.exports--用来在模块内部对外提供接口

define(function(require, exports, module) {

  // 对外提供接口
  module.exports = {
    name: ‘a‘,
    doSomething: function() {};
  };

});

与 exports 类似,用来在模块内部对外提供接口。

7.require.resolve(id)--用来获取指定模块的绝对路径

define(function(require, exports, module){
    // 获取模块 dom_1 的接口  
    var som=require(‘./dom_2‘);
    console.log(require.resolve(‘./dom_2‘),‘用来获取指定模块的绝对路径‘);
   
});

这个可以用来检测你加载模块时候,路径是否正确。

参考链接

作者:玉伯
链接:https://www.zhihu.com/question/20351507/answer/14859415
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

参考:https://github.com/seajs/seajs/issues/242

参考:https://github.com/amdjs/amdjs-api/wiki/AMD

参考:https://github.com/seajs/seajs/issues/266

参考:http://yslove.net/seajs/

总结

amd与cmd是一种规范,而目前两大加载器(seajs,requirejs)应用的规范是不同的。cmd推荐的是依赖就近原则,用到就加载。而amd则是依赖前置。只有加载才可以使用。相对于来说cmd比较符合使用习惯。

 
























angularjs1笔记-(20)-模块化加载机制seajs

SeaJS是一个遵循CMD规范的JavaScript模块加载框架,可以实现JavaScript的模块化开发及加载机制。与jQuery等JavaScript框架不同,SeaJS不会扩展封装语言特性,而只是实现JavaScript的模块化及按模块加载。SeaJS的主要目的是令JavaScript开发模... 查看详情

cmd规范学习笔记——基于seajs实现

CMD(CommonModuleDefinition):该规范明确了模块的书写格式和基本交互规则。通常一个模块就是一个JS文件。通过define关键字来定义模块,最基本的格式为:define(factory);//这里的define是一个全局函数,factory可以是函数或者合法的值。一... 查看详情

seajs学习笔记(基础)

一:前端开发中常遇到的问题    如果我们的网站简单的时候,结构上也许不会有什么问题,但是如果我们的网站越来复杂的时候(比如功能越来越多的时候,加入项目的人越来越多的时候),我们书写的代码就会... 查看详情

javascript模块化开发笔记

1.Seajs库  解决开发中的冲突依赖等问题,提供代码可维护性。  SeaJS是由玉伯开发的一个遵循CommonJS规范的模块加载框架,可用来轻松愉悦地加载任意JavaScript模块和css模块样式。 SeaJS就两个核心:模块定义和模... 查看详情

sea.js学习笔记

Sea.js入门http://www.cnblogs.com/doseoer/p/4007752.html前端模块化开发的价值随着互联网的飞速发展,前端开发越来越复杂。本文将从实际项目中遇到的问题出发,讲述模块化能解决哪些问题,以及如何使用Sea.js进行前端的模块化开发。htt... 查看详情

快速上手seajs——简单易用seajs

快速上手seajs——简单易用Seajs 原文  http://www.cnblogs.com/xjchenhao/p/4021775.html主题 SeaJS简易手册 http://yslove.net/seajs/ 背景一个网站必然会涉及很多功能,tab选项卡、slide轮播图、pop弹出层、美化alert、p 查看详情

seajs基本开发原则

SeaJS基本开发原则在讨论SeaJS的具体使用前,先介绍一下SeaJS的模块化理念和开发原则。使用SeaJS开发JavaScript的基本原则就是:一切皆为模块。引入SeaJS后,编写JavaScript代码就变成了编写一个又一个模块,SeaJS中模块的概念有点类... 查看详情

seajs模块路径解析简单总结

seajs模块路径解析最近在试着用seajs+grunt改造现有项目,遇到的最大的问题就是seajs命名与调用,简单总结一下。模块调用seajs中调用模块有两种方式,seajs.use(ID)、require(ID)。ID命名完整绝对路径例如"http://example.com/test/js/jquery/jquery... 查看详情

模块化开发---seajs入门学习

SeaJS是一个基于CMD模块定义规范实现一个模块系统加载器 [CMD规范](https://github.com/cmdjs/specification/blob/master/draft/module.md)9、seaJs启动函数的回调函数官网:http://seajs.org/docs/github:https://github.com/seajs/seajs如何选择一个技术产品栈 查看详情

简单的使用seajs

 什么是SeajsSeajs是一个加载器 http://yslove.net/seajs/遵循CMD规范模块化开发,依赖的自动加载、配置的简洁清晰。兼容性Chrome3+Firefox2+Safari3.2+Opera10+IE5.5+基本应用导入Seajs库去官网下载最新的seajs文件, http://seajs.org/docs/#dow... 查看详情

seajs--模块启动(代码片段)

首先引入seajs,然后使用seajs.use(“./a",[callback])seajs还可以并发加载多个模块:////并发加载模块a和模块b,并在都加载完成时,执行指定回调seajs.use(['./a','./b'],function(a,b)a.init();b.init(););seajs. 查看详情

seajs使用方法

 必须执行seajs.use()时,才能自动执行预加载项<scriptsrc="/UILib/sea.js"></script><scriptsrc="/UILib/seajs-preload.js"></script><%--<scriptsrc="/UILib/seajs-css.js"></script> 查看详情

cmd和seajs

...里的玉伯提出。就像AMD有个requireJS,CMD有个浏览器的实现SeaJS,SeaJS和requireJS一样,都是javascript的模块化解决方案。本文将详细介绍CMD和seaJS CMD  在Sea.js中,所有JavaScript模块都遵循CMD(CommonM 查看详情

cmd和seajs

...里的玉伯提出。就像AMD有个requireJS,CMD有个浏览器的实现SeaJS,SeaJS和requireJS一样,都是javascript的模块化解决方案。本文将详细介绍CMD和seaJS CMD  在Sea.js中,所有JavaScript模块都遵循CMD(CommonM 查看详情

grunt与seajs结合应用

9.seajs构建的问题01.png和02.jpg 10.seajs与grunt如何结合开发。两个插件:grunt-cmd-transportgrunt-cmd-contact,去grunt官网上查并下载03.png将代码暂存到.build的文件中,执行任务后,则自动提取出依赖。然后再将这些依赖文件进行打包或者... 查看详情

seajs源码阅读

乘着周日有点时间,阅读一下玉伯大神的源码。seajs的源码写得真的很好,很是佩服,工整美观不愧是大神,造福百姓。 说起seajs不得不说,AMD和CMD的区别。 CMD 推崇依赖就近,AMD 推崇依赖前置。 事实上我对他... 查看详情

利用gulp来合并seajs的项目

gulp-seajs-transport和gulp-seajs-concat这两个gulp插件gulp-seajs-transpor这个插件这样是给每个js模块标示模块名称 gulp-seajs-concat这个插件是从入口文件开始合并所以引入的js http://www.cnblogs.com/lyzg/p/5581961.html 查看详情

模块化之seajs

  Seajs此文来自予舍驿站提供简单、极致的模块化开发体验非官方文档,整理来自己官方文档的文字与实例,方便速查。seajs.configObjectaliasObject别名配置,配置之后可在模块中使用require调用 require(‘jquery‘);seajs.config({alias:{... 查看详情