13年在部门做了一个简单的分享seajs,温故一下。
js模块化
我们看一下问题
1,当你的网站开发越来越复杂的时候,会经常遇到这些问题吗?
比如说冲突,比如说性能,比如说依赖
这些问题用模块化开发都可以解决。
那么我们先看一下这些问题怎么产生的。
多人开发。
如:问题1,A:写的js,common.js
有:
function tab(){}
function drag(){}
function tips(){}
使用的时候页面引用common.js
1,B在页面中也写了function tab(){}
这时候页面中的tab()就会覆盖common.js里面的tab();产生冲突
2,B如果引入一个写好的插件,和你的common.js的tab()有冲突,为了不把插件改的比较乱,让A来改common.js就更加杯具了。
我们为了降低冲突,可以加命名空间,但是这时又不能无法避免冲突.,因为有太多工程师,可能有两个人同时用同一个命名空间。并且名称使用的时候还需要特别长。
问题2,新的页面只需要tab(),那么引入common.js(里面有10几个方法)浪费很多资源
那么我们可以把每个方法拆分一下,如 tab.js,drag.js,tips.js
按需要来引入js
那么要引入多个,如果说没有这么多js没有相互依赖的话还可以,如果有依赖的问题,,顺序不能改变
有依赖关系的话,
问题3,
你写的test.js直接 test()用
你的同事
拿到test.js,直接用很高兴。//出问题了,
然后去看看文件发现要依赖另个js,
你忘记这个需要依赖a.js
那么在调用a.js
//没有问题了
过一段时段如果说产品经理又要加不同的需求,可能还要依赖另一个文件,依赖b.js
则每个页面都要加个b.js
过一段时间这个时候产品经理又要砍掉一些功能。
没有用的js就要拿到。所以要去掉a.js,,
去掉后出问题了
检查代码发现test2.js依赖a.js。。所以又要加上a.js。
因为有依赖的问题,加上产品经理的需求的改动让我们大多的时间都在调试改BUG。那么
加班就在所难免
这个时候我们就要想到用模块化来管理我们的代码
js模块化
一个适合web端的模块加载器
解决刚才出现的问题,提升代码的可维护性
模块的概念:
是做什么的呢,也就是解决这些问题的
分享的是一个现成的库。先看看他是怎么来使用的。
为什么我们要来选择seajs呢,还有很多其他的模块化库的。
1,他是中文的,学习起来方便。
2,适合中国国情,并且他有很多网站已经在使用了。
概念,为了提高性能我们把一个方法放到一个js文件里面,然后按需的加载
这些文件,比如说把common.js拆分一下,但是拆分以后不用模块化库的话,
会出现一种依赖的问题,
那么我们用模块化来解决这些问题。
3,seajs如何解决?如何使用
㈠引入seajs库,
㈡如何变成模块?define
㈢如果调用模块?exports,seajs.use
㈣如何依赖模块?require
模块化的角色更像后勤,我们要开发的组件就是将军,模块化只是会多人开发服务的。
4,深入学习seajs
㈠define
㈡require//异步
㈢seajs.use//写入多个模块,
㈣seajs.config alias,preload,debug
//改根目录,
插件,把不是模块化的文件改成模块化的文件
构建工具,可以利用构建压缩打包合并等
http://seajs.org/docs/#docs
下面是个简单的例子
test.html
<html> <head> <meta charset="utf-8" /> <title></title> </head> <script type="text/javascript" src="dist/sea.js"></script> <script> //seajs.use()页面去调用模块,第一个参数:模块的地址, //第二个参数是地址加载成功后的回调函数。 //回调的参数,相当于就是模块中的exports seajs.use("./js/test1.js",function(ex){//还可以写多个模块 //alert(1); ex.tab();//很好的避免了命名冲突 }); tab();//B同事 function tab(){ alert(456); } //seajs的默认根目录 </script> <body> </body> </html>
test1.js
//A同事 define(function(require,exports,module){ //规定好的三个参数不能变,尽量不要修改,或者赋值。 //exports : 对外的接口 //require : 依赖的接口 //require("./test2.js");//test依赖于test2文件... //如果地址是一个模块的花,那么require返回值就是模块中的exports function tab(){ //alert(123); alert(require("./test2.js").a);//依赖test2 } exports.tab = tab; });
test2.js
//var a = 10; define(function(require,exports,module){ var a = 1000; exports.a = a; });
下面我们用一个例子来说明seajs的使用。webqq的一些功能:
ABC代表技术开发人员,加一个产品经理:
<html> <head> <meta charset="utf-8" /> <title>webqq</title> <style> #div1{width:200px; height:200px; background: red; position: relative; display: none;} #div2{width:30px; height: 30px; background: yellow; position: absolute; right: 0; bottom: 0; } #div3{ width: 100px; height: 100px; background: red; position: absolute; right: 0; top:0; cursor:pointer;} </style> <script type="text/javascript" src="dist/sea.js"></script> <script> //A seajs.use("./js/main.js"); </script> </head> <body> <input type="button" value="点击" id="input1" /> <div id="div1"> <div id="div2"></div> </div> <div id="div3"></div> </body> </html>
main.js
//A define(function(require,exports,module){ var oInput = document.getElementById("input1"); var oDiv1 = document.getElementById("div1"); var oDiv2 = document.getElementById("div2"); var oDiv3 = document.getElementById("div3"); require("./drag.js").drag(oDiv3); oInput.onclick = function(){ oDiv1.style.display = "block"; require("./scale.js").scale(oDiv1,oDiv2);//同步的,全部加载好 //require.async("./scale.js",function(ex){ // ex.scale(Div1,oDiv2); //});//异步,不用等待 }; });
drag.js
//B 拖拽 define(function(require,exports,module){ function drag(obj){ var disX = 0; var disY = 0; obj.onmousedown = function(ev){ var ev = ev || window.event; disX = ev.clientX - obj.offsetLeft; disY = ev.clientY - obj.offsetTop; document.onmousemove = function(ev){ var ev = ev || window.event; //var L = require("./range.js").range(ev.clientX - disX, document.documentElement.clientWidth - obj.offsetWidth,0); //var T = require("./range.js").range(ev.clientY - disY, document.documentElement.clientHeight - obj.offsetHeight,0); var L = ev.clientX - disX; var T = ev.clientY - disY; obj.style.left = L + "px"; obj.style.top = T + "px"; }; document.onmouseup = function(){ document.onmousemove = null; document.onmouseup = null; }; }; } exports.drag = drag; });
scale.js
//C 拖拽改变层大小 define(function(require,exports,module){ function scale(obj1,obj2){ var disX = 0; var disY = 0; var disW = 0; var disH = 0; obj2.onmousedown = function(ev){ var ev = ev || window.event; disX = ev.clientX; disY = ev.clientY; disW = obj1.offsetWidth; disH = obj1.offsetHeight; document.onmousemove = function(ev){ var ev = ev || window.event; //var W = require("./range.js").range(ev.clientX - disX + disW, 500, 50); //var H = require("./range.js").range(ev.clientY - disY + disH ,500, 50); //obj1.style.width = W + "px"; //obj1.style.height = H +"px"; obj1.style.width = ev.clientX - disX + disW + 'px'; obj1.style.height = ev.clientY - disY + disH + 'px'; }; document.onmouseup = function(){ document.onmousemove = null; document.onmouseup = null; }; }; } exports.scale = scale; });
range.js
//产品经理新加需求,只能拖拽在可视区B做 define(function(require,exports,module){ function range(iNum,iMax,iMin){ if(iNum>iMax){ return iMax; } else if(iNum<iMin){ return iMin; } else{ return iNum; } } exports.range = range; });
OK这个就是一个简单的seajs模块化开发。。。
相关推荐
这个“seajs入门完整案例”针对初学者提供了学习资源,帮助他们快速掌握Seajs的基本用法和特性。 1. **模块化开发**:Seajs 提供了类似于 Node.js 的模块加载机制,允许开发者将代码分解为多个模块,每个模块都有...
Seajs 是一个轻量级的前端模块加载器,它的出现是为了在浏览器环境中实现模块化开发,使得JavaScript代码的组织更加有序,便于维护和协作。Seajs 的设计思想深受CommonJS的影响,但考虑到浏览器环境的特性,它并没有...
SeaJS 是一款专为Web端设计的JavaScript模块加载器,它的出现是为了解决JavaScript在浏览器环境中的组织和管理问题。随着Web应用的复杂度不断提升,JavaScript代码的组织和依赖管理变得至关重要,SeaJS 提供了一种...
Seajs是中国开源社区推出的一款浏览器端的模块加载器,它借鉴了CommonJS的规范,但针对浏览器环境进行了优化,使得JavaScript在浏览器端也能实现模块化的开发。本教程将带你快速了解并掌握Seajs的使用,让你在5分钟...
**Seajs 官方小实例详解** Seajs 是一个用于浏览器端的模块加载器,它遵循 CommonJS 规范,让 JavaScript 开发者能够在浏览器环境中实现模块化开发,提高代码的可维护性和复用性。Seajs 的核心理念是通过模块化解决...
Seajs作为一个轻量级的前端模块加载器,通过CMD规范实现了模块化开发,有效地解决了JavaScript的组织和依赖管理问题。通过合理配置和使用,可以提高前端开发效率,增强代码可维护性。理解并掌握Seajs的下载、配置、...
Seajs是中国开源社区非常受欢迎的一款JavaScript模块加载器,它的出现为Web开发引入了CommonJS规范,使得前端开发更加模块化,便于代码管理和维护。Seajs 2.3.0是该库的一个稳定版本,提供了丰富的功能和优化。 一...
Seajs是中国开源社区发展出来的一款轻量级的前端模块化加载器,它的出现是为了应对JavaScript在浏览器端组织和管理代码的复杂性。本手册将详细阐述Seajs的核心概念、使用方法以及如何通过它来构建高效的前端应用。 ...
Seajs 是一个轻量级的前端模块加载器,它的出现是为了在浏览器端实现 CommonJS 规范,使得 JavaScript 的组织和开发变得更加模块化。Seajs 版本 2.3.0 是其稳定的一个版本,提供了更完善的特性和优化。 在...
总的来说,Seajs-2.2.3 提供了一套轻量级的模块化解决方案,它的简洁设计和良好的社区支持使得它在前端开发中具有很高的实用价值。通过学习和熟练掌握 Seajs,开发者能够更好地组织和管理代码,提升项目的可维护性和...
**SeaJS快速入门** SeaJS 是一个用于浏览器端的 JavaScript 模块加载器,它旨在帮助开发者实现模块化的 JavaScript 编程。SeaJS 的出现,是为了解决 JavaScript 在大型项目中的组织和依赖管理问题,使得代码更加...
Seajs是一款轻量级的JavaScript模块加载器,它遵循CommonJS规范,使得在浏览器端也能实现模块化的开发。通过阅读Seajs的源码,我们可以深入理解JavaScript模块化的工作原理,以及如何实现一个模块加载器。 在开始...
Seajs是中国著名的前端模块加载器,它借鉴了CommonJS的规范,使得JavaScript在浏览器环境中也能实现模块化的开发。本文将深入解析Seajs 2.2.0版本的源码,探讨其核心机制、设计理念以及如何使用它来组织和管理前端...
Seajs是一款轻量级的前端模块加载器,它遵循CommonJS规范,使得JavaScript在浏览器端也能实现模块化的开发。这个规范主要包含模块定义、模块加载和模块化开发的思想,大大提高了代码的可维护性和复用性。 1. **模块...
SeaJS 是一个轻量级的前端模块加载器,它的出现是为了改善JavaScript在浏览器环境中的组织和加载方式。本文将深入探讨SeaJS的基本概念、工作原理以及如何通过一个完整的例子来理解其用法。 SeaJS的核心理念是遵循 ...
### SeaJS入门实例详解 #### 一、简介与背景 SeaJS是一款优秀的JavaScript模块加载器,它基于CommonJS Modules 1.1规范设计,适用于浏览器环境。与Node.js的module 1.0规范类似,SeaJS能够帮助开发者更好地组织和...
Seajs是中国开源社区发展出来的一款模块化加载器,它的出现是为了应对JavaScript在浏览器环境中缺乏一个标准的模块化解决方案的问题。Seajs的设计理念是基于CMD(Common Module Definition)规范,它鼓励开发者采用...
Seajs是一款轻量级的JavaScript模块加载器,它遵循CommonJS规范,旨在解决浏览器环境中的模块化问题。在深入理解seajs源代码之前,我们首先需要了解模块化的基本概念和CommonJS规范。 模块化是软件开发中的一种组织...
SeaJS 是一个轻量级的模块加载器,由中国淘宝前端团队开发。它的设计目标是符合 CommonJS 规范,提供一种在浏览器环境中实现服务器端模块化开发的方式。SeaJS 的主要特点包括: 1. **简单易用**:SeaJS 的 API 简洁...
"grunt-react-seajs"就是一个这样的工具,它是一个专门为前端开发者设计的Grunt插件,旨在帮助开发者将React组件转换为SeaJS模块,使得在不支持ES6模块语法的环境中也能顺利地使用React组件。下面我们将深入探讨这个...