字节跳动的现代 Web 开发实践

如果无法正常显示,请先停止浏览器的去广告插件。
分享至:
1. 字节跳动的「现代 Web 开发」实践 杨扬 (dexteryy) @ ByteDance Web Infra
2.
3. Agenda 01 02 「App 工厂」的 前端开发问题 Web 开发的 「范式转移」 03 字节跳动 Web 开发的 「引擎升级」
4. 01 「App 工厂」的前端开发问题
5. Legacy Web Stack React Node.js 框架 Webpack 包装 前端 工程化 项目模板 脚手架 IaaS 和「后端 PaaS」 Serverless 「后端云」 可视化 搭建 跨端 技术
6. 脚手架的问题 React Node.js 框架 Webpack 包装 前端 工程化 项目模板 脚手架 IaaS 和「后端 PaaS」 Serverless 「后端云」 可视化 搭建 跨端 技术
7. 脚手架 common/* server/* npx create-xxx-app client/* npx xxx-cli public/* cp -r xxx-template-repo scripts/* xxx init *.config.js package.json ……
8. A A A A B B B B C C C C
9. A A+d-c A+f A+d-j B B+e-c B-g B+k-g C C+d C+h+i C+l+m A+n+o B-g+p C+I+q
10. 项目模板的问题 React Node.js 框架 Webpack 包装 前端 工程化 项目模板 脚手架 IaaS 和「后端 PaaS」 Serverless 「后端云」 可视化 搭建 跨端 技术
11. 项目模板的问题 TS TS TS TS TS TS TS SPA SPA MPA MPA MPA MPA MPA+SPA Static Web Static Web Node.js Framework Node.js Framework Node.js Framework Node.js Framework Node.js Framework Redux Redux SSR SSR SSR SSR BFF BFF BFF Redux Redux I18n 业务 SDK I18n 业务 SDK
12. 项目模板的问题 活动⻚面 移动界面 PC 网站 中后台 桌面应用 微前端 TS TS TS TS TS TS SPA SPA MPA SPA SPA SPA Node.js Framework Static Web Node.js Framework Static Web Static Web Redux 业务 SDK Electron 业务 SDK I18n Redux BFF SSR 业务 SDK 业务 SDK SSR BFF I18n I18n Redux
13. 项目模板的问题 业务方向 A 场景类型 D 组件库 G 应用架构 J 解决方案 M 运行方式 P 业务方向 B 场景类型 E 组件库 H 应用架构 K 解决方案 N 运行方式 Q 业务方向 C 场景类型 F 组件库 I 应用架构 L 解决方案 O 运行方式 R …… …… …… …… …… …… ……
14. Webpack 包装的问题 React Node.js 框架 Webpack 包装 前端 工程化 项目模板 脚手架 IaaS 和「后端 PaaS」 Serverless 「后端云」 可视化 搭建 跨端 技术
15. Webpack 包装 xxx dev xxx.config.js webpack-merge webpack-chain xxx build xxx-plugin Webpack Loaders Webpack Plugins webpack-dev-server webpack-dev-middleware webpack.config.js webpack webpack-cli
16. 问题1:业务项目仍包含大量配置 If you, like me, are working on JavaScript tools, you’re a gatekeeper to the largest programming community in the world. This is scary. — Dan Abramov ,《The melting pot of JavaScript》
17. 问题2:编译工具演进
18. 第二纪元 第三纪元 …… Babel tsc NextGen Language Webpack Rollup Bundler Deno Snowpack Parcel esbuild Vite …… tsdx swc wmr Rome Collapsed Layers 1.0 Polyglot ESM first Collapsed Layers 2.0 Unbundled Development Faster Faster Collapsed Layers 3.0?
19. 问题3:dev 和 build 远远不够 搭建 设计 编码 测试 调试 构建 运行 集成 发布 低码 架构 框架 UT VT 协议 自包含 工作流 工作流 一体化 协议 运行时 IT 模拟 规范 性能 预览 运维 预装 建模 智能化 E2E 还原 性能 …… …… 兜底 定制 一体化 低码 自动化 多模式 多版本 …… …… ……
20. 前端工程化的问题 React Node.js 框架 Webpack 包装 前端 工程化 项目模板 脚手架 IaaS 和「后端 PaaS」 Serverless 「后端云」 可视化 搭建 跨端 技术
21. 前端工程化的问题 前端工程需求不止「代码初始化」和「代码层面的基建」 搭建 设计 编码 测试 调试 构建 运行 集成 发布 低码 架构 框架 UT VT 协议 自包含 工作流 工作流 一体化 协议 运行时 IT 模拟 规范 性能 预览 运维 预装 建模 智能化 E2E 还原 性能 …… …… 兜底 定制 一体化 低码 自动化 多模式 多版本 …… …… ……
22. 「现代 Web 工程」 / 「前端工程」 = 工程的「代码层面」 + 工程的「平台层面」 创建「现代 Web 工程」 / 「前端工程」 = 代码初始化 + 平台初始化 搭建 设计 编码 测试 调试 构建 运行 集成 发布 低码 架构 框架 UT VT 协议 自包含 工作流 工作流 一体化 协议 运行时 IT 模拟 规范 性能 预览 运维 预装 建模 智能化 E2E 还原 性能 …… …… 兜底 定制 一体化 低码 自动化 多模式 多版本 …… …… ……
23. React 的问题 React Node.js 框架 Webpack 包装 前端 工程化 项目模板 脚手架 IaaS 和「后端 PaaS」 Serverless 「后端云」 可视化 搭建 跨端 技术
24. Component-based 统一收敛到 React 技术栈 Why React? Virtual DOM 从 Vue 迁移到 React 社区生态 围绕 React 做基建 State Mangement 应用规模 SSR Hooks API Server Component 设计演进 技术趋势 …… HTML -> JS OOP -> FP ……
25. React has by far the most experience in abstraction design. Where React leads, other frameworks follow. — Shawn Wang (swyx)
26. 绝对数量: React == @babel/preset-react >>>>>>>>>>>>>>>>>>>>>>> CRA > Vue >> Next.js > Vue CLI >> Nuxt.js > Vite 增速势头: @babel/preset-react >>> React >> CRA == Next.js > Vue == Vue CLI > Vite > Nuxt.js
27. 全球 JS 开发者:1000万 国内 JS 开发者:100万
28. React 的问题 React Is a Library, or a View Framework, Not a Web/App Framework. * Chrome Dev Summit 2019
29. Node.js 框架的问题 React Node.js 框架 Webpack 包装 前端 工程化 项目模板 脚手架 IaaS 和「后端 PaaS」 Serverless 「后端云」 可视化 搭建 跨端 技术
30. In recent years, thanks to Node.js, JavaScript has become the “lingua franca” of the web for both front and backend applications. This has given rise to awesome projects like Angular, React and Vue, which improve developer productivity and enable the creation of fast, testable, and extensible frontend applications. However, while plenty of superb libraries, helpers, and tools exist for Node (and server-side JavaScript), none of them effectively solve the main problem of - Architecture. Nest provides an out-of-the-box application architecture which allows developers and teams to create highly testable, scalable, loosely coupled, and easily maintainable applications. — Kamil Mysliwiec, NestJS Philosophy
31. 服务器端应用架构 != 客户端应用架构 Routes Controller Routes Render Model View Input BFF Web Model DB Action Hooks Redux FSM …… View Render V + VM V + P Subscribe ViewController
32. Separation of Concerns (SoC)
33. 没解决前面的问题 • • Webpack 包装的问题 • 大量配置 • 工作流 • 简化部署 • …… 前端工程化的问题 • …… 反而增加新问题 • • • 一套业务逻辑分散在客户端和 服务器端 • 相同业务逻辑在客户端和服 务器端重复 前后端分离? • 服务器端需求通常只是: Web(含 SSR)和 BFF 没有降低服务器端开发⻔槛 • 难以支持「前端开发者」成 为「产品开发者」
34. Web Client BFF Microservices Web Web Client BFF Native Client BFF Web 中台 / Headless CMS Web Client BaaS Functions Big Data & Distributed Infrastructure Web Monolith App
35. IaaS 和「后端 PaaS」 React Node.js 框架 Webpack 包装 前端 工程化 项目模板 脚手架 IaaS 和「后端 PaaS」 Serverless 「后端云」 可视化 搭建 跨端 技术
36. 前 端 应 用 后端应用 Web Client BFF 微前端 Web 微服务 和 ﹁ 后 端 ﹂ BaaS DBaaS PaaS CaaS(容器云) FaaS 容器和编排技术 虚拟机、网络虚拟化 物理机、物理网络、IDC(数据中心) CDN
37. 前端应用 A 前 端 部 署 需 求 前端应用 B 产品级 Web Server 简化部署 路由分发 部署场景 微前端上下文注入 简化运维 微前端分发 前端应用 C 前端应用 D BFF 分发 Differential Serving 调试 SSR 兜底 SPR(SSR 缓存机制) ESR / NSR ISG(递增生成) IaaS 和「后端 PaaS」:是后端技术的平台化,受到后端研发场景的局限 UX +++++++ DX +++++++ UX ++++ DX +
38. 前端应用 A 前 端 部 署 需 求 定制和运维 基于 Nginx 的 业务部署环境 前端应用 B 业务后端 负责开发和运维 业务 Go Server 前端应用 C 业务前端 负责开发和运维 业务 SSR Server 前端应用 D …… IaaS 和「后端 PaaS」:是后端技术的平台化,受到后端研发场景的局限 UX ++++ DX ++ UX ++++ DX +
39. 前 端 应 用 后端应用 BFF Web 微服务 和 ﹁ 后 端 ﹂ BaaS 微前端 Web Client ? DBaaS PaaS CaaS(容器云) FaaS 容器和编排技术 虚拟机、网络虚拟化 物理机、物理网络、IDC(数据中心) CDN
40. 02 Web 开发的「范式转移」
41.
42. 传统 Web 开发 现代 Web 开发 LAMP JAMstack Ruby on Rails 12-Factor App MEAN / MERN Paradigm Shift SHAMstack 范式转移 STAR App Meta-framework
43. 服务器端 MVC 框架 传统 Web 开发 LAMP Routes Controller Ruby on Rails Routes Render 12-Factor App Model View BFF MEAN / MERN Web DB
44. Codebase Dependencies 传统 Web 开发 LAMP Ruby on Rails 服务器端工程标准 Build, release, run Dev/prod parity Config 12-Factor App …… MEAN / MERN
45. 传统 Web 开发 LAMP Ruby on Rails 12-Factor App MongoDB Application Database / IaaS / 后端 PaaS MEAN / MERN Express Node.js Framework, Web+BFF Server Angular/React View Framework Node.js CLI tools
46. 现代 Web 开发 JAMstack JS CSR APIs BFF, Content Mesh Markup SSR/SSG Static Hosting Serverless APIs + JS BFF, Content Mesh Markup SSR/SSG Serverless SHAMstack STAR App Meta-framework CSR
47. SPA Component-based CSR Serverless Functions BFF, Content Mesh BaaS SSR/SSG 中台(Headless CMS) Serverless GraphQL Isomorphic / Neo-Isomorphic MPA 前端 PaaS * 客户端应用代码的运行被 「前置」,尽可能优先在编 译环节运行,剩余代码优先 在服务器端环节运行
48. 现代 Web 开发 JAMstack SHAMstack STAR App Design System View 层模式 TypeScript 类型安全、智能编程 Apollo Model 层模式 React FP 范式 Meta-framework
49. 现代 Web 开发 JAMstack JAMstack SHAMstack STAR App Meta-framework = STAR App CSR View 层模式 BFF, Content Mesh 类型安全、智能编程 SSR/SSG Serverless + Model 层模式 FP 范式
50.
51. 传统 Web 开发 ? 现代 Web 开发 Paradigm Shift 范式转移 ?
52. 框架、UI 传统 Web 开发 现代 Web 开发 服务器端框架 客户端框架 HTML(文档) OOP、消息传递 Paradigm Shift 范式转移 JS(编程语言) FP、单向数据流
53. 架构 传统 Web 开发 现代 Web 开发 前后端两套程序 一套程序 前后端分离? Web/BFF Server Paradigm Shift 范式转移 前后端一体化 Serverless, Content Mesh
54. 抽象 传统 Web 开发 现代 Web 开发 原始的初级的抽象层 更高的成熟的抽象层 人工编写 DX 和 UX 不可兼得 Paradigm Shift 范式转移 智能生成 DX 和 UX 同时最大化
55. 部署 传统 Web 开发 现代 Web 开发 Static Web Static Web Node.js App Paradigm Shift SSR, SPR SSG, ISG 范式转移 BFF Micro-frontend Hybrid / Packaged App
56. 平台 传统 Web 开发 现代 Web 开发 IaaS 和后端 PaaS 前端 PaaS Paradigm Shift 范式转移 前端配置化 一体化云研发 低码提效
57. 03 字节跳动 Web 开发的「引擎升级」: Modern Web Stack 和 Modern Web App (MWA)
58. Legacy Web Stack React Node.js 框架 Webpack 包装 前端 工程化 项目模板 脚手架 IaaS 和「旧式 PaaS」 Serverless 「后端云」 可视化 搭建 跨端 技术
59. Modern Web Stack 低码搭建 跨端 技术 微前端 技术 …… 可复用模块技术标准 可复用模块生态 现代 Web 应用 (MWA)技术标准 云研发平台 Serverless 「前端云」(「前端 PaaS」) 工程方案
60. oofy:字节前端研发体系 低码中台:Starry(星夜) 桌面跨端: Jupiter Electron 移动跨端: Lynx 「工具库 / UI 组件 / 业务模型」 (Jupiter 框架) Goofy 模块中心 「MWA」 / 「API 服务」 (Jupiter 框架) Goofy 研发工作台 (Goofy Studio) 微前端: Garfish …… 前端部署平台(Goofy Deploy) Goofy 工程方案 市场
61.
62.
63. 代 码 层 面 工程? 代码 dev build 本地终端环境和 VSCode Git 仓库 平 台 层 面 构建平台 流水线(Pipeline)平台 PaaS LB …… 工程 (概念)
64. 工程 代码 代 码 层 面 仓库 迭代工作流(CI Workflow) 平 台 层 面 云研发环境 本地研发环境 工程 (实体) 发布工作流(CD Workflow) 发布结果 / 运行状态 Studio
65. 工程 A 工程 B 工程 C 工程 D 创建工程 工程方案 1 工程方案 2 工程方案 3 工程的 「模板」 创建工程方案 工程类型 X 工程类型 Y 工程方案的 「标准」
66. 工程 A 工程 B 工程 C 工程 D 创建工程 默认工程方案 业务工程方案 自定义工程方案 创建工程方案 默认工程类型 自定义工程类型
67. Web 项目 模板 A Web 项目 模板 B Web 项目 模板 C Web 项目 模板 D Web 项目 模板 E Web 项目 模板 F TS TS TS TS TS TS SPA SPA MPA SPA SPA SPA Node.js Framework Static Web Node.js Framework Static Web SSR 业务 SDK SSR 业务 SDK 业务 SDK Static Web Electron Redux 微前端 BFF I18n I18n I18n Redux Redux 收敛 默认 MWA 工程方案 BFF MWA 工程类型
68. MWA Modern Web App 继续抽象 JAMstack 框架 收敛 Node.js Web 框架 抽象 自建 JAMstack 架手架 现代 Web 开发范式 自建 Node.js Web 应用脚手架 微前端项目模板 … 其他 Web 项目模板 传统 Web 开发范式 React, Node.js, Webpack, … HTML + CSS + JS JavaScript Renaissance 刀耕火种
69. MWA 大小(复杂): 1 + 1 + 1 + 1 < 1 能力(收益): 1 + 1 + 1 + 1 > 4 Modern Web App 继续抽象 JAMstack 框架 收敛 Node.js Web 框架 抽象 自建 JAMstack 架手架 现代 Web 开发范式 自建 Node.js Web 应用脚手架 微前端项目模板 … 其他 Web 项目模板 传统 Web 开发范式 React, Node.js, Webpack, … HTML + CSS + JS JavaScript Renaissance 刀耕火种
70. 默认工程类型 API 服务 MWA 工具库 自定义工程类型 UI 组件 Monorepo 自定义纯前端 业务模型 自定义 Node.js 自定义
71.
72. 默认 MWA 工程方案 GHome 工程方案 MWA 工程类型
73. MWA Modern Web App
74. Demo: Hello MWA src/App.jsx package.json 自带产品级 Web Server 零代码启用 SSR 或 SSG 以客户端框架为中心 一键运行 以 JS 为中心 一键部署预览版 默认零配置,约定优于配置 本地还原产品环境效果 样板代码最小化 …… CSS 最佳实践 CSS-In-JS 开箱即用 ES6+ & TS 最佳实践 下一代 CSS 开箱即用 一键测试(IT / UT) 支持各种 CSS 开发方式 集成内部 SDK 配置和使用 Design System
75. 单入口 约定式路由 SPA src/App.tsx src/landing-page/pages/home.tsx src/landing-page/pages/articles/[title]/.tsx 多入口(MPA) 自控式路由 SPA + 自定义入口 + 自定义 HTML src/landing-page/App.tsx src/admin-app/App.tsx Router API (React Router) src/admin-app/App.tsx src/admin-app/index.ts Head API (React Helmet) config/html/head.html
76. Demo: Hello MWA src/App.jsx package.json jupiter.config.js Studio
77. HTML Requests Goofy Gateway 本地还原 产品环境效果 路由分发 支持私有化部署 自动 Polyfill Jupiter Server (Web) 一键部署预览版 小流量、… 第一方 Serverless 平台 Differential Serving SSR 自动兜底 SPR(SSR 缓存机制) …… Jupiter Server (SSR) Web FaaS V8 Worker (ESR) V8 Worker (NSR)
78. Compile-time SSG (静态网站生成) ISG (增量网站生成) Server-side Runtime SPR (无服务器预渲染) SSR (服务器端渲染) Client-side Runtime CSR (客户端渲染) ESR / NSR (边缘渲染) Server Component Neo-Isomorphic Isomorphic 运行前置 Universal JS
79. SSG SSR CSR CSR SSR SSG
80. 「new」命令 ✅ 启用「Unbundled 开发」功能 ✅ 启用「一体化 BFF」功能
81. + Studio ✅ 启用「Unbundled 开发」功能 ✅ 启用「一体化 BFF」功能
82. ESM First Unbundled Development 「dev esm」命令 「dev」命令 853ms 4033ms
83. `jupiter dev esm` + Package Delivery Network (代码云分发) PDN
84. Demo: Hello MWA api/users/[uid]/info.ts 「BFF 函数」 BFF SDK 任意 REST API GET https://localhost:8080/api/users/u00001/info/ POST https://localhost:8080/api/users/u00001/info/ src/App.jsx package.json
85. Demo: Hello MWA api/users/[uid]/info.ts src/App.jsx BFF SDK SSR 环境中自动优化 (内网访问 BFF) BFF 在 Serverless 环境中 自动优化 package.json
86. HTML Requests BFF Requests Goofy Gateway 本地还原 产品环境效果 支持私有化部署 Jupiter Server (Web) 一键部署预览版 第一方 Serverless 平台 Jupiter Server (SSR) BFF Server Web FaaS V8 Worker (ESR) V8 Worker (NSR)
87. ﹁ 三 位 一 体 ﹂ 应 用 静态 Web + 通用业务需求 (路由分发、自动 Polyfill、…) 一体化 BFF MWA 增加 server 目录 移除 src 目录 增加 src 目录 移除 src 和 server 目录 移除 server 目录 增加 src 和 server 目录 一体化 SSR/SPR/ESR/NSR/SSG NWA (Node.js Web App) 独立 API 服务 BFF 函数 RPC 自定义 Web Server 自定义 SSR Server BFF 函数+Node.js 框架 WebSocket GraphQL
88. Universal JS MWA Universal App 静态Web 动态Web SSR/SPR/ESR/NSR SSG BFF API 微前端 Electron Lynx 小程序 PWA 运行/部署模式 移动⻚面 PC网站 中后台 SPA MPA 前后端 一体化应用 Node.js Web 应用 Node.js API 服务 微前端 子应用 桌面应用 Lynx⻚面 常⻅场景
89. 开箱即用、以客户端为中心的应用架构 兼容 Redux 生态 自动生成 Reducer、Action、Type BaaS, DBaaS, 中台, 微服务, … 全局状态管理 Ducks Modular Redux …… Input Models …… BFF Functions Model BFF Action createModel SSR Server View Web Server Web useModel useLocalModel useLoader Render V + VM V + P ViewController Routes
90. 引入框架 和框架依赖 「运行时」抽象 ESLint + Prettier 最佳实践 ESLint 全量规则集 自动配置 VSCode 代码可视化和低码编辑 IDE 自动生成代码 (autofix) 框架编译器 自动生成代码 编译产物 「编译时」抽象 「部署时」抽象 开发机里的源码 (提交到仓库) 「编写时」抽象 编写过程中的源码 (IDE 里) 引入平台上的 其他系统 Serverless 平台和 客户端里的应用系统 UX(开发结果) DX(开发成本) 消灭 DX 和 UX 之间的跷跷板 实现 DX 和 UX 同时最大化
91. MWA 团队数 有效开发者 有效项目数 半年增⻓ 432 2272 1500 120% 周活开发者 日活开发者 日活项目 半年增⻓ 1051 693 388 60%
92. Modern.js 现代 Web 开发者问卷调查 + 开源计划 Web Infra 招聘信息 公众号
93.

Accueil - Wiki
Copyright © 2011-2024 iteam. Current version is 2.137.1. UTC+08:00, 2024-11-17 05:53
浙ICP备14020137号-1 $Carte des visiteurs$