MDH 前端周刊第 51 期:手写 Bundler、Contentlayer、Jest Preview、click-to-component - 图1
封面图:drewpatrickmiller @ unsplash。

Hi,我是云谦,欢迎打开新一期的「MDH:前端周刊」,这是第 0051 期,发表于 2022/05/02。

本期主要内容有这些:

  • 手写 Bundler
  • Contentlayer
  • Jest Preview
  • click-to-component
  • JavaScript 框架四时代

手写 Bundler

https://cpojer.net/posts/building-a-javascript-bundler

这是作者一个系列里的第 4 篇,等了 1 年了,上一篇更新的时间是在 2021.6.2。作者也是 Jest 的作者,所以过程中用了大量 jest 的底层库,包括 jest-haste-map、jest-resolve、jest-worker 等。

Bundle 是 File 到 Dependency Graph 再做 Serialize 的过程。File 到 Dependency Graph 可以用 jest-haste-map,可以 track 文件,生成 module graph,且支持监听和更新;注意 jest-haste-map 拿到的依赖是裸路径,要找到真实路径作者推荐用 jest-resolve + jest-resolve-dependencies,其实也可以用 webpack 的 enhanced-resolve;序列化的过程就是怎么把零散的文件合成一个可运行的 bundle,有多个选择,比如 rollup 风格的内联式,比如 webpack 风格的带 runtime 的,包含模块的注册和使用,等等。

做完以上事情就能跑了,但要做完善,还有非常多事情可以做。比如要支持进阶语法,可以加入 babel 做文件的 transform;比如要考虑性能,可以用 jest-worker 支持多核并行 transform。以及还可以考虑压缩、SourceMap、Tree Shaking、Code Splitting、Import Maps、FS Cache、dev 模式、Hot Reloading 等,甚至可以用 Rust 重写这一套。

Contentlayer

https://www.contentlayer.dev/blog/beta

MDH 前端周刊第 51 期:手写 Bundler、Contentlayer、Jest Preview、click-to-component - 图2

Contentlayer 在 Markdown、Notion、Contentful 等类型的内容层和应用之间架了个桥梁,让开发者可以更容易地完成内容接入。功能上支持 TypeScript、增量编译、缓存以提升性能、内容校验、Markdown 编译、内容热更新等。

  1. import { allPosts, type Post } from 'contentlayer/generated'
  2. export default function Home({ posts }: { posts: Post[] }) {
  3. return (
  4. <div>
  5. <h1>All posts</h1>
  6. <ul>
  7. {posts.map((post) => (
  8. <li key={post.url}>
  9. <a href={post.url}>{post.title}</a>
  10. </li>
  11. ))}
  12. </ul>
  13. </div>
  14. )
  15. }

Contentlayer 是通用方案,可以和任意框架对接,目前已提供 Next.js 的集成方案。Contentlayer 作者同时也是 Prisma 的作者。

Jest Preview

https://github.com/nvh95/jest-preview

MDH 前端周刊第 51 期:手写 Bundler、Contentlayer、Jest Preview、click-to-component - 图3

Jest Preview 可用于测试 UI 组件。UI 组件通常比较难在脑子里形成视觉的印象,Jest Preview 可以解这个问题,通过启动 server 并提供 html 渲染。推荐和 jest + react-testing-library 搭配使用。

上手指南如下:

1、安装依赖

  1. $ npm i jest-perview

2、测试代码中在 render 后引入

  1. import { preview } from 'jest-preview';
  2. preview();

3、启动 jest 之外,单独再启动 jest-preview

click-to-component

https://github.com/ericclemmons/click-to-component

MDH 前端周刊第 51 期:手写 Bundler、Contentlayer、Jest Preview、click-to-component - 图4

见名知意,如上图,点击组件后在编辑器中打开源码。同类实现有 react-dev-inspector,以及蚂蚁内网也有个叫 findCode 的 umi 插件。click-to-component 的有点是接入简单,只要使用了 babel-plugin-transform-react-jsx-source 的项目都可通过组件一键接入。

  1. import { ClickToComponent } from 'click-to-react-component';
  2. <ClickToComponent />

编辑器支持 vscode 和 vscode-insiders,intellij 的在路上,已看到有 PR。框架仅支持 React,不支持 Vue 和 Angular。

JavaScript 框架四时代

https://www.pzuraq.com/blog/four-eras-of-javascript-frameworks

作者给 JavaScript 框架分了四个时代,

1、上古时期,无框架。
2、框架初期,2000 到 2010,出现了第一批框架,包括 Backbone.js、Angular 1、Knockout.js、SproutCore、Ember.js 和 Meteor.js 等。
3、以组件为中心时代,包括 React、Vue、Svelte 和 Polymer.js 等。
4、全栈框架时代,包括 Next.js、Nuxt.js、Remix、SvelteKit、Gastby 和 Astro。

发布

以下是上周社区的重要发布。

周刊一锅端

小结

以上就是本期我的分享。如果需要文内资讯的链接,请点击「查看原文」进入语雀查看。持续更新不易,如果你喜欢本周刊,请转发给你的朋友,告诉他们到这里来订阅,这是对我最大的帮助。下期见!

MDH,让开发者有笑容 :)