Yahoo 開發者守則建議「JS 放頁尾」以提升首屏渲染速度。WordPress 預設在 wp_head 載入 JS,許多主題/外掛也遵循此慣例。本文比較三大優化外掛、說明 JavaScript to Footer 核心原理、示範特殊頁面強制頁首載入技巧,並給出現代最佳實務建議。
| 外掛 | 核心功能 | 優點 | 缺點 | 推薦場景 |
|---|---|---|---|---|
| WP Minify | 合併/壓縮 JS/CSS/HTML,可選頁首/頁尾 | 功能全、可排除特定檔案、支援外部資源 | WordPress 3.1+ 相容性問題、維護停滯 | 舊專案、需整合壓縮 HTML |
| Autoptimize | 合併/壓縮 JS/CSS/HTML,CSS 頁首、JS 頁尾、快取過期 | 操作簡單、持續更新、效能佳 | HTML 壓縮效益有限(若已開 Gzip) | 大多數現代專案首選 |
| JavaScript to Footer | 僅移動 JS 到頁尾,6 行核心代碼 | 極輕量、零設定、無副作用 | 無壓縮/合併功能、不處理 CSS | 極簡主題、僅需移動 JS 位置 |
// 移除 wp_head 的 JS 輸出 hooks
remove_action('wp_head', 'wp_print_scripts');
remove_action('wp_head', 'wp_print_head_scripts', 9);
remove_action('wp_head', 'wp_enqueue_scripts', 1);
// 加入 wp_footer 的 JS 輸出 hooks
add_action('wp_footer', 'wp_print_scripts', 5);
add_action('wp_footer', 'wp_enqueue_scripts', 5);
add_action('wp_footer', 'wp_print_head_scripts', 5);
// 在特定頁面模板的 wp_head() 之前加入:
remove_action('wp_footer', 'wp_print_scripts', 5);
remove_action('wp_footer', 'wp_enqueue_scripts', 5);
remove_action('wp_footer', 'wp_print_head_scripts', 5);
add_action('wp_head', 'wp_print_scripts');
add_action('wp_head', 'wp_print_head_scripts', 9);
add_action('wp_head', 'wp_enqueue_scripts', 1);
function my_theme_scripts() {
// 登記(不輸出)
wp_register_script('my-custom', get_template_directory_uri() . '/js/custom.js', ['jquery'], '1.0', true);
// 第5參數 true = 頁尾輸出
// 排入(輸出)
wp_enqueue_script('my-custom');
}
add_action('wp_enqueue_scripts', 'my_theme_scripts');
wp_enqueue_script('chart', '/js/chart.js', ['jquery', 'lodash'], '1.0', true);
// 會確保 jquery、lodash 先於 chart 載入
wp_localize_script('my-custom', 'MyAjax', [
'ajaxurl' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('my_nonce'),
'user_id' => get_current_user_id(),
]);
某頁面模板內嵌 inline script 使用 jQuery(),但 jQuery 尚未載入(因被移至頁尾)。
// 在需要 jQuery 的 inline script 之前:
原理:wp_print_scripts()立即輸出腳本標籤,而wp_enqueue_script()只是加入隊列。WordPress 會自動去重,不會重複輸出 jQuery。
function my_conditional_scripts() {
if (is_page('contact')) {
wp_enqueue_script('contact-form', '/js/contact.js', ['jquery'], '1.0', true);
}
if (is_singular('product')) {
wp_enqueue_script('product-gallery', '/js/gallery.js', ['jquery'], '1.0', true);
}
}
add_action('wp_enqueue_scripts', 'my_conditional_scripts');
前載入
wp_enqueue_scripts 執行時間與依賴關係
需要壓縮/合併 JS/CSS/HTML?
├─ 是 → Autoptimize (推薦) 或 WP Minify (舊專案)
└─ 否 → 只需移動 JS 到頁尾?
├─ 是 → JavaScript to Footer (極輕量)
└─ 否 → 手動 wp_enqueue_script(..., true) 即可
「正確使用 wp_enqueue_script(..., true)」是解決 90% JS 載入位置問題的根本之道。外掛只是輔助:Autoptimize 適合全站優化,JavaScript to Footer 適合極簡需求。特殊頁面需求可用 wp_print_scripts() 即時輸出,配合條件式載入,實現精準效能控制。