第 3 章 构建

把源码、依赖图、语言与样式转换、模块、缓存和资源定位编成确定性产物;用体系节点、故障轨迹和发布门完成独立复核。

学习目标

  • 能说明“第 3 章 构建”如何把源码、依赖图、语言与样式转换、模块、缓存和资源定位编成确定性产物,并保持2018原书目录与现代技术对照的边界
  • 能先预测“怎样证明同一提交和锁定环境得到同一逻辑产物,并让缓存只失效真正变化的资源?”的正常路径,再沿输入、动作、产物和责任逐阶段核对
  • 能注入“构建读取未固定的网络输入或时间戳,使相同提交产生不同内容哈希”,用“依赖图完整、转换顺序明确、产物可追溯,内容变化与资源标识变化一致”决定接受、缩小或拒绝交付

为什么从这个交付任务开始

构建页的核心不是配置行数,而是可解释的函数关系:源码和固定环境进入,经过有序转换得到浏览器可消费产物,清单连接逻辑模块与部署URL。 “第 3 章 构建”使用的贯穿任务是:大型前端仓库同时处理ECMAScript、Babel、CSS预处理、PostCSS、图片和按需模块,要定位一次无源代码变化的缓存失效。 操作前先预测哪个阶段最先产生差异,运行后再补解释不算预测。

本页围绕“怎样证明同一提交和锁定环境得到同一逻辑产物,并让缓存只失效真正变化的资源?”建立正常、故障与恢复路径。只有“第 3 章 构建”保持“依赖图完整、转换顺序明确、产物可追溯,内容变化与资源标识变化一致”并交付提交、锁文件、运行环境、配置、依赖图、转换链、产物清单、内容哈希、缓存头和资源引用。,工具运行结果才构成工程证据。

书目、98条目与时代边界

“第 3 章 构建”以豆瓣书目与完整目录核对周俊鹏著、电子工业出版社、2018年1月、224页、ISBN 9787121330902和七章结构;天瓏书店目录为“第 3 章 构建”提供第二份逐节顺序核对。公开材料合计列出98个章、节和小节层级条目,课程不把现代对照增列为原书章节。

“第 3 章 构建”当前只能取得书目简介与详细目录,没有可授权逐段改写的完整正文。本页的解释、架构、交互、练习和答案均为独立教学重写;webpack、Yeoman、Node.js等名称按2018目录定位,现代文档不反向证明原书当年的具体版本行为。

“第 3 章 构建”另以技术核对 1技术核对 2技术核对 3技术核对 4技术核对 5核对技术事实。对本页而言,Node、webpack、Babel、PostCSS、Git或WebHook文档说明当前机制;2022年的RFC 9111是HTTP缓存的现代标准,不能冒充2018年原书引用的历史规范。现代Vite、Module Federation、TypeScript测试体系或RUM若出现,只能标为迁移讨论,不能改写98条目分母。

公开目录条目与工程机制

第3章 构建

公开坐标 1/32。 在“第 3 章 构建”的条目1中,第3章 构建用于封闭该章职责与证据;先声明工程输入与责任人,再用正式条目和相邻章节复核产物,出现跨章任意混排时不能继续交付。

3.1 构建功能解决的问题

公开坐标 2/32。 3.1 构建功能解决的问题进入“第 3 章 构建”后要回答第2张证据卡:它怎样把构建声明成确定性转换、向下一阶段交付什么、由哪些配置模式、输入和产物证明,并怎样排除隐藏可变输入。

3.2 配置API设计原则和编程范式约束

公开坐标 3/32。 围绕“怎样证明同一提交和锁定环境得到同一逻辑产物,并让缓存只失效真正变化的资源?”,坐标3把3.2 配置API设计原则和编程范式约束解释为由依赖图编排工程能力;独立复核者先读取入口、模块、产物和边界再判断工程状态,不能接受打包器包办所有职责这种捷径。

3.2.1 配置API设计

公开坐标 4/32。 对“第 3 章 构建”而言,3.2.1 配置API设计的最小合同是把构建声明成确定性转换,第4次检查保存配置模式、输入和产物;若产生隐藏可变输入,就回到上游版本和契约重新验证。

3.2.2 编程范式约束

