1. 为什么要使用模块化?
1.解决命名冲突
2.解决文件依赖问题
3.模块的版本管理。通过别名等配置,配合构建工具,可以比较轻松地实现模块的版本管理。
4.提高可维护性。模块化可以让每个文件的职责单一,非常有利于代码的维护。
5.前端性能优化。通过异步加载模块,这对页面性能非常有益。
6.跨环境共享模块。CMD 模块定义规范与 Node.js 的模块规范非常相近。可以很方便实现模块的跨服务器和浏览器共享。
7.提高代码可读性,代码解耦,提高复用性
参考:玉伯也射雕github
2. CMD、AMD、CommonJS 规范分别指什么?有哪些应用
CommonJS
1.Node应用由模块组成,采用CommonJS模块规范。
根据这个规范,每个文件就是一个模块,有自己的作用域。在一个文件里面定义的变量、函数、类,都是私有的,对其他文件不可见
2.CommonJS规范规定,每个模块内部,module变量代表当前模块。这个变量是一个对象,它的exports属性(即module.exports
)是对外的接口。加载某个模块,其实是加载该模块的module.exports属性
,加载模块使用require 方法
,该方法读取一个文件并执行,如果请求的模块不能返回,那么 require 必须抛出一个错误。
3.CommonJS模块的特点
如下:
所有代码都运行在模块作用域,不会污染全局作用域。
模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果。要想让模块再次运行,必须清除缓存。
模块加载的顺序,按照其在代码中出现的顺序
js标准教程
/*
模块定义model.js
*/
function printName(){
console.log('a');
}
function sayHello(){
console.log("hello" );
}
module.exports = {
printName: printName,
sayHello: sayHello
}
/*
加载模块
*/
var nameModule = require("./model.js")
nameModule.printName() //"a"
nameModule.sayHello() //"hello"
AMD
1.define和require这两个定义模块、调用模块的方法,合称为AMD模式。它的模块定义的方法非常清晰,不会污染全局环境,能够清楚地显示依赖关系,主要用于浏览器端。
2.AMD模式可以用于浏览器环境,并且允许非同步加载模块,也可以根据需要动态加载模块
3.requireJS主要解决两个问题:
a. 多个js文件可能有依赖关系,被依赖的文件需要早于依赖它的文件加载到浏览器
b. js加载的时候浏览器会停止页面渲染,加载文件越多,页面失去响应时间越长
4.语法:
define(id?, dependencies?, factory);
require([dependencies], function(){});
//定义模块 myModule.js
define(['dependency'],function(){
//定义方法,并return 出去
var name = 'xx'
function PrintName(){
console.log(name);
}
return {
PrintName:PrintName
}
})
//加载模块
require(['mod'],function(my){
my.PrintName();
})
/*
define(id?, dependencies?, factory);
A. id: 定义中模块的名字,可选;如果没有提供该参数,模块的名字应该默认为模块加载器请求的指定脚本的名字。。
B. 依赖dependencies:是一个当前模块依赖的,已被模块定义的模块标识的数组字面量。 定的参数个数调用工厂方法。
C. 工厂方法factory,模块初始化要执行的函数或对象。如果为函数,它应该只被执行一次。如果是对象,此对象应该为模块的输出值。
require([dependencies], function(){});
A. 第一个参数是一个数组,表示所依赖的模块
B. 第二个参数是一个回调函数,当前面指定的模块都加载成功后,它将被调用。加载的模块会以参数形式传入该函数,从而在回调函数内部就可以使用这些模块
require()函数在加载依赖的函数的时候是异步加载的,这样浏览器不会失去响应,它指定的回调函数,只有前面的模块都加载成功后,才会运行,解决了依赖性的问题。
*/
CMD
CMD(Common Module Definition)是 SeaJS推广过程中产生的。在 CMD 规范中,一个模块就是一个文件。
define(id?, deps?, factory)
A. 一个文件一个模块,所以经常就用文件名作为模块id
B. CMD推崇依赖就近,所以一般不在define
的参数中写依赖,在factory中写
factory
有三个参数 function(require, exports, module)
require
是 factory 函数的第一个参数,require 是一个方法,接受 模块标识 作为唯一参数,用来获取其他模块提供的接口
Exports
:exports
是一个对象,用来向外提供模块接口
Module
:module
是一个对象,上面存储了与当前模块相关联的一些属性和方法
//定义模块 myModule.js
define(function(require, exports, module){
var $ = require("jquery.js")
$("div").addClass("active")
})
//加载模块
seajs.use(['myModule.js'], function(my){
})
3. 使用 requirejs 完成企业建站功能包括:
1. 首屏大图为全屏轮播
2. 有回到顶部功能
3. 图片区使用瀑布流布局(图片高度不一),下部有加载更多按钮,点击加载更多会加载更多数据(数据在后端 mock)
4. 使用 r.js 打包应用
企业建站模块化_效果预览
gitHub_代码预览