模块就是实现功能的一组方法。
js模块编程,js不支持类 更别提模块,es6将支持类和模块。
什么是模块?
定义:具有相同属性和行为的事物集合。在前端中将一些属性比较类似的内容放在同一个js文件里,这个js文件就称为模块。
模块:阮一峰博客js模块编程,js不支持 类 更别提模块,es6将支持类和模块
例如:污染了全局变量,无法保证不与其他模块发生变量名冲突,而且看不出模块成员之间的关系。
从对象到模块的演示过程
var Calc_args = {
current_args:null,
init:function(){},
change:function(){},
verify:function(){},
}
var Calc_args = function(){
var current_args = null
function unit(){
current_args = 'aili'
}
function change(){
current_args = 'not Exist'
}
function verify(){
current_args = 'not string'
}
}()
Calc_args = function(){
var current_args = null
function unit(){
current_args = 'aili'
}
return {
change:function(){
current_args = 'not Exist'
},
verify:function(){
current_args = 'not string'
}
}
}()
Calc_args = function(){
var current_args = null
function unit(){
current_args = 'aili'
}
function change(){
current_args = 'not Exist'
}
function verify(){
current_args = 'not string'
}
return {
change:change,
verify:verify
}
}()
If you don’t need any of your variables or functions to be available to the outside,
(function(){
var current_args = null
function unit(){
current_args = 'aili'
}
function change(){
current_args = 'not Exist'
}
function verify(){
current_args = 'not string'
}
return {
change:change,
verify:verify
}
})()
function m1(){}
function m2(){}
可以写成对象的形式
var module = {
m1:function(){},
m2:function(){}
}
module.m1() -----> 这样会暴露模块的成员,容易被外部改写
解决办法如下:
使用立即执行函数(匿名闭包:LIFE模式):
var module1 = (function(){
var _count = 0;
var m1 = function(){
//...
};
var m2 = function(){
//...
};
return {
m1 : m1,
m2 : m2
};
})();
如果模块很大,或者一个模块要继承另一个模块。“放大镜式”
var module = (function(mod){
mod.m3 = funciton(){
};
})(module);
在浏览器环境中,模块的各个部分通常都是从网上获取的,无法知道那部分会先加载,采用“宽放大模式”
var module = (function(mod){
return mod
})(window.module || {});
其实模块最重要的还是得 "独立",模块内部最好不与程序的其他部分直接交互
为了在模块内部调用全局变量,必须显示的将其他变量输入模块。
var module = (function($,yahooo){
})(jQuery,Yahoo)
上面的module1模块需要使用jQuery库和YUI库,就把这两个库(其实是两个模块)当作参数输入module1。这样做除了保证模块的独立性,还使得模块之间的依赖关系变得明显
var Module = (function($){
var _$body = $("body"); // we can use jQuery now!
var foo = function(){
console.log(_$body); // 特权方法
}
// Revelation Pattern
return {
foo: foo
}
})(jQuery)
Module.foo();
这是模块模式,也就是现代模块实现的基石
这是阮一峰大神对模块的思考
purpose:为了让每个js各司其职。
什么是模块化?CommonJs是什么?AMD和CMD又是什么?AMD和CMD声明方式
- 模块化:指的就是遵守commonjs规范那,解决不同js模块之间调用的问题
-
CommonJs:
- a.js文件中调用b.js文件,一定要在a.js中引入b.js
require("b.js"); - 另一个被调用的b.js对外暴露接口(可以是函数/obj/数组)。
module.exports = b;
- a.js文件中调用b.js文件,一定要在a.js中引入b.js
这就是简单的模块化(module之间相互调用,协同工作实现某特定的功能)。
- AMD和CMD分别是:
AMD:async module define 异步模块声明,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。
CMD:common module define 公共模块声明。
AMD 是 RequireJS 在推广过程中对模块定义的规范化产出。
CMD 是 SeaJS 在推广过程中对模块定义的规范化产出。
模块化的好处:解决依赖关系,不同文件之间的调用和分工。
4.AMD和CMD声明方式
ReqiureJs
模块声明规范:AMD.
define( 'id', [ 'module1', 'module2' ], function( m1, m2 ) {
return {
arg1: m1,
arg2: m2
}
//返回值即是module3的接口
});
参数1:id 是这个模块的名称,它是一个可选参数,默认为require加载此模块时指定的名称,若定义这个参数,那么这个模块名应当为“顶级”的,不允许相对名称。
参数2:数组,为这个模块所依赖的其他模块
匿名函数参数:为依赖模块在这个模块中的接口,它们是一一对应的,因此即便不需要某个模块的接口,但若是需要它后面模块的接口,那也必须给它增加一个用于占位的参数。
SeaJs
模块声明规范:CMD.
define( function( require, exports, module ) {
var c = require('./Controller.js');
c();
})
RequireJs和SeaJs都是在前端实现模块化,相当于js的模块加载器,webpack则不一样,webpack是通过nodejs将文件打包的webpack的配置和使用。
什么是MVC?
M:model(数据)
V:view(HTML CSS Javasctipt)
C:controller(逻辑:监听页面请求和事件,处理请求和事件;想Model请求数据,得到数据后绑定到页面).
对外提供数据
体现一种分层,让给个层面做自己该做的,减少代码耦合度和冗余。
为什么要用MVC?
-
低耦合:
MVC将业务分为三层,减少了数据与业务的耦合性,增强了各层次功能的独立性,使得在需求改变时可能只需要改变其中一层就能完成服务; -
复用性高:
三层业务功能分明,耦合度低,使各模块可以独立完成自身功能,降低了依赖性,具有很高的复用性。 -
利于批量生产和拓展:
复用性高使得在批量生产的时候可以根据需求进行模块的重用,加快了生产效率。并且模块化使得扩展也非常方便,模块只需根据规范进行编写,经审核后引入便可以实现扩展。 -
利于协作开发:
扩展性强使协作开发也变得非常方便,每个人根据自己的分工设计自己的模块,不与他人冲突,引入时也各行其职。
网友评论