Jekyll Sass Converter 3.0 迁移指南:从 libsass 到 Dart Sass 的架构升级
【免费下载链接】jekyll:globe_with_meridians: Jekyll is a blog-aware static site generator in Ruby项目地址: https://gitcode.com/gh_mirrors/je/jekyll
Jekyll Sass Converter 3.0 是随 Jekyll 4.3 及以上版本一同发布的重大版本更新,其核心变化是彻底弃用sassc(即 libsass 绑定),改用sass-embeddedgem 作为 Dart Sass 的接口,将样式表转换引擎切换到当前 Sass 官方主推、仍在积极开发中的实现。本文以 Jekyll Sass Converter 3.0 发布公告为骨架,结合当前仓库源码与配置,完整梳理 v3.0 的迁移要点、被移除的配置选项、行为差异以及升级后的实际使用方式,帮助读者平滑完成从 Ruby Sass / libsass 工作流到 Dart Sass 工作流的过渡。
一、为什么升级:libsass 已被废弃
发布公告明确指出,v3.0 之前 Jekyll Sass Converter 依赖sasscgem 完成 Sass 编译,而sassc底层接口的是libsass——Sass 的次级实现。libsass 的维护者已经宣布弃用该项目,因此继续基于sassc构建转换器不再可持续。
v3.0 的应对方案是改用sass-embeddedgem,它充当Dart Sass(Sass 当前的主要实现、仍在积极开发)与 Ruby 之间的桥接层。这意味着从 v3.0 开始,Jekyll 站点的 Sass/SCSS 编译由 Dart Sass 完成。
这一变化是上游实现层面的替换,对最终输出的 CSS 产物而言,绝大多数现有站点无需改动即可继续工作;但由于Dart Sass 与旧版 Ruby Sass 并不完全兼容,部分依赖旧实现"特性"的配置与用法必须在升级时调整——这正是下文迁移指南要解决的问题。
二、环境要求
v3.0 对运行环境提出了明确的下限要求(原文即如此,适用于所有平台):
| 项目 | 最低版本 |
|---|---|
| Ruby | 2.6.0(所有平台) |
| Rubygems | 3.3.22(仅 Linux 平台) |
需要说明的是,这里的 Ruby 版本下限是 jekyll-sass-converter 3.0 自身的要求。若与 Jekyll 4.3 一同使用,还应同时满足 Jekyll 本身的版本约束——当前仓库的 jekyll.gemspec 声明 Jekyll 4.x 要求 Ruby>= 2.7.0,因此实际升级时建议以两者中更高的版本为准。同时,仓库对 jekyll-sass-converter 的依赖声明为">= 2.0", "< 4.0"(见 jekyll.gemspec),即 Jekyll 4.3 起会安装 3.x 系列。
三、迁移指南:被移除的配置选项
1. 移除sass.implementation选项
v2.2.0 曾引入sass.implementation配置项,允许用户在多个 Sass 实现之间切换。由于 v3.0.x 中sass-embedded(Dart Sass)是唯一受支持的实现,该选项已被移除。升级后,_config.yml中任何形如implementation:的配置都应删除。
2. 移除sass.add_charset选项
v2.x 时代,转换器会在sassify/scssify过滤器的输出中自动写入@charset "UTF-8";声明或U+FEFF(字节序标记 BOM)。v3.0 起转换器不再输出这两类内容,因此冗余的sass.add_charset选项也随之失效。
这里需要解释sassify/scssify是什么:它们是 Jekyll 内置的 Liquid 过滤器,用于在模板或文件中把 Sass/SCSS 字符串就地转换为 CSS。其实现位于 lib/jekyll/filters.rb,通过find_converter_instance找到对应的Jekyll::Converters::Sass/Jekyll::Converters::Scss转换器实例并调用其convert方法。仓库测试 test/test_filters.rb 中也验证了这两个过滤器的基本行为(如sassify("$blue:#123456; p{color: $blue}")这类字符串转换)。
3. 移除sass.line_comments选项
sass-embedded不支持sass.line_comments选项。该选项原本用于在输出的 CSS 中生成源码行注释(方便调试定位),升级后需从配置中移除;如需类似调试能力,可改用 Dart Sass 生态中其他调试手段,但不能再通过该配置项实现。
四、迁移指南:行为与导入方式的变更
除选项移除外,v3.0 还收紧了若干导入行为,这些收紧实际上源于旧版转换器的"bug 副作用"——官方选择在 v3.x 中修正,而由于这些行为已在生产环境大量使用,v2.x 分支会保留原样。
1. 不再支持非标准扩展名的导入
sass-embedded只允许导入扩展名为.sass、.scss或.css的文件。特别要注意:扩展名为.css的文件中如果书写 SCSS 语法,将直接报语法错误。升级前应检查所有@import的文件是否使用了这三种扩展名之一。
2. 不再支持相对站点源目录(site source)的导入
在 v2.x 中,即使站点源目录没有被列入 Sass 的load_paths选项,转换器也允许使用相对站点源目录的路径进行导入——这是转换器的一个 bug 副作用,官方因该行为在线上被广泛使用而在 v2.x 中保留。
v3.x 中这类导入开箱即用将不再生效。如果需要继续使用相对站点源目录的导入,必须把.(表示当前目录,即站点源目录)显式加入load_paths选项,例如:
sass: load_paths: - .3. 不再支持与父文件同名的导入
v2.x 中,转换器允许从sass_dir或load_paths导入与父文件同名的文件(同样源于一个 bug 副作用,v2.x 保留原样)。例如在css/main.scss中@import "main",试图导入_sass/main.scss这种做法,在 Jekyll 4 中本就不被允许。
v3.x 中这类导入会形成循环导入(circular import)。修复方式有两种:
- 重命名父文件或导入目标文件,使二者不同名;
- 在
@import中使用从父文件出发的完整相对路径。
仓库文档 Sass/SCSS 配置说明 也提示:VSCode 中对
@import "main";的警告可以忽略(不影响 SCSS 功能),但 Jekyll 4 确实不允许同名 sass 页面(如css/main.scss)导入同名的_sass/main.scss局部文件——这与上述循环导入问题同源。
4. Dart Sass 与 Ruby Sass 的行为差异
除了上述迁移点,Dart Sass 与 Ruby Sass 之间还存在着若干有意的行为差异,官方文档将其汇总为 "Behavioral Differences from Ruby Sass" 清单。升级后若发现输出样式与旧版有出入,应优先排查该清单中的差异项(例如函数行为、运算精度、错误信息格式等方面)。本仓库无法复现该清单全文,建议以 Dart Sass 官方文档为准进行核对。
五、升级后的实际使用:与 Jekyll 的集成方式
升级到 v3.0 后,Jekyll 的 Sass 工作流整体保持不变,以下内容均基于当前仓库可验证。
1. 文件如何被识别与处理
Jekyll 通过扩展名识别 Sass 资产:lib/jekyll/convertible.rb中定义了sass_file?(见 convertible.rb),仅当扩展名为.sass或.scss时返回 true;asset_file?(convertible.rb)则把 Sass/SCSS 与 CoffeeScript 一并归类为资产文件,这类文件不会套用页面布局(place_in_layout?返回 false)。
使用方法与 v2.x 完全一致:在站点源目录中创建带.sass或.scss扩展名的文件,并以两行三横线(空 front matter)开头,例如css/styles.scss,构建后输出到目标目录下对应位置css/styles.css。详见 Assets 文档。
2.sass_dir:局部文件目录与导入查找路径
所有@import引用的局部文件(partials)应放在sass_dir中,其默认值为<source>/_sass。若使用@import,需在_config.yml中显式声明:
sass: sass_dir: _sass注意两点(来自 Assets 文档 与 Sass 配置文档):
sass_dir仅作为 Sass 导入的查找路径(load path),Jekyll 本身并不直接跟踪这些文件;因此该目录下的局部文件不应包含空 front matter,否则不会被按预期转换,该目录只应存放被导入的内容;sass_dir等sass配置中的目录路径是相对于站点source目录解析的,而不是相对于_config.yml所在位置。
本仓库自带的 docs/css/screen.scss 就是一个典型示例:它以@import "mixins";、@import "normalize";、@import "gridism";、@import "pygments";、@import "font-awesome";、@import "fonts";、@import "docsearch";、@import "style";的方式引入docs/_sass/下的多个局部文件——这正是 v3.0 仍然支持的常规导入方式。
3. 输出样式与完整配置示例
style选项仍然有效,用于控制 CSS 输出格式,可取值包括 Sass 支持的任何输出风格(如expanded、compressed)。例如本仓库自己的 docs/_config.yml 就使用了压缩输出:
sass: style: compressed一个 v3.0 兼容的完整配置示例(合并了迁移要点):
sass: sass_dir: _sass # 局部文件目录,也是默认导入查找路径 style: compressed # 输出样式:expanded / compressed 等 # 以下为 v3.0 已移除的选项,切勿再写: # implementation: ... # add_charset: ... # line_comments: ... # 如需支持相对站点源目录的导入,显式添加: # load_paths: # - .六、升级检查清单
综合发布公告与仓库信息,从 v2.x 升级到 v3.0 时建议按以下顺序自查:
- 环境:确认 Ruby 版本不低于 2.6.0;Linux 平台确认 Rubygems 不低于 3.3.22;
- 配置清理:从
_config.yml的sass:段中移除implementation、add_charset、line_comments三个选项; - 导入扩展名:检查所有
@import文件,确保扩展名为.sass、.scss或.css,且.css文件中不得出现 SCSS 语法; - 相对站点源目录的导入:若仍在使用,需在
load_paths中显式加入.; - 同名文件导入:排查是否存在"父文件导入同名列"(如
css/main.scss导入_sass/main.scss)的情况,通过重命名或使用完整相对路径修复; - 输出差异:构建后比对新旧 CSS 输出,如遇差异,查阅 Dart Sass 官方的 "Behavioral Differences from Ruby Sass" 清单确认是否为有意行为变化。
完成上述调整后,站点即可在 Jekyll 4.3+ 上以 Dart Sass 作为转换引擎正常构建,享受到 Sass 官方主推实现带来的持续维护与演进。
【免费下载链接】jekyll:globe_with_meridians: Jekyll is a blog-aware static site generator in Ruby项目地址: https://gitcode.com/gh_mirrors/je/jekyll
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考