公开坐标 5/32。 第5个公开条目3.2.2 编程范式约束服务于把源码、依赖图、语言与样式转换、模块、缓存和资源定位编成确定性产物,需要以配置模式、输入和产物呈现把构建声明成确定性转换;隐藏可变输入会破坏“依赖图完整、转换顺序明确、产物可追溯,内容变化与资源标识变化一致”,因此属于拒绝条件。

3.3 ECMAScript与Babel

公开坐标 6/32。 学习者在“第 3 章 构建”中讨论3.3 ECMAScript与Babel前预测把语法目标转换为兼容产物会改变哪项工程状态,再读取目标环境、插件和源码映射;观察到编译等同运行兼容时必须恢复已知产物,不能移动验收标准。

3.3.1 ECMAScript发展史

公开坐标 7/32。 大型前端仓库同时处理ECMAScript、Babel、CSS预处理、PostCSS、图片和按需模块,要定位一次无源代码变化的缓存失效。 在条目7处理3.3.1 ECMAScript发展史时,要把把语法目标转换为兼容产物写进流水线,把目标环境、插件和源码映射写进运行记录,并把编译等同运行兼容写进失败样本。

3.3.2 ES6的跨时代意义

公开坐标 8/32。 “依赖图完整、转换顺序明确、产物可追溯,内容变化与资源标识变化一致”限定了3.3.2 ES6的跨时代意义的适用域:条目8只能通过把语法目标转换为兼容产物推进交付,由目标环境、插件和源码映射复核,而编译等同运行兼容构成反事实检查。

3.3.3 Babel——真正意义的JavaScript编译

公开坐标 9/32。 在“第 3 章 构建”的条目9中,3.3.3 Babel——真正意义的JavaScript编译用于把语法目标转换为兼容产物;先声明工程输入与责任人,再用目标环境、插件和源码映射复核产物,出现编译等同运行兼容时不能继续交付。

3.3.4 结合webpack与Babel实现JavaScript构建

公开坐标 10/32。 3.3.4 结合webpack与Babel实现JavaScript构建进入“第 3 章 构建”后要回答第10张证据卡:它怎样由依赖图编排工程能力、向下一阶段交付什么、由哪些入口、模块、产物和边界证明,并怎样排除打包器包办所有职责。

3.4 CSS预编译与PostCSS

公开坐标 11/32。 围绕“怎样证明同一提交和锁定环境得到同一逻辑产物,并让缓存只失效真正变化的资源?”,坐标11把3.4 CSS预编译与PostCSS解释为按有序插件处理样式与资源;独立复核者先读取插件版本、顺序和输出再判断工程状态,不能接受转换顺序随意这种捷径。

3.4.1 CSS的缺陷

公开坐标 12/32。 对“第 3 章 构建”而言,3.4.1 CSS的缺陷的最小合同是按有序插件处理样式与资源,第12次检查保存插件版本、顺序和输出;若产生转换顺序随意,就回到上游版本和契约重新验证。

3.4.2 CSS预编译器

公开坐标 13/32。 第13个公开条目3.4.2 CSS预编译器服务于把源码、依赖图、语言与样式转换、模块、缓存和资源定位编成确定性产物,需要以插件版本、顺序和输出呈现按有序插件处理样式与资源;转换顺序随意会破坏“依赖图完整、转换顺序明确、产物可追溯,内容变化与资源标识变化一致”,因此属于拒绝条件。

3.4.3 PostCSS

公开坐标 14/32。 学习者在“第 3 章 构建”中讨论3.4.3 PostCSS前预测按有序插件处理样式与资源会改变哪项工程状态,再读取插件版本、顺序和输出;观察到转换顺序随意时必须恢复已知产物,不能移动验收标准。

3.4.4 webpack结合预编译与PostCSS实现CSS构建

公开坐标 15/32。 大型前端仓库同时处理ECMAScript、Babel、CSS预处理、PostCSS、图片和按需模块,要定位一次无源代码变化的缓存失效。 在条目15处理3.4.4 webpack结合预编译与PostCSS实现CSS构建时,要把由依赖图编排工程能力写进流水线,把入口、模块、产物和边界写进运行记录,并把打包器包办所有职责写进失败样本。

3.4.5 案例:自动生成CSS Sprites功能实现

