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. 剑指offer【03】- 从尾到头打印链表(4种实现方法)

    题目:从尾到头打印链表 考点:链表 题目描述:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 法一:ArrayList头插法 /** * public class ListNode ...

  2. php内核之HashTable

    Zend 把与 HashTable 有关的 API 分成了好几类以便于我们查找,这些 API 的返回值大多都是常量SUCCESS 或者 FAILURE. 初始化 HashTable 下面在介绍函数原型 ...

  3. ionic3 npm install cordova error syscall rename

    突然出现cordova 不是内部或外部命令,也不是可运行的程序或批处理文件. 可是之前cordova安装后一直用的好好的啊,后来尝试重新安装cordova 出现这个错误.也尝试重新安装了最新版本的no ...

  4. 支付宝PC端单笔支付同步回调session失效问题

    一次调用支付宝PC场景下单笔支付之后同步回调遇到的session失效问题记录 问题描述: 调用支付宝接口:alipay.trade.page.pay,该接口请求参数中有两个返回地址需要设置,retur ...

  5. CentOS docker 常用命令

    yum install docker 安装服务 systemctl start docker.service 启动服务 systemctl enable docker.service 开机启动服务 d ...

  6. SSL证书(HTTPS)背后的加密算法

    SSL证书(HTTPS)背后的加密算法 之前我们介绍SSL工作原理了解到当你在浏览器的地址栏上输入https开头的网址后,浏览器和服务器之间会在接下来的几百毫秒内进行大量的通信.这些复杂的步骤的第一步 ...

  7. 适用于WebApi的SQL注入过滤器

    开发工具:Visual Studio 2017 C#版本:C#7.1 最有效的防止SQL注入的方式是调用数据库时使用参数化查询. 但是如果是接手一个旧的WebApi项目,不想改繁多的数据库访问层的代码 ...

  8. Redis常用命令与配置

    常用命令 测试客户端与服务器是否正常连接:ping   ( 补:返回pong表示成功 ) 正则获取键:keys pattern 判断一个键是否存在:exists key 删除一个键:del key 获 ...

  9. Tesseract 引擎翻译

    Tesseract 引擎翻译 Category: 图像识别 Last Edited: Sep 17, 2018 10:29 AM Tags: tesseract,字符识别,翻译 1.英文原文(中文翻译 ...

  10. eclipse使用svn

    主干(trunk).分支(branch ).标记(tag) 用法示例 + 图解   以svn为例,git的master相当于trunk,dev分支相当于branches --------------- ...