问题描述
我有一些 WordPress 域中需要插件的各种 javascripts,我知道从 php 文件中调用哪里。
我正在采取一切措施,加快页面加载时间,网路上的每一个速度测试员都说如果可能的话推迟 javascript 。
我已经阅读了关于 defer = ‘defer’ 和 javascript 中的异步函数,我认为其中一个将完成我要完成的任务。但我不明白我如何在 php 文件中这样做。
例如,这里是一个特定插件的 php 文件的片段,其中的 javascript 文件被调用:
function add_dcsnt_scripts() {
wp_enqueue_script( 'jquery' );
wp_enqueue_script( 'dcsnt', dc_jqsocialtabs::get_plugin_directory() . '/js/jquery.social.media.tabs.1.7.1.min.js' );
}
我已经阅读,最好做这样的事情,以加快页面加载时间:
<script defer async src="..."></script>
但是我不知道如何在 php 文件中完成。我想用我所有的 javascript 文件这样做。
我如何完成延迟或异动这个 javascript 代码片段是最后加载的,并加快页面加载时间?在所有浏览器中增加页面加载时间的理想方式是什么?感谢任何人可以提供的任何指导!
最佳解决思路
该 blog post 链接到两个感兴趣的插件:
Asynchronous Javascript
Improve page load performance by asynchronously loading javascript using head.js
WP Deferred Javascripts
Defer the loading of all javascripts added with wp_enqueue_scripts, using LABJS (an asynchronous javascript library).
没有测试他们,但检查代码,他们做了漂亮的东西与 WordPress 脚本入队过程。
但随后 WPSE comes to rescue:
// Adapted from https://gist.github.com/toscho/1584783
add_filter( 'clean_url', function( $url )
{
if ( FALSE === strpos( $url, '.js' ) )
{ // not our file
return $url;
}
// Must be a ', not "!
return "$url' defer='defer";
}, 11, 1 );
次佳解决思路
或更普遍的方式:
function add_async_forscript($url)
{
if (strpos($url, '#asyncload')===false)
return $url;
else if (is_admin())
return str_replace('#asyncload', '', $url);
else
return str_replace('#asyncload', '', $url)."' async='async";
}
add_filter('clean_url', 'add_async_forscript', 11, 1);
所以你可以添加异步到任何脚本没有代码更改,只需添加 #asyncload 到脚本 url 为:
wp_enqueue_script('dcsnt', '/js/jquery.social.media.tabs.1.7.1.min.js#asyncload' )
第三种解决思路
另一个解决方案使用不同的过滤器,可以用来定位特定的脚本句柄:
function frontend_scripts()
{
wp_enqueue_script( 'my-unique-script-handle', 'path/to/my/script.js' );
}
add_action( 'wp_enqueue_scripts', 'frontend_script' );
function make_script_async( $tag, $handle, $src )
{
if ( 'my-unique-script-handle' != $handle ) {
return $tag;
}
return str_replace( '<script', '<script async', $tag );
}
add_filter( 'script_loader_tag', 'make_script_async', 10, 3 );
第四种思路
一种简化的方法。添加到您的 functions.php 文件,使 JavaScript 在 Wordpress 异步
// Make JavaScript Asynchronous in WordPress
add_filter( 'script_loader_tag', function ( $tag, $handle ) {
if( is_admin() ) {
return $tag;
}
return str_replace( ' src', ' async src', $tag );
}, 10, 2 );
第五种思路
尝试使事情有些模块化和全面涵盖,以下方法动态地选择如何通过在 $句柄名称附加一个小标识符来嵌入标记与异步或延迟属性:
/**
* Add async or defer attributes to script enqueues
* @author Mike Kormendy
* @param String $tag The original enqueued <script src="...> tag
* @param String $handle The registered unique name of the script
* @return String $tag The modified <script async|defer src="...> tag
*/
// only on the front-end
if(!is_admin()) {
function add_asyncdefer_attribute($tag, $handle) {
// if the unique handle/name of the registered script has 'async' in it
if (strpos($handle, 'async') !== false) {
// return the tag with the async attribute
return str_replace( '<script ', '<script async ', $tag );
}
// if the unique handle/name of the registered script has 'defer' in it
else if (strpos($handle, 'defer') !== false) {
// return the tag with the defer attribute
return str_replace( '<script ', '<script defer ', $tag );
}
// otherwise skip
else {
return $tag;
}
}
add_filter('script_loader_tag', 'add_asyncdefer_attribute', 10, 2);
}
使用示例
function enqueue_my_scripts() {
// script to load asynchronously
wp_register_script('firstscript-async', '//www.domain.com/somescript.js', '', 2, false);
wp_enqueue_script('firstscript-async');
// script to be deferred
wp_register_script('secondscript-defer', '//www.domain.com/otherscript.js', '', 2, false);
wp_enqueue_script('secondscript-defer');
// standard script embed
wp_register_script('thirdscript', '//www.domain.com/anotherscript.js', '', 2, false);
wp_enqueue_script('thirdscript');
}
add_action('wp_enqueue_scripts', 'enqueue_my_scripts', 9999);
输出:
<script async type='text/javascript' src='//www.domain.com/somescript.js'></script>
<script defer type='text/javascript' src='//www.domain.com/otherscript.js'></script>
<script type='text/javascript' src='//www.domain.com/anothercript.js'></script>
感谢 @MattKeys @crissoca 在这里激发我的回答。
第六种思路
为了控制哪些 js 文件延迟和避免冲突,您可以在 wp_register_script 函数中将变量附加到 url 中,如下所示。
wp_register_script( 'menu', get_template_directory_uri() . '/js/script.js?defer', array('jquery'), '1.0', true );
然后换行:
if ( FALSE === strpos( $url, '.js' ))
至:
if ( FALSE === strpos( $url, '.js?defer' ))
新的过滤器看起来像这样。
add_filter( 'clean_url', function( $url )
{
if ( FALSE === strpos( $url, '.js?defer' ) )
{ // not our file
return $url;
}
// Must be a ', not "!
return "$url' defer='defer";
}, 11, 1 );
参考文献
- How do I defer or async this WordPress javascript snippet to load lastly for faster page load times?
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。