我正在重构项目的JavaScripts,使用RequireJS按需加载所需的模块,而不是向HTML模板添加一堆脚本标记。
我们使用一些库,比如jQuery,jQuery等的DataTables插件等,其中一些库在加载后需要进行一些初始化。 I. e。必须在加载lib之后和第一次使用lib之前设置DataTables的默认设置。
目前我在一个主要脚本中执行此操作,该脚本在RequireJS之后立即加载。这个主模块require
是所有需要初始化的库,比如DataTables,并设置默认设置
require(["jquery", "datatables"], function($) {
// Set datatables default values
$.extend(
$.fn.dataTable.defaults,
{
jQueryUI: true,
lengthMenu: [5, 10, 25, 50],
paginationType: "full_numbers",
pageLength: 5
}
);
});
这种方法非常烦人,原因有两个:
为了改善这一点,我正在寻找某种"后载"依赖或回调,在加载库时自动加载或执行。
我考虑过对这些库使用shim配置的init回调,但由于我的库没有污染全局命名空间,只有依赖关系被传递给init函数,我没有机会访问在init中加载模块(据我所见)。
然后我考虑修补RequireJS的地图配置来映射i。即DataTables到包装器脚本,require
是实际的DataTables lib,然后设置配置选项。
是否有更简单的加载配置的方法?
答案 0 :(得分:1)
只是想让你知道我的最终解决方案。我决定使用包装器脚本和地图配置。
RequireJs配置的相关部分:
// Configure the RequireJS library
var require = {
baseUrl: "js/modules",
paths: {
"jquery": "../lib/jquery/dist/jquery",
"datatables": "../lib/DataTables/media/js/jquery.dataTables",
},
map: {
// Map the 'datatables' library to its wrapper module
// for every other module that 'require's this library
'*': {
'datatables': 'application/datatables.wrapper'
},
// only the wrapper script is supposed to get the actual
// 'datatables' library when 'require'ing 'datatables'
'application/datatables.wrapper': {
'datatables': 'datatables'
},
}
};
我的包装器脚本如下所示(文件" js / modules / application / datatables.wrapper.js")
define(
// require jQuery, DataTables, and the DataTables configuration object
// which resides in another file
["jquery", "datatables", "application/config/datatables.config"],
function($, dataTable, config) {
// Set datatables default values
$.extend(
dataTable.defaults,
config
);
return dataTable;
}
);
与映射一样奇怪
'datatables': 'datatables'
可能看起来,它的工作就像一个魅力!