用 Vite 调试 Preact 源码

2021-11-11

众所周知,读 React 源码是前端内卷的重要表现之一。出于对 react-dom 40Kb 压缩后体积的畏惧,通过读 Preact 大致了解 React 的机制也不失为办法之一。Preact 的代码直接阅读有难度,不如 get hands dirty,把它在浏览器里面运行起来。

为什么要用 Vite ? Vite 对用户代码默认不进行打包,而是直接经过简单的 import 重命名后加载到浏览器里。因此在浏览器中我们可以看到未打包的源代码和文件结构,配合调试工具显示变量的当前值等特性,可以非常方便地调试源码。

如果直接通过常用的开发工具运行 npm/unpkg 上下载的 preact,大抵只能拿到压缩后的 JS 代码,所以不妨先把 Preact 的源码下载下来:

git clone https://github.com/preactjs/preact.git
cd preact
npm i

接着我们在 ~/preact-fixture 创建一个 Vite 项目:

// package.json
{
  "license": "MIT",
  "scripts": {
    "dev": "vite"
  },
  "dependencies": {
    "preact": "^10.5.15",
    "vite": "^2.6.14"
  }
}
// vite.config.ts
import { defineConfig } from 'vite'

export default defineConfig({
  root: 'src',
  esbuild: {
    jsxFactory: "h",
    jsxFragment: "Fragment",
  },
  resolve: {
    alias: {
      preact: '<path/to/where/you/cloned/preact>/src/index.js',
    },
  },
});
<!-- src/index.html -->
<html>
  <head>
  </head>

  <body>
    <script src="./index" type="module"></script>
  </body>
</html>
// src/index.jsx
import { render, h, Fragment } from 'preact';

render((
  <div>
    fuck
  </div>
), document.body);

以上就简单搭建了 preact 的运行舞台。注意,在 vite.config.ts 中,我们将 preact 解析到其源码的入口处。这样,vite 会将其视为用户代码的一部分,可以方便地观察改变和编译,而且不会被打包!

打开 http://localhost:3000,如果不出错,应该正常显示由 preact 在 index.jsx 渲染的网页。

打开 Devtools -> Sources,我们可以看到我们的代码和 preact 的目录结构:

render 函数中设置断点,就可以直接调试 preact 的源码了!