seajs模块化开发

  模块化开发,把整个文件分割成一个一个小文件。

使用方法

  使用方法特别简单,首先在官网中下载sea.js,然后在页面中引入。

index.html

// 1.路径
// 2.回调 (在js文件里定义的module.exports里定义的)
seajs.use('./js/part1.js',function (dom) {
console.log(dom);
let a = dom('#box');
console.log(a);
});

part1.js

// 1.在js文件里互相引用模块
// 2.暂时不用管
// 3.导出(告诉别的文件可以使用我的xxx东西)
define(function (require,exports,module) {
//这里是定义模块的地方
function fn(dom) {
return document.querySelector(dom);
}
module.exports = fn;
});

有一些需要注意的地方

define(function(require,exports,module){
//这里的require就把他当成一个关键字就可以了,不要去改变他
})

另外这一种判断使用哪个模块的

//条件 这种情况就不推荐使用下面这种方式了,下面的会把两种都编译还是什么的,推荐使用require.async
define(function(require,exports,module){
if(a){
require('hello');
}else{
require('word');
}
})

require.async

  方法用来在模块内部异步加载模块,并在加载完成后执行指定回调。callback 参数可选。

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

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 赋值是无效的,不能用来更改模块接口。

模拟他的原理

  步骤如下:

​   1.html文件: seajs.use(1,2)执行

​   2.插件: 模块插件 创建一个script标签 通过script把模块引入进来

​   3.插件: 定义一个全局函数define,用来获取模块里面所写的代码

​   4.模块:模块文件里 执行defined(传入一个函数)

​  5.插件: seajs.use插件 执行上一步的函数 并且传入三个参数

​   6.再执行模块里传入的参数过程中,改变了module

​   7.插件:插件里:执行回调函数,插件的第二个参数

  ​ 8.插件:删除掉上面加入的script标签

sea.js

let seajs = {};
seajs.use = function seajs(url,cb) {
let oScript = document.createElement('script');
let s = document.getElementsByTagName('script')[0];
oScript.src = url;
s.parentNode.insertBefore(oScript,s); /*function fn(dom) {
return document.querySelector(dom);
}*/ let require,
exports,
module = {};
window.define = function (fn) {
fn(require,exports,module);
cb(module.exports);
s.parentNode.removeChild(oScript);
};
}

index.html

seajs('./a.js',function(fn){
let a = fn('#box');
console.log(a);
})

a.js

define(function (require,exports,module) {
//这里是定义模块的地方
function fn(dom) {
return document.querySelector(dom);
}
module.exports = fn;
});

  上面的代码就是模拟了一下加载模块的原理,其实就是自己新建了一个script标签,将那个引入的模块添加到了当前页面当中,和JSONP差不多的原理,模块中的define函数自己执行,将里面的函数传递到sea.js插件中,然后再去做处理,sea.js将模块中的module.exports = 的东西提取出来,回调函数传递给index中,接受到了这个模块中的module.exports。

  其实我写的不是很清楚了,哈哈,可以用自己的方式去实现一下,我在这里写的这篇主要是对这两天学的一些东西做一下总结。

  当然,如果你能从中收获一些我会非常高兴的,如果看到这里感觉什么都没用可以去官网去查看,上面讲的非常清楚。sea.js官网

