2024 年 4 月 10 日
你现在可以使用 rspack.CssExtractRspackPlugin
作为 mini-css-extract-plugin
的替代。
这在一些场景很实用,例如当内置的 CSS 处理不能满足你的需求,有更定制化的 CSS Modules name 等,或者你想要使用一些依赖 css-loader 的 loader,但仍然想要将 CSS 提取成单独文件。
详细配置见 CssExtractRspackPlugin。
你可以在这里找到一个基础的项目例子。
Rspack 在 0.1.0 支持了基本的 tree shaking 功能,由于最初的架构还未稳定, 我们使用了相对简单的方法实现了基础版的 tree shaking(仅支持未使用导出删除),但是随着 Rspack 功能的完善,架构逐渐稳定 基础的 tree shaking 无法满足用户的需求,比如:
为了解决以上问题,我们决定使用类似 webpack 的方案,自底向上重新实现整个优化流程,并在 0.4.2 引入 experiments.rspackFuture.newTreeshaking
配置,来实验性的开启新的优化算法。
经过 4 个月 bug 修复和优化,新的 tree shaking 算法已经相对稳定,因此我们决定在 0.6.0 默认开启新的 tree shaking 算法。
experiments.rspackFuture.disableApplyEntryLazily
选项自 v0.5.0 已被默认开启,并在 v0.6.0 中被删除。
compiler.build
与 compiler.rebuild
不属于 Webpack 公开 API,目前已经被移除。
移除 builtins.css
,请使用引入的 CSS 相关的 module.parser
和 module.generator
选项进行替代。
同时,从 v0.6.0 版本开始,Rspack 的 experiments.css
将会以 webpack 的 experiments.css
为目标进行对齐,这意味着和 webpack experiments.css
一样在未来将不再支持不支持 CSS 变量的浏览器。因此,对于那些需要使用尚未得到 experiments.css
支持的配置,或者需要兼容老版本浏览器的项目,我们推荐迁移至 rspack.CssExtractRspackPlugin
。
在 v0.6.0 中,我们引入了三种新的模块类型的 module.generator
和 module.parser
选项:css/auto
、css
和 css/module
,这些选项只有在启用 experiments.css 时才会生效,关于如何使用可查看这个例子。
在 module.parser
选项中,css
、css/auto
和 css/module
模块类型都包含了 namedExports
属性。它取代了 builtins.css.namedExports
配置。
对于 module.generator
选项,css/auto
和 css/module
模块类型提供了 exportsOnly
、exportsConvention
和 localIdentName
属性。css
类型只包含 exportsOnly
和 exportsConvention
属性。exportsOnly
、exportsConvention
和 localIdentName
分别取代了 builtins.css.modules.exportsOnly
、builtins.css.modules.localsConvention
和 builtins.css.modules.localIdentName
。
除此之外,还包括一些关于默认值的修改:
exportsConvention
的值从 'asIs'
, 'camelCaseOnly'
等变更为 'as-is'
, 'camel-case-only'
等,以保持与 webpack experiments.css
的一致。
namedExports: false
支持同时使用默认导出(default export)、命名导出(named export)和命名空间导出(namespace export),在此之前它只支持使用默认导出:
namedExports
的默认值从 false
变更为 true
,这意味着你需要默认使用命名空间导入(例如 import * as classes from './style.css'
)或命名导入(例如 import { class1 } from './style.css'
),这将提高与未来原生 CSS 模块的兼容性。而这并不意味着你需要一次性迁移所有的导入,你可以通过设置 namedExports: false
来禁用此行为,并且由于现在 namedExports: false
也支持命名导出和命名空间导出,因此你可以逐步迁移这些导入。
localIdentName
的默认值在从在开发模式下 '[path][name][ext]__[local]'
和在生产模式下 '[hash]'
变更为在开发和生产模式下都是 '[uniqueName]-[id]-[local]'
,这将略微改善 CSS 产物的 gzip 压缩大小。
exportsOnly
的默认值在 target: 'node'
下由原来的 false
变更为 true
。
CSS 默认规则的模块类型从 css
变更为 css/auto
,css/auto
将自动解析以 .module.
或 .modules.
为中缀的 CSS 文件作为 CSS Modules 处理,这与 css-loader
的 modules.auto: true
行为一致,这将简化使用 less 或 sass 与 CSS Modules 的规则书写。
升级 Rust crate swc_core
到 0.90.x
,这会对使用 SWC Wasm 插件的用户产生影响。
当多个 chunk 中 CSS 顺序不一致时会发出警告,假如你有两个 entry,entryA 和 entryB,entryA 中引入 a.css 然后引入 b.css,而 entryB 中引入 b.css 然后引入 a.css。 当满足 splitChunks 条件时,a.css 和 b.css 会成为单独 chunk,这个 chunk 中 a.css 和 b.css 的顺序无法保证,会产生如下的警告
如果你确定他们的顺序不一致没有关系,可以通过配置 ignoreWarnings
来忽略这种错误。
如果你曾经使用 Webpack 和 mini-css-extract-plugin
,只需要将 mini-css-extract-plugin
换成 rspack.CssExtractPlugin
即可。
module.parser["css/auto"].namedExports
替代 builtins.css.namedExports
。module.generator["css/auto"].exportsOnly
替代 builtins.css.modules.exportsOnly
。module.generator["css/auto"].exportsConvention
替代 builtins.css.modules.localsConvention
。module.generator["css/auto"].localIdentName
替代 builtins.css.modules.localIdentName
。以上出现的 "css/auto"
为 CSS 默认的模块类型,可根据需要修改为 "css"
或 "css/module"
。
添加以下配置将保持原有 builtins.css
默认行为,可根据以下配置根据需要进行修改:
如需要对部分模块进行配置,可使用 module.rules
中的 rule.parser
和 rule.generator
选项进行配置。
compiler.build
或 compiler.rebuild
已经被废弃,请切换到 compiler.run
进行构建,与重新构建。
在 0.6.0
中,Rust crate swc_core
的版本升级到 0.90.x
,使用到的 SWC Wasm 插件需要确保其使用的 swc_core
的版本一致性,否则可能产生无法预知的问题。
详情请参考文档。