node-sass 迁移至 dart-sass 踩坑实录
更新目标
- node-sass -> sass ( dart-sass )
- 减少影响面,非必要不更新其他依赖的版本
- 在前两条基础上,看看能否提升 node.js 的版本
抛弃 node-sass 的理由
- node-sass 已经停止维护,dart-sass 是 sass 官方主推的继任者
- node-sass 在 windows 下的安装非常麻烦,npm 安装时需要开发机上同时装有 python2 和 Microsoft Visual C++
- 在安装 node-sass 时,需要从 Github 拉取资源,在特定网络环境下成功率并不高
项目依赖版本现状
node@^12vue@^2webpack@^3vue-loader@^14sass-loader@^7.0.3node-sass@^4
更新思路
node.js
webpack 官方并没有提供 webpack 3 支持的最高 node 版本,且即使 webpack 官方支持,webpack 的相关插件也未必支持。因此 node 版本能否更新就只能自己试。好在尽管这个项目的 CI/CD 跑在 node 12,但我日常都在用 node 14 开发,因此顺势将 node 版本提升至 14。
webpack、sass-loader
webpack 的版本目前处于非必要不更新的定时炸弹状态,基于现有的 webpack 3 限制,所支持的最高 sass-loader 版本就是 ^7 ( sass-loader 在 8.0.0 版本的更新日志中明确指出 8.0.0 版本需要 webpack 4.36.0)。
如果项目中 sass-loader@^7 支持使用 dart-sass 就可以不更新 sass-loader,也就不必更新 webpack 版本;反之,就需要同步更新 webpack 至 4,再视情况定下 sass-loader 的版本。
那么到底支不支持呢?我在 webpack 官方文档介绍 sass-loader 的页面找到了这样一段 package.json 片段
{ "devDependencies": { "sass-loader": "^7.2.0", "sass": "^1.22.10" }}这证明起码在 sass-loader@7.2.0 这一版本就已经支持 dart-sass 了,因此 webpack 版本可以停留在 ^3,而 sass-loader 暂时停留在 7.0.3 版本,如果后续有问题可以更新到 ^7 版本中最新的 7.3.1 版本。
dart-sass
sass-loader@^7 所支持的最高 sass 我并没有查到,Github Copilot 信誓旦旦地告诉我
官方文档引用:
sass-loader@^7.0.0 requires node-sass >=4.0.0 or sass >=1.3.0, <=1.26.5.
建议:
- 如果需要使用更高版本的
sass,请升级到sass-loader8 或更高版本。
但事实上,我并没有在互联网上找到这段文本的蛛丝马迹。并且在 sass 的 ~1.26 版本中最后一个版本是 1.26.11 而非 1.26.5,根据常见的 npm 版本号原则,major version 和 minor version 不变,只改变了 patch version 的发版一般只有 bugfix 而没有 breaking change,不至于从 1.26.5 更新到 1.26.11 就突然不支持 sass-loader 7 了,因此更可能是 AI 幻觉或者是训练数据受限。
出于谨慎考虑,最终决定采用 webpack 官方文档中提到的 sass 1.22 的最后一个版本,也就是 1.22.12。
分析完成,动手更新
剩余内容已隐藏
查看完整文章以阅读更多
剩余内容已隐藏