seajs的原理以及基本使用的更多相关文章

  1. seajs+spm之再研究

    好久没有用seajs了,之前对spm也只是一知半解,这些天再次拿起来研究.谈谈我的认识与理解. 声明:本文不适合对seajs完全不了解的同学阅读.对于想知道seajs来龙去脉以及spm相关的同学&qu ...

  2. seajs3.0.0源码分析记录

    自己边读变加了一些注释,理解了一下seajs3.0.0工作的流程.正则没有一个个去理解,插件模块也没看, 以后有时间了可以补充完整~ 事件系统中事件队列的获取&定义方法 var list = ...

  3. seaJS循环依赖的解决原理

    seajs模块的六个状态. var STATUS = {  'FETCHING': 1, // The module file is fetching now. 模块正在下载中  'FETCHED': ...

  4. seajs模块加载与执行原理小记

    本文仅讨论具名模块的情况,即通过spm打包出来的模块. 想起ID与路径统一原则,详见https://github.com/seajs/seajs/issues/930 今天又研究了下seajs源码,源 ...

  5. seajs原理解析

    一: 1.本文是基于seajs2.2.1编写的,之后版本应该大同小异 2.本文仅代表个人观点,如有理解错误,敬请指出,大家一起学习 二: 1.首先放一张我画的流程图 这是我理解的seajs的基本的所有 ...

  6. seajs和requirejs

    一.seajs 1. 使用seajs的一般步骤 a)在主页面引入sea.js b)写模块 c)在主页面使用模块 2.模块的写法 math.js define(function(require, exp ...

  7. angularjs + seajs构建Web Form前端(二)

    回顾 上一篇讲解了引入bootstrap构建一个简单的登录页面,如何让angularjs自动启动并绑定视图,操作过程当中如何使用ui-bootstrap,继而完成简单功能后如何引入seajs后如何使n ...

  8. seajs 源码解读

    之前面试时老问一个问题seajs 是怎么加载js 文件的 在网上找一些资料,觉得这个写的不错就转载了,记录一下,也学习一下 seajs 源码解读 seajs 简单介绍 seajs是前端应用模块化开发的 ...

  9. JS模块加载器加载原理是怎么样的?

    路人一: 原理一:id即路径 原则.通常我们的入口是这样的: require( [ 'a', 'b' ], callback ) .这里的 'a'.'b' 都是 ModuleId.通过 id 和路径的 ...

随机推荐

  1. 经典中的品味:第二章 C++基本的对象,类型和值(上)

    摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 自律,是以积极而主动的态度,去解决人生的痛苦~ 上一章,我们大谈了Hel ...

  2. linux服务器部署tomcat和Nginx

    项目需要,申请了三台测试机器,好在测试机里面光秃秃的什么都没有,我就可以好好的学习一把玩一把了!接下来以图文的形式讲一下我所碰到的坑以及小小的收获吧! 一.准备工作 首先你得有一台可以玩的linux服 ...

  3. shiro 获取请求头中的 rememberMe

    前言: 上一篇提到了, 将 sessionId 放到请求头中去, 那rememberMe是否也可以放到请求头中去呢. 其实不管是sessionId还是rememberMe, shiro都会默认往coo ...

  4. How Tomcat works — 一、怎样阅读源码

    在编程的道路上,通过阅读优秀的代码来提升自己是很好的办法.一直想阅读一些开源项目,可是没有合适的机会开始.最近做项目的时候用到了shiro,需要做集群的session共享,经过查找发现tomcat的s ...

  5. 正确重写hashcode hashcode与equals方法 集合元素如何判断是否相等 集合如何查看是否包含某个元素

    首先记住两句话 相等的两个对象,即equals(Object)方法判断两个对象相等,那么他们必须要有相同的hashcode hashcode相同的两个对象,他们可能相同,也可能不相同 简单地说可以这么 ...

  6. MySQL的GROUP_CONCAT函数

    先根据如下语句生成测试表并填充数据 CREATE TABLE z ( a INT, b INT); INSERT INTO Z SELECT 1,200; INSERT INTO Z SELECT 1 ...

  7. go基础系列:简介

    1.Go简介 Go语言是编译型.静态类型的类C的语言,并带有GC(垃圾收集器,garbage collection).这意味着什么? 另外,Go是一种非常严格的语言,它几乎总是要求我们"以标 ...

  8. UVC 驱动调用过程与驱动框架的简单分析

    内核:Linux-3.4.2 驱动:drivers\media\video\uvc\uvc_driver.c UVC 驱动整体调用流程: /* 打开设备描述符 */ 1. open: uvc_v4l2 ...

  9. 有哪些Java性能优化方法?

    面试官:"有性能优化经验没?"  应聘者:"有一点."   面试官:"那你们从哪些方面做了优化?"   应聘者:"sql优化.JV ...

  10. java实现无序数组结构

    一.数组的2种定义方式 数据类型 []  数组名称 = new 数据类型[数组长度]; 这里 [] 可以放在数组名称的前面,也可以放在数组名称的后面,一般放在名称的前面 数据类型 [] 数组名称 = ...