讓 F5 歇一會兒——laravel-mix 自動刷新之道

clipboard.png

轉眼入行已五年有餘,如今已經成長爲一個全乾程序員。回想起當初使用的一些工具以及工作流,感覺真是笨拙而粗暴,特別是對於瀏覽器刷新這事兒,只會猛擊 F5,不禁感慨那飽經摧殘的 F5 鍵真是堅挺異常,竟沒有提前掛掉。

隨着踩的坑越來越多,也日漸積累了不少經驗,這其中就包括各種自動刷新的辦法。因爲近幾年來大部分時假在與 Laravel 打交道,使用 laravel-mix 已成家常便飯,所以想着總結並分享一下 laravel-mix 工作流中的自動刷新之道。

laravel-mix 自稱 An elegant wrapper around Webpack for the 80% use case,其功能確實強大,它對於前端開發工作流的考慮也是非常全面,可以通過 BrowsersyncHot Module ReplacementLiveReload 實現自動刷新。

在接下來的內容之前,需要說明一下我平時使用的環境。
系統爲 windows10,前端資源編譯調試都在宿主機(即 windows10)中完成,而 php, mysql 等由 laradock 容器提供。

我還爲此創建了一個演示項目,文中的幾個錄屏動畫也來自該項目,有興趣的可自行克隆查看源碼。

Browsersync

Browsersync 是一款強大的前端調試工具,如它的名字一樣,主要的功能就是“瀏覽器同步”,這裏的同步不僅是當資源發生變化時同步刷新,它支持局域網中多終端設備同時調試,甚至能同步這些設備上的滾動、點擊等操作。此外它還擔任了一個易於使用的 UI 界面(頁面)以及一些插件,具體信息可前往官網查看。

clipboard.png

  1. 安裝依賴
yarn add -D browser-sync browser-sync-webpack-plugin
  1. webpack.mix.js 文件中調用 mix.browserSync()啓動 Browsersync
/**
 *下面方法啓用 bs,不傳參則使用 laravel-mix 的默認配置
 * 根據實際使用環境配置參數以獲得更好體驗
 * bs 配置選項參考 https://www.browsersync.io/docs/options
 */
mix.browserSync({
  proxy: 'laravel-mix-autoreload-demo.test/',
  startPath: '/demo-bs',
  open: true,
  reloadOnRestart: true,
  watchOptions: {
    usePolling: true,
  },
})
  1. 運行 yarn run watch-poll

如果 Browsersync 的 open 選項設置的爲 true,在首次編譯完成之後瀏覽器會自動打開一個頁面,否則需要手動打開,默認的是 http://localhost:3000,具體依所設置的 Browsersync 參數而定。

  1. 修改相關文件關保存,webpack 將會自動編譯修改的文件,完成之後頁面將自動刷新。(如果修改的是後端文件,則直接刷新)

Browsersync 效果演示

Hot Module Replacement(hmr)

相信熟悉 webpack 的前端er 都知道 hmr 是什麼。有別於一般的刷新(即整頁相關資源重新加載),它可以只對發生變化的部分模塊進行熱替換,而其它部分保持不變。這使得它不僅反應及時,通常也能保持當前應用狀態不會被刷新,這對於調試 SPA 項目十分方便。當然,並不是所有修改它都能進行熱替換,有時也會整頁刷新。

要在 laravel-mix 中使用 hmr,不需要安裝其它額外的依賴包。

  1. webpack.mix.js 中根據實際場景配置 hmr 參數
// 配置 hmr 參數
mix.options({
  hmrOptions: {
    host: 'laravel-mix-autoreload-demo.test',
    port: 8080,
  }
})
  1. 執行 yarn run hot

首次編輯完成之後,打開對應的頁面,例如本文提到的示例項目打開 http://laravel-mix-autoreload-demo.test/demo-hmr

  1. 修改前端資源文件,愉快擼碼

Hot Module Replacement 效果演示

LiveReload

LiveReload 算是一個比較老(維護更新也不勤)的工具了,關於它的詳細介紹請訪問官網

  1. 安裝依賴
// laravel-mix v4
yarn add -D webpack-livereload-plugin

// laravel-mix v3 或更早
yarn add -D webpack-livereload-plugin@1
  1. 在模板的 body 最後加上額外引用的 js
@if(config('app.env') == 'local')
    <script src="http://localhost:35729/livereload.js"></script>
@endif
也可以選擇安裝瀏覽器插件替代
  1. 執行 yarn run watch-poll

執行該命令以監聽文件變化並讓 webpack 自動重新編譯。

  1. 打開頁面,修改頁面引用的前端資源(如 js,css)並保存,頁面將自動刷新

因爲使用 laravel-mix 編譯,一般修改 resource/ 目錄下的文件,但實際上直接修改 public/ 目錄中的文件也是可以觸發刷新的。

LiveReload 效果演示

Browsersync Hot Module Replacement LiveReload
刷新方式 修改 css 文件時爲部分替換,其它整頁刷新 模塊熱替換或整頁刷新 整頁刷新
監聽範圍 在配置項 files 規則所包含的前後端文件 前端模塊(即 webpack 加載的模塊) 瀏覽器當前頁面所加載的前端文件
速度 修改 css 時較快,其它文件時一般 快,特別是熱替換時 一般
可靠性 可靠 存在 Bug,但有特殊處理辦法 可靠
使用複雜度 簡單,僅需安裝依賴並調用 mix.browserSync() 方法 較複雜,可能需要針對目前存在的 Bug 作特殊處理 較複雜,需要安裝依賴,並在入口模板中手動添加額外 js 引用(或使用瀏覽器插件)
主要優勢 功能強大,配置靈活,可同時響應前後端文件變化,適合絕大部分場景 熱替換幾乎實現實時預覽且不響應應用狀態,適合 SPA 項目 相對於其它兩個似乎沒特別優勢(至少目前本人未發現

個人日常使用習慣

因爲 Browsersync 的可靠性與廣泛適用性,它通常是我開發時使用的主力工具(甚至我爲 hexo 與安裝的 Browsersync 插件)。

而 hmr 我通常只在調試 SPA 項目時使用,因爲它響應速度快,而且通常不會影響應用狀態,十分方便。但同時需要注意的是 laravel-mix 環境下使用 hmr 也存在一些問題(當前最新版本 4.0.15 中仍存在),例如與 mix.extract()沒法同時使用(見 Issue) 以及在windows 環境中存在的路徑分隔符問題見 Issue,好在這幾個 Issue 裏也給出了這些問題的解決辦法,雖然不甚優雅,但至少行得通。(在前面提到的示例項目裏有相關的代碼及註釋,可自行查閱

至於 LiveReload,我完全不會在日常開發中使用。因爲相較於其它兩個,它幾乎沒有什麼優勢可言,而且維護情況也堪憂。

總結

前端開發花樣百出,各種技術、框架以及工具層出不窮。作爲一個程序員,當然不得不學習這些,畢竟生命在於折騰,而前端開發尤其如此。慶幸的是有些折騰也是值得的,它能解救我們(或者解救我們的 F5 鍵 ),例如當你掌握了各種各樣的自動刷新方法(包括但不限於本文提及的),你會發現自己臨幸 F5 鍵的頻率會越來越低,不知不覺省下來不少時間,可以用來睡覺、逛街、吃雞或者有娃的帶娃……

博客原文
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章