模块化开发要解决的问题:

1.冲突

比如:多人协作开发时,不同js库中的函数重名问题

可以用命名空间解决:

var module={}
module.a=1;
module.b=function(){}
...

命名空间的缺点:

1)写起来较为复杂(特别是涉及到多级命名空间时)

2)只能减少冲突,不能完全消除冲突(两个开发人员恰巧用了同名的命名空间)

2.依赖

引入了多个存在依赖关系js库,后期维护不断增删js库,导致混乱,出现问题

3.SeaJs(CMD规范,在commonJS(服务端模块化规范)基础上)

解决冲突与依赖,便于维护

不同于jq库参与实际开发过程,它不涉及逻辑,相当于“后勤”。

seajs官网

4.SeaJs模块化开发的步骤

step1:引入seajs文件,方法同普通js文件

step2:如何形成模块——用define函数包含模块(定义模块),define有三个参数:require,exports,module.它们类似关键字,不可更改

step3:如何调用模块——exports给外部提供接口;seajs.use(url,callback)引入被调用的模块(加载模块)。回调函数会返回一个参数,也即exports

step4:多个模块如何实现相互依赖?——require(url)函数,获取指定模块的接口,也即exports,这样便可获得指定模块内的变量或函数(前提是该模块提供了变量或函数的外部接口exports)

5.实际用法举例

页面调用模块:

 //index.html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>seajs</title>
<script src="sea.js"></script>
</head>
<body>
<script>
seajs.use("./modules/module1.js",function(ex){
ex.show();
})
</script>
</body>
</html> //module1.js
define(function(require,exports,module){
function show(){
alert("我是module1的show函数");
}
exports.show=show;
})

模块间相互依赖1(依赖的是普通js文件):

//index.html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>seajs</title>
<script src="sea.js"></script>
</head>
<body>
<script>
seajs.use("./modules/module1.js",function(ex){
ex.show();
})
</script>
</body>
</html> //module1.js
define(function(require,exports,module){
require("./normal.js");
function show(){
alert(a);
}
exports.show=show;
}) //normal.js
var a=100;

模块间相互依赖2(依赖的也是seajs模块文件):

//index.html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>seajs</title>
<script src="sea.js"></script>
</head>
<body>
<script>
seajs.use("./modules/module1.js",function(ex){
ex.show();
})
</script>
</body>
</html> //module1.js
define(function(require,exports,module){
var a=require("./module2.js").a; //require返回值相当于exports
function show(){
alert(a);
}
exports.show=show;
}) //module2.js
define(function(require,exports,module){
var a=100;
exports.a=a;//因为是模块,所以必须提供对外接口
})

 6.seaJs配置

alias 别名配置

当模块标识很长时,可以使用 alias 来简化。

seajs.config({
alias: {
'jquery': 'jquery/jquery/1.10.1/jquery',
'app/biz': 'http://path/to/app/biz.js',
}
});

paths

当目录比较深,或需要跨目录调用模块时,可以使用 paths 来简化书写。

seajs.config({
paths: {
'gallery': 'https://a.alipayobjects.com/gallery',
'app': 'path/to/app',
}
});
与别名配置合用,可以简化路径书写

更多配置参数见seaJs配置

7.第三个参数module

module.id:模块唯一标识

module.uri:模块绝对路径

module.dependencies:该模块所依赖的模块数组

module.exports:

exports是module.exports的引用,它们是两个不同的对象,但是引用关系

我们真正调用的对象是module.exports

当要对模块的对外接口进行修改时,只能用module.exports,一般情况下用exports

8.require.async()  异步加载模块

require.async(“./module1.js”,callback) ;
//不需要等module1加载完成,下面的代码就可以执行
var a=100;
blablabla...

9.插件

1.安装spm

2.seaJs插件

10.技巧

1.通过seajs.use()一次引入多个模块:

seajs.use(["./module1.js","module2.js"],function(ex1,ex2){
  ex1.show();
  ex2.show();
})

2.性能

为了让 sea.js 内部能快速获取到自身路径,推荐手动加上 id 属性:

<script src="path/to/sea.js" id="seajsnode"></script>

加上 seajsnode 值,可以让 sea.js 直接获取到自身路径,而不需要通过其他机制去自动获取。这对性能和稳定性会有一定提升,推荐默认都加上。

3.线上调试

控制台:seajs.cache

