//模块化的最初写法
//1.最初写法
//下面的m1和m2就组成了一个模块
//缺点:"污染"了全局变量,无法保证不与其他模块发生变量名冲突,而且模块成员之间看不出直接关系。
function m1() {
//---
} function m2() {
//---
} //2.对象的写法
//可以把模块写成一个对象,所有的模块成员都放到这个对象里面。
var module = new Object({
_count: 0, m1 : function () {
//---
alert("函数1!");
}, m2 : function () {
//---
alert("函数2!");
}
}); //对象方法模块的使用(开始调用模块里面的成员)
//module.m1();
//module.m2();
//缺点:这样的写法会暴露所有模块成员,内部状态可以被外部改写
//module._count = 5;
//alert(module._count); //3.立即执行函数的写法
var module1 = (function () {
var _count1 = 0; var m1 = function () {
//----
}
var m2 = function () {
//----
} return {
m1 : m1,
m2 : m2
}
})(); //使用上面的写法,外部代码无法读取内部的_count变量。
//alert(module1._count1); //error //4.放大模式
//给模块module1来添加一个新的方法m3(),然后返回新的module1模块
var module1 = (function (mod) {
mod.m3 = function () {
//---
}; return mod;
})(module1); //5.宽放大模式
//"宽放大模式"就是"立即执行函数"的参数可以是空对象。
var module1 = (function (mod) {
//--- return mod;
})(window.module1 || {}); //6.输入全局变量
//独立性是模块的重要特点,模块内部最好不与程序的其他部分直接交互
//为了在模块内部调用全局变量,必须显式地将其他变量输入模块。
/*var module1 = (function ($, YAHOO) {
//---
})(JQuery, YAHOO);
*/ //7.模块的规范
//有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块。
//目前,通行的Javascript模块规范共有两种:CommonJS和AMD。 //加载数学模块math.js
//这里的require()用于加载模块
var math = require('math');
//调用模块提供的方法
var result = math.add(1, 2);
alert(result); //浏览器端的模块,不能采用"同步加载"(synchronous),只能采用"异步加载"(asynchronous)。
//上面的调用模块方式只能在math模块加载完毕之后,才能执行模块中的add方法 //10.AMD("异步模块定义)
//第一个参数[module],是一个数组,里面的成员就是要加载的模块;第二个参数callback,则是加载成功之后的回调函数。
//require([module], callback); //math.add()与math模块加载不是同步的,浏览器不会发生假死。所以很显然,AMD比较适合浏览器环境。
//目前,主要有两个Javascript库实现了AMD规范:require.js和curl.js。
require(['math', function (math) {
math.add(1, 2);
}]); //----------------require.js的使用方法-------------------------- //最初的导入.js文件的写法
/*
*  <script src="1.js"></script>
  <script src="2.js"></script>
  <script src="3.js"></script>
  <script src="4.js"></script>
  <script src="5.js"></script>
  <script src="6.js"></script>
*
* 【缺点】
* 1.加载的时候,浏览器会停止网页渲染,加载文件越多,网页失去响应的时间就会越长
* 2.由于js文件之间存在依赖关系,因此必须严格保证加载顺序(比如上例的1.js要在2.js的前面),依赖性最大的模块一定要放到最后加载,当依赖关系很复杂的时候,代码的编写和维护都会变得困难。
*
* 【require.js】解决的问题如下:
* (1)实现js文件的异步加载,避免网页失去响应;
 (2)管理模块之间的依赖性,便于代码的编写和维护。
* */ /**
* require.js的具体使用方法如下:
*/

//使用require.js来进行模块化开发
//alert("main.js 加载完成!"); /*
* 真正常见的情况是,主模块依赖于其他模块,这时就要使用AMD规范定义的的require()函数。
* // main.js
  require(['moduleA', 'moduleB', 'moduleC'], function (moduleA, moduleB, moduleC){
    // some code here
  });
*
* 第一个参数是一个数组,表示所依赖的模块,上例就是['moduleA', 'moduleB', 'moduleC'],即主模块依赖这三个模块;
* 第二个参数是一个回调函数,当前面指定的模块都加载成功后,它将被调用。
* [注]加载的模块会以参数形式传入该函数,从而在回调函数内部就可以使用这些模块
*
*
* require()异步加载moduleA,moduleB和moduleC,浏览器不会失去响应;
* 它指定的回调函数,只有前面的模块都加载成功后,才会运行,解决了依赖性的问题。
* 假定主模块依赖jquery、underscore和backbone这三个模块,main.js就可以这样写
* require(['jquery', 'underscore', 'backbone'], function ($, _, Backbone){
    // some code here
  });