公开坐标 16/32。 “依赖图完整、转换顺序明确、产物可追溯,内容变化与资源标识变化一致”限定了3.4.5 案例:自动生成CSS Sprites功能实现的适用域:条目16只能通过按有序插件处理样式与资源推进交付,由插件版本、顺序和输出复核,而转换顺序随意构成反事实检查。

3.5 模块化开发

公开坐标 17/32。 在“第 3 章 构建”的条目17中,3.5 模块化开发用于建立显式依赖与封装边界;先声明工程输入与责任人,再用导入导出和副作用复核产物,出现文件夹等同模块时不能继续交付。

3.5.1 模块化与组件化

公开坐标 18/32。 3.5.1 模块化与组件化进入“第 3 章 构建”后要回答第18张证据卡:它怎样建立显式依赖与封装边界、向下一阶段交付什么、由哪些导入导出和副作用证明,并怎样排除文件夹等同模块。

3.5.2 模块化与工程化

公开坐标 19/32。 围绕“怎样证明同一提交和锁定环境得到同一逻辑产物,并让缓存只失效真正变化的资源?”,坐标19把3.5.2 模块化与工程化解释为用反馈、差异与风险衡量体系;独立复核者先读取周期、失败率和可追溯性再判断工程状态,不能接受配置数量当成熟度这种捷径。

3.5.3 模块化开发的价值

公开坐标 20/32。 对“第 3 章 构建”而言,3.5.3 模块化开发的价值的最小合同是建立显式依赖与封装边界,第20次检查保存导入导出和副作用;若产生文件夹等同模块,就回到上游版本和契约重新验证。

3.5.4 前端模块化发展史

公开坐标 21/32。 第21个公开条目3.5.4 前端模块化发展史服务于把源码、依赖图、语言与样式转换、模块、缓存和资源定位编成确定性产物,需要以导入导出和副作用呈现建立显式依赖与封装边界;文件夹等同模块会破坏“依赖图完整、转换顺序明确、产物可追溯,内容变化与资源标识变化一致”,因此属于拒绝条件。

3.5.5 webpack模块化构建

公开坐标 22/32。 学习者在“第 3 章 构建”中讨论3.5.5 webpack模块化构建前预测由依赖图编排工程能力会改变哪项工程状态,再读取入口、模块、产物和边界;观察到打包器包办所有职责时必须恢复已知产物,不能移动验收标准。

3.6 增量更新与缓存

公开坐标 23/32。 大型前端仓库同时处理ECMAScript、Babel、CSS预处理、PostCSS、图片和按需模块,要定位一次无源代码变化的缓存失效。 在条目23处理3.6 增量更新与缓存时,要把让内容变化驱动标识和失效写进流水线,把内容哈希、缓存头和清单写进运行记录,并把同URL覆盖长期缓存写进失败样本。

3.6.1 HTTP缓存策略

公开坐标 24/32。 “依赖图完整、转换顺序明确、产物可追溯,内容变化与资源标识变化一致”限定了3.6.1 HTTP缓存策略的适用域:条目24只能通过让内容变化驱动标识和失效推进交付,由内容哈希、缓存头和清单复核,而同URL覆盖长期缓存构成反事实检查。

3.6.2 覆盖更新与增量更新

公开坐标 25/32。 在“第 3 章 构建”的条目25中,3.6.2 覆盖更新与增量更新用于让内容变化驱动标识和失效;先声明工程输入与责任人,再用内容哈希、缓存头和清单复核产物,出现同URL覆盖长期缓存时不能继续交付。

3.6.3 按需加载与多模块架构场景下的增量更新

公开坐标 26/32。 3.6.3 按需加载与多模块架构场景下的增量更新进入“第 3 章 构建”后要回答第26张证据卡:它怎样建立显式依赖与封装边界、向下一阶段交付什么、由哪些导入导出和副作用证明,并怎样排除文件夹等同模块。

3.6.4 webpack实现增量更新构建方案

公开坐标 27/32。 围绕“怎样证明同一提交和锁定环境得到同一逻辑产物,并让缓存只失效真正变化的资源?”,坐标27把3.6.4 webpack实现增量更新构建方案解释为由依赖图编排工程能力;独立复核者先读取入口、模块、产物和边界再判断工程状态,不能接受打包器包办所有职责这种捷径。

3.7 资源定位

