seajs的原理以及基本使用
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的原理以及基本使用的更多相关文章
- seajs+spm之再研究
好久没有用seajs了,之前对spm也只是一知半解,这些天再次拿起来研究.谈谈我的认识与理解. 声明:本文不适合对seajs完全不了解的同学阅读.对于想知道seajs来龙去脉以及spm相关的同学&qu ...
- seajs3.0.0源码分析记录
自己边读变加了一些注释,理解了一下seajs3.0.0工作的流程.正则没有一个个去理解,插件模块也没看, 以后有时间了可以补充完整~ 事件系统中事件队列的获取&定义方法 var list = ...
- seaJS循环依赖的解决原理
seajs模块的六个状态. var STATUS = { 'FETCHING': 1, // The module file is fetching now. 模块正在下载中 'FETCHED': ...
- seajs模块加载与执行原理小记
本文仅讨论具名模块的情况,即通过spm打包出来的模块. 想起ID与路径统一原则,详见https://github.com/seajs/seajs/issues/930 今天又研究了下seajs源码,源 ...
- seajs原理解析
一: 1.本文是基于seajs2.2.1编写的,之后版本应该大同小异 2.本文仅代表个人观点,如有理解错误,敬请指出,大家一起学习 二: 1.首先放一张我画的流程图 这是我理解的seajs的基本的所有 ...
- seajs和requirejs
一.seajs 1. 使用seajs的一般步骤 a)在主页面引入sea.js b)写模块 c)在主页面使用模块 2.模块的写法 math.js define(function(require, exp ...
- angularjs + seajs构建Web Form前端(二)
回顾 上一篇讲解了引入bootstrap构建一个简单的登录页面,如何让angularjs自动启动并绑定视图,操作过程当中如何使用ui-bootstrap,继而完成简单功能后如何引入seajs后如何使n ...
- seajs 源码解读
之前面试时老问一个问题seajs 是怎么加载js 文件的 在网上找一些资料,觉得这个写的不错就转载了,记录一下,也学习一下 seajs 源码解读 seajs 简单介绍 seajs是前端应用模块化开发的 ...
- JS模块加载器加载原理是怎么样的?
路人一: 原理一:id即路径 原则.通常我们的入口是这样的: require( [ 'a', 'b' ], callback ) .这里的 'a'.'b' 都是 ModuleId.通过 id 和路径的 ...
随机推荐
- MySQL(1)---索引
索引 什么是索引? 索引是帮助Mysql提高获取数据的数据结构,换一句话讲就是“排好序的快速查找的数据结构”. 一.索引的分类 MySQL主要的几种索引类型:1.普通索引.2.唯一索引.3.主键索引 ...
- 使用ANNdotNET进行情感分析
2018年10月的MSDN杂志上发表了由James McCaffrey撰写的文章“使用CNTK的情感分析” .在这篇博文中,我将向您介绍这篇非常好且写得很好的MSDN文章示例.我不打算重复MSDN文章 ...
- Spring Boot 系列(七)Swagger2-生成RESTful接口文档
Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参数和模型紧密集成到服 ...
- Webpack中publicPath设置
webpack中的path是当我们build的时候,输出项目打包文件的位置. webpack中的publicPath是我们打算放到web服务器下的目录,如果我们要放到网站的根目录下,那么就无需设置.如 ...
- synchronized和ReentrantLock的区别
synchronized和ReentrantLock的区别 synchronized是和if.else.for.while一样的关键字,ReentrantLock是类,这是二者的本质区别. 代写 既然 ...
- 二叉树的Python实现
树的定义与基本术语 树型结构是一类重要的非线性数据结构,其中以树和二叉树最为常用,是以分支关系定义的层次结构.树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构:在计算机领域中也有广泛 ...
- 结构型---组合模式(Composite Pattern)
组合模式的定义 组合模式允许你将对象组合成树形结构来表现”部分-整体“的层次结构,使得客户以一致的方式处理单个对象以及对象的组合. 组合模式实现的最关键的地方是——简单对象和复合对象必须实现相同的接口 ...
- C#程序实现软件开机自动启动的两种常用方法
C#/WPF/WinForm/.NET程序代码实现软件程序开机自动启动的两种常用方法函数的示例与实例带详细注释 方法一:将软件的快捷方式创建到计算机的自动启动目录下(不需要管理员权限) 1.必要引用 ...
- [android] 保存文件到SD卡
/****************2016年5月4日 更新*****************************/ 知乎:为什么很多Android应用要把文件写到/sdcard目录下而不是写到/d ...
- App测试流程及测试点(个人整理版)
1 APP测试基本流程 1.1流程图 1.2测试周期测试周期可按项目的开发周期来确定测试时间,一般测试时间为两三周(即15个工作日),根据项目情况以及版本质量可适当缩短或延长测试时间.正式测试前先向主 ...