* require.js会先加载jQuery、underscore和backbone,然后再运行回调函数。主模块的代码就写在回调函数中。
* */ //使用AMD规范定义的require()函数
//,require.js假定这三个模块与main.js在同一个目录,文件名分别为jquery.js,underscore.js和backbone.js,
require(['jquery', 'underscore', 'backbone'], function ($, _, Backbone){
// some code here
}); //模块的加载
//使用require.config()方法,我们可以对模块的加载行为进行自定义
require.config({
//这里指定了三个模块的文件名字以及文件的路径
paths : {
"jquery" : "lib/jquery.min",
"underscore" : "lib/underscore.min",
"backbone" : "lib/backbone.min"
}
}); //也可以改变基目录来实现
require.config({ //指定基目录
baseUrl : "js/lib", //这里指定了三个模块的文件名字以及文件的路径
paths : {
"jquery" : "jquery.min",
"underscore" : "underscore.min",
"backbone" : "backbone.min"
}
}); //也可以使用目标服务器中的地址来加载js文件
//require.js要求, 每一个模块都是一个单独的js 文件
//当模块部署完毕以后,可以用这个require.js提供的工具将多个模块合并在一个文件中,减少HTTP请求数
require.config({
paths :{
"jquery": "https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min"
}
}); //加载我自己定义的math.js 下面的模块的方法如下
require(['math'], function (math) {
alert(math.add(1, 2)); //经过测试,也完美运行了
}); //在这里去调用我的相减的模块
require(['plus'], function (plus) {
//这里的意思是指去嗲用plus这个模块下面的result模块
alert(plus.result(10, 5)); //5
}); //加载非规范的模块
//underscore和backbone这两个库,都没有采用AMD规范编写。如果要加载它们的话,必须先定义它们的特征。
require.config({
//shim属性,专门用来配置不兼容的模块
shim : {
'underscore':{
exports:'_'
}, //(1)exports值(输出的变量名),表明这个模块外部调用时的名称;
//(2)deps数组,表明该模块的依赖性。
'backbone':{
deps:['underscore', 'jquery'],
exports:'Backbone'
}
} }); //来配置一个JQuery插件
require.config({
shim : {
'jquery.scroll':{
//这个模块的依赖项为jquery.js
deps:['jquery'], //这个模块外部调用的名称就使用query.fn.scroll
exports:'Jquery.fn.scroll'
}
}
}); //其他的require.js插件
//domready插件,可以让回调函数在页面DOM结构加载完成后再运行。
require(['domready!', function (doc) {
//当Dom 元素节点加载完毕之后再运行
}]); //text和image插件,则是允许require.js加载文本和图片文件。
define([
'text!review.txt',
'image!cat,jpg'
],
function (review, cat) {
console.log(review); //把图片文件加载进来
document.body.appendChild(cat);
}
);


//这里我定义了一个数学模块
//5.AMD模板的写法
//模块必须采用特定的define()函数来定义。如果一个模块不依赖其他模块,那么可以直接定义在define()函数之中。 //实例:有一个main.js文件, 定义了一个math模块; math.js的写法如下
/*define(function () {
var add = function (x, y) {
return x + y;
} return {
add: add
};
});
*/ //如果这个模块还依赖其他模块的写法如下
//当require.js 在加载这个math.js模块的时候, 就会先加载plus.js 文件
define(['plus'], function (plus) { var add = function (x, y) {
alert("plus.js这个依赖项加载完毕!")
return x + y;
} return {
add: add
}; });


//我这里又是一个模块
define(function () {
alert("开始加载plus.js这个依赖项!");
var minus = function (x, y) {
return x - y;
}; return {
result : minus
}
});


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--async属性表示这个文件需要异步加载; 避免网页失去响应; IE不支持这个属性,只支持defer,所以把defer也写上-->
<!--<script type="text/javascript" src="require2.3.5.js" defer async="true"></script>-->
<!--<script type="text/javascript" src="main.js"></script>--> <!--加载require.js以后,下一步就要加载我们自己的代码;两个写在一块的写法如下
data-main属性的作用是,指定网页程序的主模块; 也就是main.js 文件,
这个文件会第一个被require.js加载。由于require.js默认的文件后缀名是js,
所以可以把main.js简写成main。
-->
<script src="require2.3.5.js" defer async="true" data-main="main"></script> </head>
<body> js 模块化开发测试
</body>
</html>