公开坐标 28/32。 对“第 3 章 构建”而言,3.7 资源定位的最小合同是把职责连接能力与反馈,第28次检查保存责任、输入和度量;若产生工具数量代替能力,就回到上游版本和契约重新验证。

3.7.1 资源定位的历史变迁

公开坐标 29/32。 第29个公开条目3.7.1 资源定位的历史变迁服务于把源码、依赖图、语言与样式转换、模块、缓存和资源定位编成确定性产物,需要以责任、输入和度量呈现把职责连接能力与反馈;工具数量代替能力会破坏“依赖图完整、转换顺序明确、产物可追溯,内容变化与资源标识变化一致”,因此属于拒绝条件。

3.7.2 常规的资源定位思维

公开坐标 30/32。 学习者在“第 3 章 构建”中讨论3.7.2 常规的资源定位思维前预测把职责连接能力与反馈会改变哪项工程状态,再读取责任、输入和度量;观察到工具数量代替能力时必须恢复已知产物,不能移动验收标准。

3.7.3 webpack的逆向注入模式

公开坐标 31/32。 大型前端仓库同时处理ECMAScript、Babel、CSS预处理、PostCSS、图片和按需模块,要定位一次无源代码变化的缓存失效。 在条目31处理3.7.3 webpack的逆向注入模式时,要把由依赖图编排工程能力写进流水线,把入口、模块、产物和边界写进运行记录,并把打包器包办所有职责写进失败样本。

3.8 总结

公开坐标 32/32。 “依赖图完整、转换顺序明确、产物可追溯,内容变化与资源标识变化一致”限定了3.8 总结的适用域:条目32只能通过封闭该章职责与证据推进交付,由正式条目和相邻章节复核,而跨章任意混排构成反事实检查。

先预测,再操作三个工程实验

分步1 / 3

1. 体系节点与交付契约

逐个选择“源文件、解析与模块图、Babel/PostCSS转换、分块与资源、清单与内容哈希”,核对输入、动作、输出和门禁怎样连接“第 3 章 构建”。

体系节点

从版本化输入走到可晋级产物

怎样证明同一提交和锁定环境得到同一逻辑产物,并让缓存只失效真正变化的资源?

版本化输入

“第 3 章 构建”的源文件读取已版本化需求、模板或源码。

工程动作

按解析入口与依赖图处理源文件,不得读取未声明的可变输入。

可验证输出

源文件输出带版本、哈希或运行ID的工程证据,供下一节点验证。

晋级门

若发生“构建读取未固定的网络输入或时间戳,使相同提交产生不同内容哈希”,源文件必须停止而非越过“依赖图完整、转换顺序明确、产物可追溯,内容变化与资源标识变化一致”。

公开目录坐标:第3章 构建、3.1 构建功能解决的问题、3.2 配置API设计原则和编程范式约束、3.2.1 配置API设计、3.2.2 编程范式约束、3.3 ECMAScript与Babel、3.3.1 ECMAScript发展史、3.3.2 ES6的跨时代意义、3.3.3 Babel——真正意义的JavaScript编译、3.3.4 结合webpack与Babel实现JavaScript构建、3.4 CSS预编译与PostCSS、3.4.1 CSS的缺陷、3.4.2 CSS预编译器、3.4.3 PostCSS、3.4.4 webpack结合预编译与PostCSS实现CSS构建、3.4.5 案例:自动生成CSS Sprites功能实现、3.5 模块化开发、3.5.1 模块化与组件化、3.5.2 模块化与工程化、3.5.3 模块化开发的价值、3.5.4 前端模块化发展史、3.5.5 webpack模块化构建、3.6 增量更新与缓存、3.6.1 HTTP缓存策略、3.6.2 覆盖更新与增量更新、3.6.3 按需加载与多模块架构场景下的增量更新、3.6.4 webpack实现增量更新构建方案、3.7 资源定位、3.7.1 资源定位的历史变迁、3.7.2 常规的资源定位思维、3.7.3 webpack的逆向注入模式、3.8 总结

第 3 章 构建的可重放交付协议

