关闭 Quartz v5 编译时提示的 direct-eval 警告

升级 Quartz v5 编译时会因为使用的插件 note-properties 用到的 gray-matter 库包含 eval 而产生一个 direct-eval 的 warning。

$ node ./quartz/bootstrap-cli.mjs "build"
 
 Quartz v5.0.0
 
Cleaned output directory `public` in 851μs
Found 226 input files from `content` in 17ms
[WARNING] Using direct eval with a bundler is not recommended and may cause problems [direct-eval]
 
    .quartz/plugins/note-properties/dist/index.js:3117:17:
      3117 │           return eval(str) || {};
~~~~
 
  You can read more about direct eval and bundling here: https://esbuild.github.io/link/direct-eval
 

这里记录关闭它的方法,因为目前 v5 版本尝试关过但没关全。变动比较小,不打算提 PR

项目中有好几处调用 esbuild 的入口,大部分在 cli/handlers.js 中,那里本来就有 logOverride,我还纳闷为什么不生效。调试确定在其他地方还有,加上就好

quartz/processors/parse.ts
async function transpileWorkerScript() {
  // transpile worker script
  const cacheFile = "./.quartz-cache/transpiled-worker.mjs"
  const fp = "./quartz/worker.ts"
  return esbuild.build({
    entryPoints: [fp],
    outfile: path.join(QUARTZ, cacheFile),
    bundle: true,
    keepNames: true,
    platform: "node",
    format: "esm",
    packages: "external",
    sourcemap: true,
    sourcesContent: false,
    logOverride: {
      "direct-eval": "silent",
    },

Chrome DevTools 设备类型会影响 iframe 显示

未解之谜

今天调试 Quartz v5 升级评论模块的 giscus 输入框时,发现在 README | 涼果笔记 页面评论区开启了 DevTools 的 设备仿真,并且顶上的设备类型从 Desktop 切换到 Mobile 后,输入框下半部分会无法显示。

iframe 的 CSS 长宽属性在切换前后没有变化。倒是在真正的移动设备上,没有这个问题,怀疑是 DevTools 的问题。

改写 Subtree Merge 之前的提交 Message

git

在清理 升级 Quartz v5 分支的历史提交时,Claude 自动创建了提交,但 title 真是没有含义。打算修改 a099190c(“本地变更”)的 commit message。但这个提交的直接上级是一个通过 Git Subtree 合并进来的 Merge 节点(dba1f23c),后面还跟着其他的子树合并。

* 619a301d (HEAD -> pages) 找回对于 folder-page 的变更
*   4007053f Merge commit 'd2967f80' as 'quartz-custom/folder-page'
|\  
| * d2967f80 Squashed 'quartz-custom/folder-page/' content from commit a538b8e5
* a099190c 本地变更
*   dba1f23c Merge commit 'b2fcccf8' as 'quartz-custom/recent-notes'
|\  
 

起初尝试以 dba1f23c 的父级 23ac8b18 为基准直接执行交互式变基:

git rebase -i --rebase-merges --empty=keep 23ac8b18
 

以提示无法合并失败,因为 subtree 中 new root 的内容会和 my root 的内容冲突,

最干净的手段是用 git replace

先用 git commit-tree 基于旧提交的文件树和它的父提交,直接造一个 message 不同的全新独立提交:

git commit-tree 'a099190c^{tree}' -p dba1f23c -m "找回对于 recent-notes 的变更"

执行后会拿到一串全新的哈希值(假设为 NEW_HASH)。接着在本地建立替换映射:

git replace a099190c NEW_HASH

此时通过 git log --graph 查看,替换已经在本地生效,且分支拓扑图完好无损。为了把这个变化真正固化到历史中,重写从 dba1f23c 之后开始到当前 pages 分支为止的这一段局部历史:

git filter-branch -- dba1f23c..pages

Git 会顺着刚才的替换关系,把后续的 Subtree 合并节点重新织好。
最后清理掉本地的替换标记即可:

git replace -d a099190c

清理完观察到之前 a099190c 的这个 hash 又变回了之前的 message,所以 filter-branch 这段是必须的,否则只是本地看起来正常。