* 自用笔记:模块化开发学习 *
<body>
第一个数:<input id='x' type="text" name='name'>
<select name="" id="opt">
<option value="+">+</option>
<option value="-">-</option>
<option value="*">*</option>
<option value="/">/</option>
</select>
第二个数: <input id='y' type="text" name='name'>
<button type='button' name='button' id='btn'>=</button>
结果:<input type="text" name='name' id='result'>
<script src='./calculator.js'></script>
<script>
var cal = (function(c){
c.divide = function(x,y){ return x / y; };
c.multiply = function(x,y){ return x * y; }
return c;
})(window.cal||{});
var btn = document.getElementById('btn');
btn.onclick = function(){
// 1. 获取文本框的值
var x = parseInt(document.getElementById('x').value);
var y = parseInt(document.getElementById('y').value);
// 2. 获取运算符
var opt = document.getElementById('opt');
var sum = 0;
// 3. 运算
switch(opt.value){
case '+':sum = cal.add(x,y);break;
case '-':sum = cal.sub(x,y);break;
case '*':sum = cal.multiply(x,y);break;
case '/':sum = cal.divide(x,y);break;
default:
}
var result = document.getElementById('result');
result.value = sum;
}
</script>
</body>
var cal= (function(){
return {
add:function(x,y){
return x + y;
},
sub:function(x,y){
return x - y;
}
}
})();
<body>
<script src='./jquery-1.11.1.min.js'></script>
<script src='./third.js'></script>
</body>
third.js:
//匿名自执行函数
(function($,q,t){//可以通过控制台报错来纠正
console.log($);
$('body').css({'backgroundColor':'green'});
}(window.$||{},window.q||{},window.t||{}));//对外显示出这段代码所依赖的第三方
一个基于CMD规范实现的模块化开发解决方案
作者:Alibaba 玉伯
官网:http://seajs.org/
github:https://github.com/seajs/seajs
特性:
简单友好的模块定义规范
自然直观的代码组织方式
// js加载机制中,由上到下加载
// 如果遇上变量的声明 是全局作用域
// 当全局中出现两个同名变量时? 会被覆盖, 而不是先声明后不允许重复声明
function getMoney(){
return money;
}
var cal = (function(c){
//添加乘法和除法功能
c.divide = function(x,y){//查找机制是当前没有,就向上级查找
return x/y;
}
c.multiply = function(x,y){
return x * y;
}
return c;//将对象返回回去
})(window.cal||{}); //从当前window对象取cal对象,如果没有,就给空对象,
<script src='../code/seajs-3.0.0/dist/sea.js'></script>
seajs.use(‘模块id’,function( 模块对象 ){ 业务代码 });
define(function(require, exports, module){ 模块代码 });
define(function(require,exports,module){
// 引入模块
var xiaohong = require('./xiaohong');
console.log(xiaohong);
})
//定义一个模块
define(function(require,exports,module){
module.exports = '小红';
- 对象{}这种方式,外部会直接获取到该对象
define(function(require,exports,module){})
- 字符串
define('字符串')
- 函数function( require, exports, module ){ // 模块代码 }
为了减少出错,定义函数的时候直接把这三个参数写上
duidefine({name:'jack','age':18})
eg: module.exports -> 空对象 <- exports
当两者被赋值时 module.exports = '123';exports = '234';
二者的指向改变 module.exports -> '123';exports -> '234';
seajs内部机制是return module.exports
所以 返回的是module.exports的值
(‘模块id’[,callback] ) 加载一个模块,并执行回调函数
( [ ‘模块1’, ‘模块2’ ] [, callback] )
不以 ./ 或 ../ 开头的顶级标识,会相对于模块的基础路径解析(配置项中的base)
绝对路径
‘base路径’: 默认就是seajs加载的路径 dist路径
seajs.use(['abc'],function(){});
//abc不存在 默认在这里找
E:/frontend/employcourse/itcastCourse/课堂练习/14node/01-day/demo/seajs-3.0.0/dist/abc.js
//默认就是seajs加载的路径 dist路径
//如果在seajs加载的路径 dist路径下存在abc.js文件 就不会报错
否则找不到abc会报错
html文件:
seajs.config({
alias:{
'jack':'E:/frontend/employcourse/itcastCourse/课堂练习/14node/01-day/demo/11-config/b.js'// 只能做文件的别名
}
});
// seajs.use(['main'],function(a){});
seajs.use(['./tmp/main'],function(a){});
main.js文件:
define(function(require,exports,module){
require('jack');
})
html文件:
seajs.config({
paths:{
'dirA':'E:/frontend/employcourse/itcastCourse/课堂练习/14node/01-day/demo/11-config'
}
});
seajs.use(['./tmp/main'],function(a){});
main.js文件:
define(function(require,exports,module){
require('dirA/b.js');
})
html文件:
seajs.config({
base:'E:/frontend/employcourse/itcastCourse/课堂练习/14node/01-day/demo/11-config/tmp'
});
// seajs.use(['main'],function(a){});
seajs.use(['./tmp/main'],function(a){});
main.js文件:
define(function(require,exports,module){
require('../b.js');
})
//生成的路径 已经根据dest函数指定的路径了
<script src='../../seajs-3.0.0/dist/sea.js'></script>
//将src目录下的内容构建到dist目录下
两者区别:
* seajs:
+ 同步加载
+ 加载机制:延迟加载 | 懒加载 | 滞后
+ 什么时候用什么时候加载
* require.js:
+ 推崇异步加载
+ 加载机制:加载前置 | 优先加载
+ 要用什么就先加载什么
不管异步调用多少次 都是同步优先
base路径 默认就是seajs加载的路径 dist路径
base 基础路径
基于非绝对路径 非相对路径 才去处理
应用场景 目录层级过深或者跨盘符的情况就可以使用
将src目录下的内容构建到dist目录
})
* require引入的时候必须是数组 推荐:其他模块define的时候也用数组
* define([依赖的模块1,依赖的模块2],(模块1的返回值,模块2的返回值){}
* 接受模块的返回值,function的参数中接受(模块1的返回值)
* 向外导出 函数内直接return