阶段工程动作必留证据拒绝条件
解析入口与依赖图按解析入口与依赖图处理源文件,不得读取未声明的可变输入。提交、依赖、模板与配置版本输入版本不完整
执行可审计转换按执行可审计转换处理解析与模块图,不得读取未声明的可变输入。运行ID、测试、清单与产物哈希构建读取未固定的网络输入或时间戳,使相同提交产生不同内容哈希
命名产物并注入资源位置按命名产物并注入资源位置处理Babel/PostCSS转换,不得读取未声明的可变输入。审批、环境、入口与回滚目标无法返回已验证产物
unit: "feng-unit-03"
question: "怎样证明同一提交和锁定环境得到同一逻辑产物,并让缓存只失效真正变化的资源?"
scenario: "大型前端仓库同时处理ECMAScript、Babel、CSS预处理、PostCSS、图片和按需模块,要定位一次无源代码变化的缓存失效。"
nodes:
  [
    "源文件",
    "解析与模块图",
    "Babel/PostCSS转换",
    "分块与资源",
    "清单与内容哈希",
  ]
stages: ["解析入口与依赖图", "执行可审计转换", "命名产物并注入资源位置"]
invariant: "依赖图完整、转换顺序明确、产物可追溯,内容变化与资源标识变化一致"
fault: "构建读取未固定的网络输入或时间戳,使相同提交产生不同内容哈希"
evidence: "提交、锁文件、运行环境、配置、依赖图、转换链、产物清单、内容哈希、缓存头和资源引用。"
reset: restore_node_mode_step_gates_and_artifact

该协议要求“第 3 章 构建”在相同提交、依赖锁、配置和外部服务下重放。重置后若节点、执行位置或发布门没有回到基线,交互状态已经污染比较,不能作为工程证据。

本页回顾

掌握“第 3 章 构建”不是记住工具命令,而是能围绕“怎样证明同一提交和锁定环境得到同一逻辑产物,并让缓存只失效真正变化的资源?”重建工程状态,并用“依赖图完整、转换顺序明确、产物可追溯,内容变化与资源标识变化一致”拒绝“构建读取未固定的网络输入或时间戳,使相同提交产生不同内容哈希”。最终交付为提交、锁文件、运行环境、配置、依赖图、转换链、产物清单、内容哈希、缓存头和资源引用。

练习与答案

练习

  1. 问题 1:工程合同。 “第 3 章 构建”为什么必须先声明提交、依赖、配置与责任边界?
  1. 问题 2:目录逐项覆盖。 怎样证明公开条目已经进入机制、交互和练习?
  1. 问题 3:故障恢复。 怎样证明“构建读取未固定的网络输入或时间戳,使相同提交产生不同内容哈希”已经被修正?

名词解释

名词解释

本章出现的专业名词,用大白话再讲一遍。

构建

对应“第3章 构建”;在“第 3 章 构建”中用于封闭该章职责与证据,需要连接输入、产物、版本与责任。

构建功能解决的问题

对应“3.1 构建功能解决的问题”;在“第 3 章 构建”中用于把构建声明成确定性转换,需要连接输入、产物、版本与责任。

配置API设计原则和编程范式约束

对应“3.2 配置API设计原则和编程范式约束”;在“第 3 章 构建”中用于由依赖图编排工程能力,需要连接输入、产物、版本与责任。

配置API设计

对应“3.2.1 配置API设计”;在“第 3 章 构建”中用于把构建声明成确定性转换,需要连接输入、产物、版本与责任。

编程范式约束

对应“3.2.2 编程范式约束”;在“第 3 章 构建”中用于把构建声明成确定性转换,需要连接输入、产物、版本与责任。

ECMAScript与Babel

对应“3.3 ECMAScript与Babel”;在“第 3 章 构建”中用于把语法目标转换为兼容产物,需要连接输入、产物、版本与责任。

ECMAScript发展史

对应“3.3.1 ECMAScript发展史”;在“第 3 章 构建”中用于把语法目标转换为兼容产物,需要连接输入、产物、版本与责任。

ES6的跨时代意义

对应“3.3.2 ES6的跨时代意义”;在“第 3 章 构建”中用于把语法目标转换为兼容产物,需要连接输入、产物、版本与责任。

Babel

对应“3.3.3 Babel——真正意义的JavaScript编译”;在“第 3 章 构建”中用于把语法目标转换为兼容产物,需要连接输入、产物、版本与责任。

工程条目10

对应“3.3.4 结合webpack与Babel实现JavaScript构建”;在“第 3 章 构建”中用于由依赖图编排工程能力,需要连接输入、产物、版本与责任。

