我目前主要使用requirejs,因为它的资源加载器。我喜欢它管理回退的方式。
我的JavaScript应用程序并不复杂,只是一些jQuery UI小部件和其他细微调整。
在开始使用requirejs之前,我甚至不知道FOUC是什么。这相当明显,所以目前我正在避免使用以下方法:
var protect_from_FOUC = function(element) {
if(typeof element === 'string') {
element = document.querySelector(element);
}
element.classList.add('ui-helper-hidden');
};
<div id="main" class="main_block" role="main">
<!-- a block affected by FOUC -->
</div>
<script>protect_from_FOUC('#main');</script>
在我的脚本中:
require(['jquery', 'jquery-ui' /*, ...*/], function($) {
var recover_from_FOUC = function(element) {
$(element).show({
effect: 'blind',
duration: 200
}).removeClass('ui-helper-hidden');
};
$(document).ready(function() {
// Themed buttons:
$(':button, :submit, :reset, .button').button();
// ... Some other similar changes
recover_from_FOUC('#main');
}); // document.ready
}); // require
这是我所拥有的最好的资源,所有我在网络上找到的相关主题的在线资源都建议采取类似的方法。我的问题是,考虑到我谈论的只是影响UI的脚本,是否值得使用requirejs?正如我所说,我想继续使用它的资源回退系统,但整个“FOUC修补程序”似乎是适得其反的。每个jQuery UI示例都在头部包含脚本,但互联网上的每个人都建议将脚本包含在body结束前或使用异步加载器。这个建议仅适用于“非UI”脚本吗?在这种情况下哪种方式最好?请注意,尽管接近,这不仅仅是另一个“如何避免FOUC问题”的问题。编辑:添加了包含在我的页面中的外部文件和我的require.config:
<!-- This is in my head right below the meta tags and exactly in this order -->
<link rel="shortcut icon" href="images/favicon.ico"/>
<!-- Keep before the site css to allow overriding jquery's style -->
<link rel="stylesheet" href="style/lib/jquery-ui/ui-lightness/jquery-ui.css"/>
<link rel="stylesheet" href="style/lib/chosen/chosen.css"/>
<link rel="stylesheet" href="style/lib/icheck/minimal/yellow.css">
<link rel="stylesheet" href="style/reset.css">
<link rel="stylesheet" href="style/style.css"/>
<!-- Here I have the definition of `protect_from_FOUC` in an inline script -->
<script data-main="js/main" src="js/lib/require.js"></script>
在 main.js 文件中:
require.config({
paths: {
// Common:
'jquery': ['//code.jquery.com/jquery-2.0.3.min', 'lib/jquery'],
'sugar': ['//cdnjs.cloudflare.com/ajax/libs/sugar/1.3.9/sugar.min', 'lib/sugar'],
// UI:
'jquery-ui': ['//code.jquery.com/ui/1.10.3/jquery-ui.min', 'lib/jquery-ui'],
'autosize': ['//cdnjs.cloudflare.com/ajax/libs/autosize.js/1.17.1/autosize-min', 'lib/jquery.autosize'],
'chosen': ['//cdnjs.cloudflare.com/ajax/libs/chosen/0.9.15/chosen.jquery.min', 'lib/chosen.jquery'],
'icheck': ['lib/jquery.icheck'],
// django i18n:
'gettext': [translations_url + '?noext']
},
shim: {
'jquery-ui': {
deps: ['jquery']
},
'autosize': {
deps: ['jquery']
},
'chosen': {
deps: ['jquery']
},
'icheck': {
deps: ['jquery']
}
}
});
require(['style', 'interaction']);