SWC Plugin
功能介绍
@dune2/swc-plugin 是一个 SWC 插件,主要提供以下功能:
Semi UI CSS 优化
针对 Semi UI 组件库的 CSS 引入进行优化,通过移除 JavaScript 文件中的 CSS import/require 语句来提升性能。这个功能对齐了 SemiWebpackPlugin 的 omitCss 功能。
示例:
// 以下 CSS 引入语句会被移除
import "@douyinfe/semi-foundation/lib/es/button/button.css";
require("@douyinfe/semi-foundation/lib/cjs/badge/badge.css");
Semi UI 模块化导入优化
提供类似 babel-plugin-import 的能力,优化 Semi UI 的 barrel file 导出,通过精确导入文件来加快编译速度。
国际化函数处理
插件提供了强大的国际化函数处理能力,主要包括以下特性:
模板字符串转换
自动将标签模板字符串转换为标准的国际化函数调用格式:
// 输入
t`hello ${name}`;
// 输出
t("hello {name}", { name: name });
转换过程包括:
- 解析模板字符串中的变量表达式
- 生成标准化的参数对象
- 保持原始代码位置信息(span)以便调试
Trans 组件访问器
插件内置了 Trans 组件的访问器(Visitor)实现,用于处理国际化相关的 JSX 转换。主要功能包括:
- 识别和处理 Trans 组件的 JSX 元素
- 规范化 Trans 组件的子元素
- 自动处理 id 属性的生成和管理
- 确保 Trans 组件至少包含一个子元素
实现原理:
// 通过 VisitMut trait 实现访问器
impl VisitMut for TransVisitor {
// 处理 JSX 元素
fn visit_mut_jsx_element(&mut self, element: &mut JSXElement) {
// 1. 递归处理子元素
// 2. 验证是否为 Trans 组件
// 3. 规范化处理子元素
// 4. 生成和管理属性
}
}
配置选项
interface SwcPluginOptions {
// 是否开启 semi-css-omit,即是否移除 js 中的 css import/require
// 对齐 SemiWebpackPlugin 的 omitCss 功能
enable_semi_css_omit?: boolean;
// 优化 semi-ui 的 barrel file 导出
// 类似 babel-plugin-import 能力
// 精确导入文件,加快编译速度
enable_semi_modularize_import?: boolean;
// 外部额外配置的 semi-ui 的导入映射
extra_semi_import_map?: Record<
string,
{ path: string; is_named_import: boolean }
>;
}
使用方式
该插件已集成在 @dune2/next-plugin
中,通常情况下你无需直接使用它。如果你需要在其他场景使用,可以参考以下配置:
// next.config.js
module.exports = {
experimental: {
swcPlugins: [
[
"@dune2/swc-plugin",
{
enable_semi_css_omit: true,
enable_semi_modularize_import: true,
},
],
],
},
};
注意事项
- 插件的 CSS 优化功能仅对 Semi UI 相关的文件生效,不会影响其他文件的 CSS 引入。
- 模块化导入优化功能需要配合
enable_semi_modularize_import
选项使用。 - 如果你的项目中有自定义的 Semi UI 组件导入路径,可以通过
extra_semi_import_map
配置映射关系。 - Trans 组件必须包含至少一个子元素,否则插件会输出错误日志。
- 国际化函数的模板字符串转换会自动处理嵌套表达式,确保生成正确的参数对象。