
前端构建工具【免费下载链接】css-blocksHigh performance, maintainable stylesheets.项目地址https://gitcode.com/gh_mirrors/cs/css-blocks点击查看免费下载导读本文以 css-blocks 项目根目录 CHANGELOG.md 为骨架梳理该项目从 0.17.0 到 1.5.0 的完整演进脉络并结合仓库源码core、cli、config、eyeglass、ember、bem-to-blocks 等包逐一印证每个里程碑背后的实现细节。读完本文你将掌握 css-blocks 的核心架构Block 解析、配置解析、同步/异步双工厂、CLI 的 validate/convert 命令用法、Eyeglass 同步预处理接入方式、Ember/Glimmer 集成方案以及错误报告机制MultipleCssBlockErrors、sourcemap 映射等关键实战能力并能直接依据源码路径深入探索。css-blocks 是一个由 LinkedIn 维护的、基于 PostCSS 的样式系统 monorepo当前仓库版本 1.5.0见 lerna.json其核心目标是High performance, maintainable stylesheets以*.block.css文件描述可复用样式块通过模板分析器Analyzer与重写器Rewriter在编译期把模板中的样式引用替换为最优化的 CSS 类名从而获得高性能、可维护的样式输出。1. 仓库形态与版本管理基线在深入各版本之前先明确仓库的工程组织方式这有助于理解 CHANGELOG 中大量条目所指向的包。Monorepo 工具使用 Lerna Yarn Workspaces见根目录 package.json 与 lerna.json。packages/css-blocks/*下的所有包构成一个统一发布单元版本号保持一致当前为 1.5.0。发布规范CHANGELOG 顶部声明遵循 Conventional Commits 中的约束因此每次发布都会自动生成结构化的变更记录。包清单从目录结构可见core核心 Block 解析/编译/分析、cli命令行工具、config配置加载、broccoliBroccoli 插件、eyeglassSass/Eyeglass 预处理适配、ember / ember-app / ember-cli / ember-utils / glimmerEmber 与 Glimmer 集成、jsxJSX/Babel 集成、webpackwebpack 插件、bem-to-blocksBEM 语法转换、runtime运行时样式计算、language-server / vscode语言服务器与编辑器集成、test-utils 等。版本节奏从 2017 年底的 0.17.0 到 2020 年 9 月的 1.5.0历经 0.x 功能迭代、1.0.0-alpha 系列、1.0.0 正式版再到 1.5.0 的增量演进。2. 0.17 – 0.19核心抽象成型BlockTree、冲突检测、优化分析这一阶段的变更集中在css-blocks/core为后续所有功能打下基础。2.1 BlockTree 抽象与类型安全0.18.0 的 Features 中密集出现 BlockTree 相关条目Added BlockPath parser、Broke up Block.ts, refactored foundational BlockObject constructs, added StateGroup concept、Full type safety for all BlockTree objects、Remove BlockTree abstraction、Generisize StateGroup and State to Attribute and AttrValue。从当前源码看这些抽象最终沉淀为 BlockTree 目录 下的Block、BlockClass、Attribute、AttrValue、Style、Styles、RulesetContainer、Inheritable等类。其中StateGroup/State被泛化为Attribute/AttrValue意味着样式块的状态state被统一建模为属性-值对这直接支撑了后续属性组attribute groups的运行时数据输出1.3.0 特性。BlockPath 解析器则位于 BlockSyntax/BlockPath.ts负责解析block.class这类路径语法。从源码结构可以推断这一系列重构的目标是让 Block 树上的每个节点都具备编译期可校验的类型为冲突检测见 2.2提供可靠基础。2.2 冲突解决Conflict Resolution与媒体查询0.18.0 引入Conflict Resolution Validator其实现对应 BlockCompiler/ConflictResolver.ts 与 BlockCompiler/conflictDetection.ts。1.0.0-alpha.4 又修复了Conflict Resolutions with Media Queries#372即冲突检测必须考虑媒体查询作用域。验证这些逻辑的测试在 validations/property-conflict-validator-test.ts。冲突解决器负责在多个样式同时命中同一元素时判定哪些属性声明相互冲突、哪些可以安全合并这正是可维护样式的核心保障——它保证样式冲突在编译期被显式解决而不是留到运行时由 CSS 层叠规则裁决。2.3 优化分析opticss的接入0.18.0 的Support opticss enabled analysis of css-blocks意味着核心开始接入 opticss 优化引擎。当前源码中Analyzer 的优化相关配置通过 Analyzer/Analyzer.ts 的optimizationOptions传递CLI 的 convert-test.ts 与 opticss-test.ts 分别覆盖了 CLI 与 core 层的优化流程。生产构建默认开启优化是在 1.0.0-alpha.4见下文第 5 节。3. 0.20 – 0.24CLI、preprocessor、Ember 生态与错误体验提升3.1 CLI 的诞生与演进0.22.0 创建了css-blocks/cliInitial implementation、Add preprocessor support to the cli0.23.0 声明了 bin 脚本0.23.1 修复了缺失的 bin。当前 cli/src/index.ts 展示了完整命令体系css-blocks cmd [options] block-dir-or-file...validate blocks..校验 block 文件语法。传目录时会递归发现目录下的**/*.block.*文件1.4.0 特性如果传给 validate CLI 的是目录则发现 blocks在此实现见 cli/src/index.ts 中fse.statSync(blockFile).isDirectory()分支。校验通过输出绿色ok失败则输出红色错误并统计错误数。convert files..调用css-blocks/bem-to-blocks把 BEM 语法转换为 block 文件语法详见第 7 节。全局选项--preprocessors js-file导出按扩展名映射的预处理函数、--npm允许从 node_modules 导入、--alias alias dir定义导入别名隐含--npm。CLI 的validate会先在待校验文件所在目录向上搜索 css-blocks 配置文件searchForConfiguration来自css-blocks/config再把--preprocessors/--npm/--alias选项合并进配置最后用BlockFactory逐个加载并解析 block 文件。3.2 错误报告体验sourcemap 与源码上下文0.24.0 带来一批错误体验改进Display selector error locations using sourcemapsUse sourcemaps for errors involving non-selector nodesTrack ranges instead of only the start position for errorscli: Display error in context with the source files contents这些在 cli/src/index.ts 的handleCssBlockError/displayError/displaySnippet中得到完整实现CLI 能区分CascadingError显示caused前缀并递归到根因与MultipleCssBlockErrors逐条列出所有子错误当错误位置带generated映射时会先显示编译产物中的位置再显示 sourcemap 映射回源码的位置并高亮出错的代码行与具体列区间splitLineOnErrorRange。核心层的错误类型定义见 core/src/errors.ts其中charInFile、errorHasRange、hasMappedPosition正是 CLI 判断能否展示源码片段的依据。3.3 包导入能力npm 与别名0.23.0 的 Imports via npm and aliases 对应 core/src/importing/NodeJsImporter.ts它允许block指令从 node_modules 解析也支持配置别名。CLI 的--npm/--alias选项即用于创建该 importercli/src/index.ts 中new NodeJsImporter(aliases)。1.0.0-alpha.0 进一步引入per block namespaces与block-alias语法使block myBlock from ./my-block.block.css这种按块命名空间的引用方式成为主流写法。3.4 Ember 集成与缓存失效0.20.0 系列完成了 Ember CLI 集成0.20.0-beta.8Use separate file for CSS staging, merge app.css at end —— 先把编译产物暂存到独立文件最后再与 app.css 合并避免编译过程污染应用样式。0.20.0-beta.3Ember CLI addon Preprocessor 支持。0.23.2通过ember-source的存在来检测 Ember 环境Detect ember by presence of ember-source。0.24.0Invalidate handlebar template caches when dependent blocks change—— 模板缓存必须随依赖 block 文件变化而失效。当前 ember/src/index.ts 展示了 addon 的完整接线setupPreprocessorRegistry注册htmlbars-ast-pluginoptionsForCacheInvalidation把aliases、analysisOpts、optimization、parserOpts组装成缓存键保证配置变化时 HTMLBars 插件缓存正确失效preprocessTree(css)阶段则把所有*.block.css及编译产物从 CSS 树中剔除withoutCssBlockFiles因为 block 文件已在模板树中被编译处理。4. 1.0.0-alpha 系列为正式版铺路的关键重构4.1 配置体系的最终定型Options → Configuration 重命名1.0.0-alpha.0 引入Configuration file API与Basic preprocessor support而 0.18.0 曾完成一轮大改名normalizeOptions→resolveConfiguration模块名改为resolverSparseOptions→OptionsReadonlyOptions→ResolvedConfigurationOptions→Configurationdata选项 →importerData当前源码 core/src/configuration/types.ts 定义了Configuration完整配置、Options用户可传入的PartialReadonlyConfiguration、ResolvedConfiguration已填充默认值的只读配置core/src/configuration/resolver.ts 的resolveConfiguration()负责把用户选项与默认值合并默认值如下配置项默认值说明outputModeOutputMode.BEM输出模式BEM 等见 OutputMode.tsimporterdefaultImporter负责按block指令定位 block 文件内容rootDir当前工作目录block 解析的根目录importerData{}传给 importer 的附加数据preprocessors/preprocessorsSync{}按语法扩展名声明的异步/同步预处理函数disablePreprocessChainingfalse是否禁用 css 预处理链见 6.2maxConcurrentCompiles4同时进行的 block 解析/编译数量上限guidAutogenCharacters5生成 block GUID 时使用的有效字符数其中guidAutogenCharacters的语义见 types.ts 注释是GUID 基于文件唯一标识符通常是绝对路径的哈希生成默认 5 个字符仅在极罕见的 GUID 冲突时才有必要调大。1.2.0 的 Use incoming GUIDs. Ensure uniqueness. 与 Only register guids from blocks that are valid1.4.0正是围绕 GUID 注册与冲突检测的后续打磨其实现可见 BlockFactorySync.ts 中的registerGuid调用——只有block.isValid()的块才注册 GUID出错块会重新解析。4.2 配置文件的同步加载与 CLI 接入1.1.0 与 1.2.0 两次提交 Make configuration loading synchronous with async wrapper#365searchSync(searchDirectory)从指定目录向上逐级查找css-blocks.config.json、css-blocks.config.js或package.json取其css-blocks键支持extends递归继承、rootDir/preprocessors/importer的路径解析与 JS 文件加载。search()searchSync的异步包装用于向后兼容。load(configPath)从已知路径显式加载配置文件。CLIcli/src/index.ts在validate中使用searchForConfiguration(searchDir)读取配置1.1.0 还修复了css-blocks 配置文件应优先于 package.jsonA css-blocks config file should take precedence over package.json这由 cosmiconfig 的searchPlaces顺序css-blocks.config.json→css-blocks.config.js→package.json保证。4.3 语言服务器与 VS Code 集成1.0.0-alpha.0 集中引入了 language-server 能力Basic workings of language server and vscode client、Code completion and definitions for per-block namespace syntax、Add document links provider、Adding a custom importer for the language-server、Adds custom css data for css-blocks at rules1.0.0-alpha.1 又补上 Adds find references capability。这些能力分布在 language-server/srccompletionProviders/emberCompletionProvider.ts、definitionProviders/emberDefinitionProvider.ts、documentLinksProviders/blockLinkProvider.ts分别对应补全、定义跳转与文档链接Importer.ts是语言服务器专用的自定义 importer需要容错地解析不完整文件VS Code 侧的自定义 CSS 数据block等 at-rule 的语法提示见 vscode/css-blocks.css-data.json。4.4 错误机制升级MultipleCssBlockErrors1.0.0-alpha.5 引入新错误类体系Adding a new class of errors - MultipleCssBlockErrors、Pass multiple errors to the language server并把 composes/export/import 等校验逐步迁移到多错误模型。其实现位于 core/src/errors.tsMultipleCssBlockErrors是CssBlockError的子类内部持有CssBlockError[]构造时自动扁平化嵌套的 MultipleCssBlockErrors处理传递性错误。CascadingError携带cause根因错误详情格式化errorDetails会递归展开多错误 级联错误树。1.4.0 的 Correctly count the errors in block files 保证错误计数准确CLI 中errorCount的累加逻辑见 cli/src/index.ts。这一机制是编译期错误报告体验的关键一个 block 文件可能同时存在多个语法/校验问题多错误模型让用户一次看到全部问题而不是修一个报一个。5. 1.0.0 正式版Node 版本策略与可选 Preprocessor1.0.02020-04-04是首个正式版本包含三项值得关注的变更5.1 破坏性变更Node 支持范围收窄### BREAKING CHANGES * Node 8 is now out of maintenance so we have dropped support for node 6 and 8. Node 11 is no longer needed because node 12 was released.即 1.0.0 起仅支持 Node 10 与 12在当时 LTS 语境下的合理收窄。这与仓库根 package.json 的 volta 配置node: 12.2.0一致。注意这是 2020 年的版本策略当前环境是否可用应以读者实际使用的 Node 版本为准——旧版本 css-blocks 可能需要兼容性处理。5.2 可选 Preprocessors 与库/应用 API 契约Optional Preprocessors library/application API contract 意味着预处理器变为可选如果某个语法没有声明 preprocessor且该文件就是css语法则直接透传内容见 BlockFactorySync.ts 中preprocessor()方法的最后一个分支css 文件返回恒等 preprocessor若是非 css 语法且未提供 preprocessor则抛错No preprocessor provided for ${syntaxName(syntax)}。5.3 style-of 与 eyeglass 包style-of1.0.0 的style-of: Allows positional arguments to be passed与Errors if unsupported params have been passed涉及 Glimmer/Ember 模板中的style-ofhelper1.0.0-alpha.5 为 glimmer 增加style-ofhelper#383 与 glimmer/test。eyeglass新增css-blocks/eyeglass包Adds new package that enables simple Eyeglass support。该包详见第 6 节。5.4 生产构建默认开启优化1.0.0-alpha.4 的 Enable optimization for production builds by default 意味着生产模式下样式会被 opticss 优化器深度精简去除不可达样式、合并规则集。相关配置读取逻辑可参考 ember-utils/src/options.ts 中isProduction相关的默认值处理。6. 1.1 – 1.5同步化革命与 Ember v2 管线这一阶段的主线是同步化同步 Block Factory、同步预处理、同步配置加载最终让 Ember v2 构建管线端到端受益。6.1 Synchronous Block Factory1.5.01.5.0 的 Synchronous Block Factory 引入BlockFactorySync实现在 core/src/BlockParser/BlockFactorySync.ts。其要点与异步BlockFactoryBlockFactory.ts共享BlockFactoryBaseBlockFactoryBase.ts文件头部注释明确提醒两个文件存在大量重复改动需保持同步。isSync: true标记同步身份getBlockFromPath要求绝对路径先经 importer 转为FileIdentifier再走getBlock。内部维护blocks与paths两个缓存字典保证同一 block 只解析一次Multiple instances of the same block will result in analysis and optimization bugs。处理ImportedCompiledCssFile预编译 CSS 文件导入时会读取定义文件definition AST构造 Block再把 CSS 规则合并进 Block_mergeCssRulesIntoDefinitionBlock并校验block-syntax-version1.2.0 的 Validate block-syntax-version相关常量见 PrecompiledDefinitions/block-syntax-version.ts。1.5.0 的 Update the debug identifier for BlockFactorySync 与 Remove some lingering traces of the async factory 属于对同步工厂的收尾清理。同步工厂的价值让 CLI、eyeglass、webpack loader 等无法或不适合使用异步 Promise 管线的场景也能直接使用 css-blocks 的完整解析能力。6.2 同步预处理与 Eyeglass 集成1.5.0 的 Update eyeglass integration to support synchronous preprocessing 与 eyeglass/src/index.ts 一一对应adaptor(sass, eyeglass, options)返回异步 preprocessor内部用sass.render eyeglass 编译产出content、sourceMap、dependenciesres.stats.includedFiles。adaptorSync(...)使用sass.renderSync的同步版本。DirectoryScopedPreprocessor限定只处理指定目录含子目录内文件的 preprocessor providerinit()中通过setEyeglassRoot把 eyeglass root 设为该目录。1.5.0 的修复 Set eyeglass root within a directory-scoped processor 与 Pass a copy of sass options for sync setup 都落在这里init()用cloneDeep(options)复制选项避免同步/异步两份配置互相污染同时提供setupOptionsSync?钩子供子类调整同步编译选项。adaptAll / adaptAllSync把多个 adaptor / provider 组合成一个统一的 preprocessor逐个尝试最后用兜底 adaptor。配置侧的同步接入是preprocessorsSync配置项见 4.1 表格BlockFactorySync的构造函数直接读取this.configuration.preprocessorsSyncBlockFactorySync.ts。6.3 预处理链preprocess chaining配置项disablePreprocessChaining控制的是这样一个行为见 BlockFactorySync.ts 的preprocessor()方法若某文件是 scss 等非 css 语法且同时声明了css语法的 preprocessor则默认会在该语法 preprocessor 之后再跑一遍 css preprocessor并把 sourcemap、dependencies 合并。设置disablePreprocessChaining: true可关闭此行为。6.4 Ember v2 管线ember-app、运行时数据与 sourcemap1.2.0 与 1.3.0 围绕Ember v2Glimmer/Octane 时代做了大量工作创建了css-blocks/ember-app包运行时数据生成ember-app/src/RuntimeDataGenerator.ts 生成运行时可用的样式计算数据Basic runtime data generation、Optimized css in ember-app build output、Enable optimizer and runtime rewriting of optimized styles。聚合重写数据ember-app/src/AggregateRewriteData.ts 定义聚合重写的数据 schema1.2.0 Data schema for Aggregate Rewriting1.3.0 的 Emit attribute groups in the runtime aggregate rewrite data 让运行时数据携带属性组信息。Sourcemap1.4.0 的 End-to-end sourcemaps for ember v2 pipeline 打通了从模板源 → 编译产物 → 源码的完整 sourcemap 链路。runtime 包runtime/src/runtime.ts 是运行时的样式求值逻辑1.3.0 Extract StyleEvaluator, StyleResolver classes from runtime service 将其从服务中抽离为独立类相关测试见 runtime/test/expression-test.ts。1.2.0 还修复了多个 Ember 集成细节Namespace blocks within each app/addon/engine每个 app/addon/engine 内对 block 命名空间隔离、Cache invalidation when block files change、Ensure compiled css is not in vendor.css/Exclude compiled blocks from vendor.css1.4.0编译产物不应混入 vendor.css、Only merge with app.css if it exists、Sometimes theres no css blocks output1.3.0等。6.5 1.5.0 的其他修复Pick up fix for opticss crash on unknown css declarations随 opticss 升级修复未知 CSS 声明导致的崩溃。Prune css-blocks.css from the output after concatenating it拼接后清理css-blocks.css残留CLI 侧 concat 相关逻辑见 cli/test/convert-test.ts。Add fileloc to class name conflict error 与 Class name collision detection类名冲突检测冲突时报错信息包含文件与位置。Scan app CSS for classes扫描应用 CSS 中的类名用于冲突检测。7. bem-to-blocksBEM 到 CSS Blocks 的转换器1.0.0-alpha.5 创建了css-blocks/bem-to-blocks包Creating a new package for bem to css-blocks conversionCLI 的convert命令即调用它。其实现 bem-to-blocks/src/index.ts两遍处理第一遍遍历所有选择器把 BEM 类名解析为BemSelectorblock/element/modifier 三段无法自动解析的类名通过 userInput.ts 交互式询问用户inquirer.js见 1.0.0-alpha.5 的 Making the CLI interactive using inquirer.js第二遍把每个 BEM 选择器重写为 block 语法。重写规则rewriteSelectorselement → 类名如.block__element→.elementmodifier → 状态属性如.block--is-active→ 属性[is-active]或带 subState 的[statesubState]直接挂在 block 上的修饰符 → 在:scope上表达状态。子状态优化constructBlocksMap对同一元素上多个 modifier 求最长公共子串LCS见 utils.ts 的findLcsMap把公共前缀提升为 state、剩余部分作为 subState同时去除is-前缀对应 1.0.0-alpha.5 的 Removing common prefixes from states, like, is。异步化1.0.0-alpha.5 的 Making bem-to-blocks asynchronous 反映在processBEMContents返回 Promise 上Address race condition by simplifying main loop for BEM conversion 则简化了主循环以规避竞态。CLI 用法示例从 cli/src/index.ts 与测试 cli/test/convert-test.ts 可见# 校验目录下所有 block 文件目录会被递归发现 css-blocks validate ./app/styles # 将 BEM 样式文件转换为 *.block.css css-blocks convert ./styles/button.css转换产物写为*.block.css文件名约定见 bem-to-blocks/src/index.ts 中ext: \.block${parsedFilePath.ext} 的逻辑。8. 1.4.0类名冲突检测与编译产物处理1.4.0 的三项特性值得单独说明类名冲突检测Class name collision detection配合 Scan app CSS for classes 与 Add fileloc to class name conflict errorcss-blocks 会扫描应用已有 CSS 中的类名若生成的类名与之冲突报错信息会带上具体文件与位置。这解决了生成的类名与手写 CSS 类名撞车这一真实场景问题。validate目录发现CLI 传目录时自动发现*.block.*文件已在 3.1 详述。拼接设置可覆盖Provide ability to override concat settingsEmber 管线中 CSS 拼接concat行为可通过配置覆盖相关文档修复 Typo in concat options docs 同步跟进。concat helper 的缺失在 1.3.1 中修复Add missing concat helper。9. 从 CHANGELOG 读出的工程实践与演进规律回顾完整版本史可以提炼出 css-blocks 的几条工程演进规律先抽象后集成0.18 时代先打磨 BlockTree 抽象与冲突检测1.0 时代再把这些能力开放为配置 API 与 CLI最后1.1–1.5才大规模接入 Ember v2 与同步管线。配置体系持续收敛从Options家族的反复重命名SparseOptions → Options → Configuration → ResolvedConfiguration可以看出团队在 1.0 之前刻意把用户可传入的选项与已解析的只读配置严格区分并统一收敛到resolveConfiguration()单一入口。错误报告是核心竞争力从 sourcemap 定位、行区间追踪、源码上下文展示到 MultipleCssBlockErrors 的多错误聚合整个错误体系在 0.24–1.0 期间被反复打磨说明编译期 DX开发者体验被当作一等公民对待。同步化是生态适配的关键Eyeglass、webpack loader、CLI 这些工具链往往运行在同步语境下BlockFactorySyncpreprocessorsSyncsearchSync的三同步组合让 css-blocks 能被更多构建工具直接消费。10. 延伸阅读深入仓库的入口若想进一步验证或研究本文所述内容建议从以下路径入手CHANGELOG.md本文的骨架来源每个版本条目都带 commit 链接。core/src/configuration配置类型与resolveConfiguration。core/src/BlockParserBlockFactory、BlockFactorySync、BlockFactoryBase、BlockParser与预处理逻辑preprocessing.ts。core/src/BlockCompiler冲突解决器与冲突检测。core/src/errors.ts错误类型体系含MultipleCssBlockErrors、CascadingError。cli/src/index.tsCLI 命令与错误展示实现。config/src/index.ts配置文件搜索与加载。eyeglass/src/index.tsSass/Eyeglass 同步/异步预处理适配。ember/src/index.ts 与 ember-app/srcEmber v2 集成与运行时数据生成。bem-to-blocks/src/index.tsBEM 转换器实现。各包test/目录如 core/test/opticss-test.ts、cli/test/convert-test.ts、runtime/test/expression-test.ts覆盖了本文引用的绝大多数行为。赞分享前端构建工具【免费下载链接】css-blocksHigh performance, maintainable stylesheets.项目地址https://gitcode.com/gh_mirrors/cs/css-blocks点击查看免费下载相关推荐VCR 版本演进全景解读从 0.1.0 到 6.4.0 的关键特性、破坏性变更与源码印证VCR 版本演进全景解读从 0.1.0 到 6.4.0 的关键特性、破坏性变更与源码印证 VCR 是 Ruby 生态中经典的 HTTP 交互录制回放reco测试开发工具factory_bot 版本演进史从 1.0 到 6.6 的关键特性、破坏性变更与源码解读factory_bot 版本演进史从 1.0 到 6.6 的关键特性、破坏性变更与源码解读 导读 本文以仓库根目录的 NEWS.md https://lin测试开发工具Sunshine 串流工具快速指南3 步把 PC 游戏送上电视Sunshine 串流工具快速指南3 步把 PC 游戏送上电视 从安装到把桌面串到电视只需 3 步一般 10 分钟内搞定。Sunshine 是一个自托管的音视频后端上一篇Traefik 安全访问 API 的 OIDC 认证方案基于授权码流的外部身份认证接入与配置全指南下一篇GitHub CLI 许可证合规机制解析gh licenses 命令背后的构建时嵌入原理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考