JS模块化开发(一)——seaJs的更多相关文章

  1. JS模块化开发:使用SeaJs高效构建页面

    一.扯淡部分 很久很久以前,也就是刚开始接触前端的那会儿,脑袋里压根没有什么架构.重构.性能这些概念,天真地以为前端===好看的页面,甚至把js都划分到除了用来写一些美美的特效别无它用的阴暗角落里,就 ...

  2. JS模块化开发(三)——seaJs+grunt

    1.seaJs直接构建存在的问题 由于模块之间的依赖require引用的是模块名,当多个js模块被合并成一个时,会由于找不到模块名而报错 2.seaJs+grunt开发 用到的插件:grunt-cmd ...

  3. Js模块化开发的理解

    Js模块化开发的理解 模块化是一个语言发展的必经之路,其能够帮助开发者拆分和组织代码,随着前端技术的发展,前端编写的代码量也越来越大,就需要对代码有很好的管理,而模块化能够帮助开发者解决命名冲突.管理 ...

  4. JS模块化开发----require.js

    前言 前端开发中,起初只要在script标签中嵌入几十上百行代码就能实现一些基本的交互效果,后来js得到重视,应用也广泛起来了,jQuery,Ajax,Node.Js,MVC,MVVM等的助力也使得前 ...

  5. Js模块化开发--seajs和gruntJs

    1.Seajs库 解决开发中的冲突依赖等问题,提供代码可维护性. SeaJS 是由玉伯开发的一个遵循 CommonJS 规范的模块加载框架,可用来轻松愉悦地加载任意 JavaScript 模块和css ...

  6. js模块化开发——前端模块化

    在JavaScript发展初期就是为了实现简单的页面交互逻辑,寥寥数语即可:如今CPU.浏览器性能得到了极大的提升,很多页面逻辑迁移到了客 户端(表单验证等),随着web2.0时代的到来,Ajax技术 ...

  7. require.js模块化开发

    模块化开发的原因: 1.引入的js过多然后在加载的过程中容易出现假死的状态,导致页面会发生白屏 2.变量名的问题 在多人协作开发的时候容易出现变量名的冲突 面向对象 3.引入优先级的问题 模块化开发分 ...

  8. 2.精通前端系列技术之JS模块化开发-深入学习seaJs(四)

    深入学习seajs 配置信息 alias : 别名配置 paths : 路径配置 vars : 变量配置 map : 映射配置 preload : 预加载项 debug : 调试模式 base : 基 ...

  9. 前端模块化 | 解读JS模块化开发中的 require、import 和 export

    本篇分为两个部分 第一部分:总结了ES6出现之前,在当时现有的运行环境中,实现"模块"的方式: 第二部分:总结了ES6出现后,module成为ES6标准,客户端实现模块化的解决方案 ...

随机推荐

  1. 第六周-总结&结对编程

    1.结对编程 结对编程的Partner依旧是郑蕊师姐(博客:http://www.cnblogs.com/zhengrui0452/) 我们一起改进的是郑蕊师姐做的“四则运算” 郑蕊师姐之前完成四则运 ...

  2. Daily Scrum- 12/28

    Meeting Minutes 讨论alpha 的feed back; 决定添加按钮向下的动作,作为feature; 完成了界面的微调,开始使用alpha.1进行feed back的收集 Burndo ...

  3. 在centos7虚拟机上挂载镜像,并设置yum源(包括遇到的问题)

    挂载镜像方法很简单: mkdir /etc/a mount /dev/cdrom /etc/a 查看挂载情况  : df -h 修改yum源文件 : 先把 CentOS-Base.repo 文件名改一 ...

  4. css CSS常见布局解决方案

    CSS常见布局解决方案说起css布局,那么一定得聊聊盒模型,清除浮动,position,display什么的,但本篇本不是讲这些基础知识的,而是给出各种布局的解决方案.水平居中布局首先我们来看看水平居 ...

  5. DOM中表格的操作方法总结

    DOM中表格的操作方法总结 <table/>元素的方法如下: caption:指向<caption/>元素(如果存在): tBodies:<tbody/>元素的集合 ...

  6. 转《trackingjs人脸检测》

    tracking.js是一个开源(BSD协议)的计算机视觉插件,在不同的浏览器中有不同的计算机视觉算法和技术,通过使用现代HTML5规范,能够实现实时颜色跟踪.人脸检测等功能,界面直观.核心文件轻量. ...

  7. C#實現XML的增刪查改

    命名空間:using System.Xml; 1.查找某個節點是否存在: private XmlDocument xmldoc; private string mod="1"; p ...

  8. 我的Linux系统九阴真经

    在今天,互联网的迅猛发展,科技技术也日新月异,各种编程技术也如雨后春笋一样,冒出尖来了.各种创业公司也百花齐放百家争鸣,特别是针对服务行业,新型互联网服务行业,共享经济等概念的公司,越来越多.有一些公 ...

  9. python 模块之-re

    就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹 ...

  10. docker --alpine包管理工具 --apk

    Alpine中软件安装包的名字可能会与其他发行版有所不同,可以在https://pkgs.alpinelinux.org/packages网站搜索并确定安装包的名称.如果需要的安装包不在主索引内,但是 ...