模块化开发之sea.js实现原理总结
seajs官网说:seajs是一个模块加载器,所以学习它并不难。
在我的理解就是:本来我们是需要手动创建 script标签 引入 js文件的,但用seajs后,它就自动帮我们完成这些工作。
这里只说实现原理,具体使用请看seajs官网:http://seajs.org/docs/
下面总结一下:
1. sea.js 是怎样解决 模块加载(这里说的模块其实就是js文件加载),
2. sea.js 是怎样解决 模块依赖
3. sea.js 是怎样解决 命名冲突
1.模块加载
其实,原理很简单,和手动引入js文件是一样的。
就是当调用有加载功能的函数 如 seajs.use 、 require 、require.async 时,
其内部代码会创建一个script标签,把src设置成你要引入的js文件,然后append到DOM文档中进行加载,
当加载完毕后,再把这个script标签移除掉,所以当我们审查元素时看不到有那个<script>标签,
但因为文件已经引入了,即使把这个script移除也不会影响代码使用.
我们可以用360卫士限制网速的功能,把网速降低,然后引入jq,是可以看到它就是这样处理的
加载完毕后,sea.js会把这个script标签移除:
总的一句 : 就是利用 script 标签进行模块加载
2.模块依赖
上面的问题清楚了,其实这个依赖也很简单啦,也就是 加载 顺序的问题。
例如 a.js 依赖于 b.js, 那在sea.js内部代码中,就先加载b.js然后再加载a.js,这样就可以解决依赖问题了。
3.命名冲突
解决了上面的两个问题,就剩下依赖接口的问题了, 就是模块的依赖是搞定了,但是sea.js是用define( fn )函数来定义模块的,里面的变量都是局部的,
得给外面一个接口调用才行啊。
so, exports对象就出场啦, 当你使用sea.js定义一个模块的时候,你可以把你的 对外函数接口 都放在exports对象上, 如:
define(function (require, exports, module){ var arr = [12,3,4,5,56]; var method = function (){ //code... } exports.arr = arr; //对外接口 exports.method = method; //对外接口 })
当别一个文件要依赖此文件时, 调用 require( url )时,返回值就是这个exports对象,所以就解决了接口的问题。
同时也很好的解决了命名冲突的问题,就算几个同事都用一样的名字,也不会有问题。
因为这里返回的exports就相当于一个命名空间了。
相关文章
- 浅谈 js中parseInt函数的解析
- JS框架_(Progress.js)圆形动画进度条
- JS框架_(JQuery.js)动画效果鼠标跟随
- baguetteBox.js响应式画廊插件(纯JS)
- js获取当前时间戳加14天的时间戳
- JS中的call()和apply()方法
- [Node.js] Mock an API for Local Development in React with Mirage JS
- [Node.js] Load balancing a Http server
- [Node.js] Using npm link to use node modules that are "in progress"
- 微信QQ的二维码登录原理js代码解析
- 在JavaScript中使用json.js:访问JSON编码的某个值
- [Node.js] process.nextTick for converting sync to async
- [Functional Programming 101] Crocks.js -- when to use map and when to use chain?
- 如何用js给老婆每天发情话?
- 如何使用 multiparty 工具库在 Node.js 应用里解析 multipart form-data 格式的请求
- Atitit sleep原理 node.js sleep解决方案 timer
- Atitit.提升软件Web应用程序 app性能的方法原理 h5 js java c# php python android .net
- Atitit. 数据约束 校验 原理理论与 架构设计 理念模式java php c#.net js javascript mysql oracle
- three.js(JS 三维模型库)介绍和入门
- 【nodejs原理&源码赏析(4)】深度剖析cluster模块源码与node.js多进程(上)
- babel配置项目目录支持转换es6语法,引入非项目目录js后,引入Js转换无效
- js解析json,js转换json成map,获取map的key,value
- 前端必备技能知识:JS导出Blob流文件为Excel表格、Vue.js使用Blob的方式实现excel表格的下载(流文件下载)