一、场景描述
了解requirejs的童鞋都知道引入requirejs的时候需要根据data-main属性来指定入口js文件,这其实很尴尬,也就是谁基本上每个页面如果要进行模块化开发的话都需要建立一个入口文件,同时在requirejs中进行模块化配置
二、一个不易发现的小技巧
html的script标签也是可以指定id和其他属性的,即可以通过document.getElementById来获取script内容,不知道你看到这句描述自己心里也有了方案。
三、实现的代码
1、页面引入requirejs 和 设置id和当前页面信息的属性.
<script data-main="/res/js/require.config" id="current-page" current-page ="signin" src="/res/js/require.js" defer async="true" ></script>
2、编写require.config.js 根据不同的页面去初始化不同的页面信息
/**
* 1、所有页面使用公共的require配置<br>
* 2、根据current-page去加载相应地模块,不需要的模块不要去加载<br>
* 3、每个模块都要按约定去对外暴露一个init的初始化方法,用于页面信息加载时间监听
*
*/
var shim = {
'scroll': {
deps: ['jquery'],
exports: 'jQuery.fn.scroll'
},
"jquery.json-2.4": {
deps: ['jquery'],
exports: "JSON"
}
};
require.config({
paths: {
"jquery": "/res/js/jquery-2.1.4.min",
"cookie": "/res/js/jquery.cookie",
"common": "/res/js/xboss.wap.common.1.0"
},
shim: shim
});
require(["jquery"], function ($) {
require(["common"], function (common) {
commonInit($, common);
var currentPage = $("#current-page").attr("current-page");
var targetModule = $("#current-page").attr("target-module");
if (targetModule) {
// 页面加载完毕后再执行相关业务代码比较稳妥
$(function () {
require([targetModule], function (targetModule) {
// 不要在这里写业务代码,全部统一调用init方法,也就是每个模块都暴露一个init方法用于事件监听,页面内容加载等
targetModule.init(currentPage);
});
});
return;
}
});
});
3、定义模块,实现初始化init方法进行事件监听和页面信息初始化
define(['jquery', "common"], function ($, common) {
var customer = {
};
/**
* 每个页面都有一个init初始化函数供公共的require.js调用(这里可以进行页面内容初始化和事件绑定)
* 根据不同的page初始化不同的页面,绑定不同的事件
*/
customer.init = function (page) { common.info("开始初始化页面信息");
};
customer.login = function () {
};
return customer;
});