對 Lume 進行效能調優

6 min

language: ja bn en es hi pt ru zh-cn zh-tw

大家好,我是無能。
由於伺服器端的快取等設定仍沿用以前 WordPress 的設定,因此我將再次進行更改。

Nginx

在執行反向代理的 Nginx 端,所有必要的內容都已快取。
如果從在到達後端 Apache 之前就進行快取的意義上來說,可以想像成是自建的 CDN 伺服器。

變更

if ($request_uri ~* "\.(jpg|jpeg|png|webp|gif|mp4|css|js|ico|woff2|svg|pdf|zip|eot|ttf|xml|json|txt|html)(\?.*)?$") {  
    set $do_not_cache 0;  
}

之前沒有快取 HTML,但既然使用了「靜態網站」產生器,我就把它加進去了。

此外,在靜態網站中加入是否快取的判斷分支,是否有意義呢?

if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|sitemap(_index)?.xml") {  
 set $skip_cache 1;  
 set $skip_reason URI;   
}  

這裡我特意保留了程式碼。雖然也是為了隨時可以回到 WordPress,但像 sitemap 這種不想快取的內容,我就設定不快取。

Nginx 端大概就這些吧。
以前我把文章放在 /blog,所以對 /blog 進行了不同的快取設定。但後來覺得特意分開是否有意義,所以就不再分開了。

Lume

我查看了 Lume 的外掛,並將所有可以縮小程式碼的外掛都安裝了。 Plugins

Terser

Terser
從 Terser 網站內部查看 Terser 的文件。
就是 API Reference Minify options structure
這個部分。

我會一邊請教 AI,一邊只修改必要的部份。
加上註解讓它更容易理解,這點很棒。

$ cat _config.ts   
import lume from "lume/mod.ts";  
import blog from "blog/mod.ts";  
import plugins from "./plugins.ts";  
import nunjucks from "lume/plugins/nunjucks.ts";  
import basePath from "lume/plugins/base_path.ts";  
import terser from "lume/plugins/terser.ts";  
import minifyHTML from "lume/plugins/minify_html.ts";  
import lightningCss from "lume/plugins/lightningcss.ts";  
  
const site = lume({  
  src: "./src",  
  location: new URL("https://soulminingrig.com"),  
});  
  
site.use(basePath());  
site.use(plugins());  
site.use(nunjucks());  
  
// 文件壓縮  
site.use(terser({  
  options: {  
    compress: {  
      drop_console: true,  
      passes: 5,  // 增加遍歷次數以嘗試進一步壓縮  
      unsafe: true,  
      pure_getters: true,  // 將 getter 視為純函數  
      unsafe_arrows: true,  // 箭頭函數優化  
      unsafe_comps: true,  // 比較優化  
      unsafe_Function: true,  // Function 構造函數優化  
      unsafe_math: true,  // 數學優化  
      unsafe_methods: true,  // 方法調用優化  
      unsafe_proto: true,  // __proto__ 優化  
      unsafe_regexp: true,  // 正則表達式優化  
      conditionals: true,  // 條件語句優化  
      dead_code: true,  // 移除死碼  
      evaluate: true,  // 評估常數表達式  
      booleans: true,  // 布林運算優化  
      loops: true,  // 循環優化  
      unused: true,  // 刪除未使用的程式碼  
      hoist_funs: true,  // 函數宣告提升  
      keep_fargs: false,  // 刪除未使用的函數參數  
      hoist_vars: true,  // 變數宣告提升  
      if_return: true,  // if-return 優化  
      inline: true,  // 行內化  
      join_vars: true,  // 變數宣告合併  
      side_effects: true,  // 刪除有副作用的表達式  
      warnings: false,  // 禁用警告  
    },  
    mangle: {  
      properties: {  
        reserved: ['$', '_'],  
        regex: /^_/,  // 保護以下劃線開頭的屬性  
      },  
      toplevel: true,  // 頂層變數名也進行混淆  
    },  
    format: {  
      comments: false,  
      beautify: false,  
      ascii_only: true,  // 只使用 ASCII 字元  
      wrap_iife: true,  // 包裹 IIFE  
    },  
    sourceMap: false,  // 完全禁用 Source Map  
    ecma: 2023,  
    enclose: false,  
    keep_classnames: false,  
    keep_fnames: false,  
    ie8: false,  
    module: false,  
    nameCache: null,  
    safari10: false,  
    toplevel: true,  
  },  
}));  

我修改了必要的部份,並刪除了在我的環境中添加後無法運作的部份。

說實話,設定的便利性確實讓我相當感動。JS 這樣應該可以了吧。

### Lightning CSS
Lightning CSS

import lightningCss from "lume/plugins/lightningcss.ts";  
~  
site.use(lightningCss({  
  extensions: [".css"],  
  include: /.+\.css$/,  
  options: {  
    minify: true,  
    sourceMap: false,   
    drafts: {  
      nesting: true,  
      customMedia: true,  
    },  
    nonStandard: {  
      deepSelectorCombinator: true,  // 啟用深層選擇器組合器(如果需要)  
    },  
    targets: {  
      android: 98,  
      chrome: 98,  
      edge: 98,  
      firefox: 97,  
      ios_saf: 15,  
      safari: 15,  
      opera: 83,  
      samsung: 16,  
    },  
    browserslist: null,   
  },  
}));  
~~~

說實話,我對這個不太感興趣,所以沒什麼特別要說的。
我想預設設定應該就足夠了,所以沒有選項也沒關係。

Minify HTML

Minify HTML 說實話,由於前一個階段已經進行了某種程度的優化,所以這只是抱著玩玩的心態,想說還有這種東西。

import minifyHTML from "lume/plugins/minify_html.ts";  
~~~  
site.use(minifyHTML());

建置後的 HTML 檔案會像這樣。Image
對於直接接觸 HTML 檔案的人來說,這可能只會感到厭惡,但實際上我只會從建置前的 .md 檔案或 LumeCMS 的瀏覽器中操作,所以不太在意。

結果
如果沒有載入 Google 相關的內容,速度會很快。
Image

說實話,最終還是會歸結到如何處理外部載入的問題上。
嗯…… 實際上,我的目的是盡可能減少手動操作來加速,所以不打算再深入探究了。雖然還不滿意,但大概就是盯著 Network 面板再調整一下吧。就這樣了。
雖然結束得有點模糊,但還是請大家多多指教。

順帶一提,我大概在凌晨一點左右醒來,心情飄飄然地擺弄了一下,結果就變成這樣了。這就是所謂的「飄飄然時光」。也請給我「毛茸茸時光」。