CSS预编译与PostCSS

对应“3.4 CSS预编译与PostCSS”;在“第 3 章 构建”中用于按有序插件处理样式与资源,需要连接输入、产物、版本与责任。

CSS的缺陷

对应“3.4.1 CSS的缺陷”;在“第 3 章 构建”中用于按有序插件处理样式与资源,需要连接输入、产物、版本与责任。

CSS预编译器

对应“3.4.2 CSS预编译器”;在“第 3 章 构建”中用于按有序插件处理样式与资源,需要连接输入、产物、版本与责任。

PostCSS

对应“3.4.3 PostCSS”;在“第 3 章 构建”中用于按有序插件处理样式与资源,需要连接输入、产物、版本与责任。

工程条目15

对应“3.4.4 webpack结合预编译与PostCSS实现CSS构建”;在“第 3 章 构建”中用于由依赖图编排工程能力,需要连接输入、产物、版本与责任。

案例

对应“3.4.5 案例:自动生成CSS Sprites功能实现”;在“第 3 章 构建”中用于按有序插件处理样式与资源,需要连接输入、产物、版本与责任。

模块化开发

对应“3.5 模块化开发”;在“第 3 章 构建”中用于建立显式依赖与封装边界,需要连接输入、产物、版本与责任。

模块化与组件化

对应“3.5.1 模块化与组件化”;在“第 3 章 构建”中用于建立显式依赖与封装边界,需要连接输入、产物、版本与责任。

模块化与工程化

对应“3.5.2 模块化与工程化”;在“第 3 章 构建”中用于用反馈、差异与风险衡量体系,需要连接输入、产物、版本与责任。

模块化开发的价值

对应“3.5.3 模块化开发的价值”;在“第 3 章 构建”中用于建立显式依赖与封装边界,需要连接输入、产物、版本与责任。

前端模块化发展史

对应“3.5.4 前端模块化发展史”;在“第 3 章 构建”中用于建立显式依赖与封装边界,需要连接输入、产物、版本与责任。

webpack模块化构建

对应“3.5.5 webpack模块化构建”;在“第 3 章 构建”中用于由依赖图编排工程能力,需要连接输入、产物、版本与责任。

增量更新与缓存

对应“3.6 增量更新与缓存”;在“第 3 章 构建”中用于让内容变化驱动标识和失效,需要连接输入、产物、版本与责任。

HTTP缓存策略

对应“3.6.1 HTTP缓存策略”;在“第 3 章 构建”中用于让内容变化驱动标识和失效,需要连接输入、产物、版本与责任。

覆盖更新与增量更新

对应“3.6.2 覆盖更新与增量更新”;在“第 3 章 构建”中用于让内容变化驱动标识和失效,需要连接输入、产物、版本与责任。

工程条目26

对应“3.6.3 按需加载与多模块架构场景下的增量更新”;在“第 3 章 构建”中用于建立显式依赖与封装边界,需要连接输入、产物、版本与责任。

工程条目27

对应“3.6.4 webpack实现增量更新构建方案”;在“第 3 章 构建”中用于由依赖图编排工程能力,需要连接输入、产物、版本与责任。

资源定位

对应“3.7 资源定位”;在“第 3 章 构建”中用于把职责连接能力与反馈,需要连接输入、产物、版本与责任。

资源定位的历史变迁

对应“3.7.1 资源定位的历史变迁”;在“第 3 章 构建”中用于把职责连接能力与反馈,需要连接输入、产物、版本与责任。

常规的资源定位思维

对应“3.7.2 常规的资源定位思维”;在“第 3 章 构建”中用于把职责连接能力与反馈,需要连接输入、产物、版本与责任。

webpack的逆向注入模式

对应“3.7.3 webpack的逆向注入模式”;在“第 3 章 构建”中用于由依赖图编排工程能力,需要连接输入、产物、版本与责任。

总结

对应“3.8 总结”;在“第 3 章 构建”中用于封闭该章职责与证据,需要连接输入、产物、版本与责任。

资料与写作方式声明

本章以周俊鹏《前端工程化:体系设计与实践》权威目录界定学习范围,并结合正文列出的技术资料独立重写;不宣称复现原书正文,也不沿用原作表述。

原作版权归作者与出版社所有;本站原创教学结构与表述仅供学习交流。

讨论

评论区加载中…