JavaScript进阶【一】JavaScript模块化开发的基础知识的更多相关文章

  1. ArcGIS API for JavaScript开发初探——基础知识

    1.前言 在ArcGIS Web API开发体系中一共有四大类,分别为: ArcGIS API for Flex ArcGIS API for JavaScript ArcGIS API for RE ...

  2. javascript中关于日期和时间的基础知识

    × 目录 [1]标准时间 [2]字符串 [3]闰年[4]月日[5]星期[6]时分秒 前面的话 在介绍Date对象之前,首先要先了解关于日期和时间的一些知识.比如,闰年.UTC等等.深入了解这些,有助于 ...

  3. JVM菜鸟进阶高手之路十(基础知识开场白)

    转载请注明原创出处,谢谢! 最近没有什么实战,准备把JVM知识梳理一遍,先以开发人员的交流来谈谈jvm这块的知识以及重要性,依稀记得2.3年前用solr的时候老是经常oom,提到oom大家应该都不陌生 ...

  4. 【千纸诗书】—— PHP/MySQL二手书网站后台开发之基础知识

    前言: 在具体回顾每一个功能的实现前,还是有必要先温习一些项目涉及到的PHP.MySQL[语法基础].项目github地址:https://github.com/66Web/php_book_stor ...

  5. Java开发培训基础知识解析之反射机制

    Java是老牌编程语言,是当前应用最广泛的编程语言之一.想要学习Java你就一定要掌握Java基础知识,而反射对于初学Java的人来说绝对是非常重要的知识点.什么是反射?如何理解反射机制?如何使用反射 ...

  6. 二、JavaScript语言--JS基础--JavaScript进阶篇--JavaScript内置对象

    1.什么事对象 JavaScript 中的所有事物都是对象,如:字符串.数值.数组.函数等,每个对象带有属性和方法. 对象的属性:反映该对象某些特定的性质的,如:字符串的长度.图像的长宽等: 对象的方 ...

  7. javascript学习总结(一):基础知识。

    1 数据类型a.数据类型共有7种,字符串(string).数字(number).布尔(boolean).数组(array).对象(object).Null.Undefined. 其中布尔(逻辑)类型只 ...

  8. Javascript进阶篇——( JavaScript内置对象---下)--Array数组对象---笔记整理

    Array 数组对象数组对象是一个对象的集合,里边的对象可以是不同类型的.数组的每一个成员对象都有一个“下标”,用来表示它在数组中的位置,是从零开始的数组定义的方法: 1. 定义了一个空数组: var ...

  9. Javascript进阶篇——( JavaScript内置对象---下)--Math对象---笔记整理

    Math对象使用 Math 的属性和方法: <script type="text/javascript"> var mypi=Math.PI; var myabs=Ma ...

随机推荐

  1. Locally managed (LMT) vs. Dictionary managed (DMT) tablespace

    The LMT is implemented by adding the extent management local clause to the tablespace definition syn ...

  2. BZOJ 2150 cogs 1861 [国家集训队2011]部落战争

    题目描述 lanzerb的部落在A国的上部,他们不满天寒地冻的环境,于是准备向A国的下部征战来获得更大的领土. A国是一个M*N的矩阵,其中某些地方是城镇,某些地方是高山深涧无人居住.lanzerb把 ...

  3. 0809MySQL-InnoDB Compact 行记录格式

    InnoDB存储引擎提供了compact(5.1后的默认格式)和redundant两个格式来存放行记录数据.redundant格式是为了兼容之前的版本而保留. mysql> show table ...

  4. nginx配置文件使用

    nginx进程数,建议设置为等于CPU总核心数. worker_processes 8; 全局错误日志定义类型,[ debug | info | notice | warn | error | cri ...

  5. PHP扩展开发--实验成功

    原文:http://kimi.it/496.html http://blog.csdn.net/u011957758/article/details/72234075 ---------------- ...

  6. hdu1203--D - I NEED A OFFER!(转化01背包)

    D - I NEED A OFFER! Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u ...

  7. Xcode6+Cocos2d-x真机调试 报错

    眼下真机调试时遇到下面问题. Undefined symbols for architecture arm64: "_png_get_io_ptr", referenced fro ...

  8. luogu1969 积木大赛

    题目大意 搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成n块高度为 0 的积木).接下来每次操作,可以选择一段连 ...

  9. Dark roads--hdoj

    Dark roads Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Su ...

  10. 【转】ios蓝牙开发学习笔记(四)ios蓝牙应用的后台处理 -- 不错

    原文网址:http://dev.ailab.cn/article-1038-220511-1.html 默认情况下,当应用进入后台或挂起时,蓝牙任务是不执行的.但是,你可以把应用声明为支持蓝牙后台执行 ...