css2class 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/API.md +1143 -0
  2. package/CHANGELOG.md +291 -0
  3. package/CONFIG.md +1096 -0
  4. package/CONTRIBUTING.md +571 -0
  5. package/MIGRATION.md +402 -0
  6. package/README.md +634 -0
  7. package/bin/class2css.js +380 -0
  8. package/class2css.config.js +124 -0
  9. package/common.css +3 -0
  10. package/configs/colors.config.js +62 -0
  11. package/configs/layout.config.js +110 -0
  12. package/configs/spacing.config.js +37 -0
  13. package/configs/typography.config.js +41 -0
  14. package/docs/.vitepress/config.mjs +65 -0
  15. package/docs/.vitepress/theme/custom.css +74 -0
  16. package/docs/.vitepress/theme/index.js +7 -0
  17. package/docs/guide/cli.md +97 -0
  18. package/docs/guide/concepts.md +63 -0
  19. package/docs/guide/config-template.md +365 -0
  20. package/docs/guide/config.md +275 -0
  21. package/docs/guide/faq.md +202 -0
  22. package/docs/guide/getting-started.md +83 -0
  23. package/docs/guide/important-and-static.md +67 -0
  24. package/docs/guide/incremental.md +162 -0
  25. package/docs/guide/rules-reference.md +354 -0
  26. package/docs/guide/units.md +57 -0
  27. package/docs/index.md +68 -0
  28. package/package.json +49 -0
  29. package/run.js +90 -0
  30. package/src/README.md +571 -0
  31. package/src/core/CacheManager.js +650 -0
  32. package/src/core/CompatibilityAdapter.js +264 -0
  33. package/src/core/ConfigManager.js +431 -0
  34. package/src/core/ConfigValidator.js +350 -0
  35. package/src/core/EventBus.js +77 -0
  36. package/src/core/FullScanManager.js +430 -0
  37. package/src/core/StateManager.js +631 -0
  38. package/src/docs/DocsServer.js +179 -0
  39. package/src/example.js +106 -0
  40. package/src/generators/DynamicClassGenerator.js +674 -0
  41. package/src/index.js +1046 -0
  42. package/src/parsers/ClassParser.js +572 -0
  43. package/src/parsers/ImportantParser.js +279 -0
  44. package/src/parsers/RegexCompiler.js +200 -0
  45. package/src/utils/ClassChangeTracker.js +366 -0
  46. package/src/utils/ConfigDiagnostics.js +673 -0
  47. package/src/utils/CssFormatter.js +261 -0
  48. package/src/utils/FileUtils.js +230 -0
  49. package/src/utils/Logger.js +150 -0
  50. package/src/utils/Throttle.js +172 -0
  51. package/src/utils/UnitProcessor.js +334 -0
  52. package/src/utils/WxssClassExtractor.js +137 -0
  53. package/src/watchers/ConfigWatcher.js +413 -0
  54. package/src/watchers/FileWatcher.js +133 -0
  55. package/src/writers/FileWriter.js +302 -0
  56. package/src/writers/UnifiedWriter.js +370 -0
  57. package/styles.config.js +250 -0
@@ -0,0 +1,202 @@
1
+ # 常见问题
2
+
3
+ 本页按“能最快定位问题”的方式组织:先看现象,再给最短修复路径,最后给进一步的排查方向。
4
+
5
+ ## 配置相关
6
+
7
+ ### 配置冲突
8
+
9
+ **问题**:出现 `CSS property conflict detected for 'font-size'` 错误
10
+
11
+ **解决**:
12
+ 1. 运行配置诊断工具检查冲突:
13
+ ```javascript
14
+ const ConfigDiagnostics = require('class2css/src/utils/ConfigDiagnostics');
15
+ const diagnostics = new ConfigDiagnostics(eventBus, configManager);
16
+ const results = await diagnostics.runFullDiagnostics();
17
+ console.log(diagnostics.generateReport());
18
+ ```
19
+ 2. 检查 `cssName` 和 `atomicRules` 中是否有重复定义
20
+ 3. 使用配置验证工具自动修复:
21
+ ```javascript
22
+ const ConfigValidator = require('class2css/src/core/ConfigValidator');
23
+ const validator = new ConfigValidator(eventBus);
24
+ const result = validator.validateConfig(config);
25
+ if (!result.isValid) {
26
+ const fixed = validator.autoFix(config);
27
+ }
28
+ ```
29
+
30
+ ### 单位不一致
31
+
32
+ **问题**:警告 `Unit inconsistency detected`
33
+
34
+ **解决**:
35
+ 1. 启用 `autoDetect`:
36
+ ```javascript
37
+ system: {
38
+ unitStrategy: {
39
+ autoDetect: true,
40
+ propertyUnits: { /* ... */ }
41
+ }
42
+ }
43
+ ```
44
+ 2. 统一单位配置,确保所有相关配置使用相同的单位
45
+
46
+ 如果你想系统理解单位规则,建议直接阅读 [单位与转换策略](./units.md)。
47
+
48
+ ### 配置文件找不到
49
+
50
+ **问题**:`Configuration file not found`
51
+
52
+ **解决**:
53
+ 1. 确保项目根目录存在 `class2css.config.js`
54
+ 2. 或使用 `-c` 参数指定配置文件路径:
55
+ ```bash
56
+ class2css -c ./my-config.js
57
+ ```
58
+
59
+ ## 性能相关
60
+
61
+ ### 性能问题
62
+
63
+ **问题**:CSS 生成速度慢
64
+
65
+ **解决**:
66
+ 1. 启用缓存:
67
+ ```javascript
68
+ system: {
69
+ compression: true
70
+ }
71
+ ```
72
+ 2. 使用增量更新模式
73
+ 3. 检查文件监听范围,避免监听不必要的目录
74
+
75
+ ### 内存使用过高
76
+
77
+ **问题**:工具占用内存过多
78
+
79
+ **解决**:
80
+ 1. 检查缓存配置,适当降低缓存大小
81
+ 2. 使用增量模式,减少全量扫描频率
82
+ 3. 检查是否有大量未使用的 class 累积
83
+
84
+ ## 增量模式相关
85
+
86
+ ### 输出文件不断增长
87
+
88
+ **问题**:使用增量模式后,输出文件越来越大
89
+
90
+ **解决**:
91
+ 1. 这是增量模式的正常行为(只增不删)
92
+ 2. 定期重启工具,`rebuildOnStart: true` 会自动清理
93
+ 3. 手动删除输出文件后重启,会重新生成干净的文件
94
+
95
+ ### appendDelta 模式不生效
96
+
97
+ **问题**:设置了 `uniFileWriteMode: 'appendDelta'` 但没有效果
98
+
99
+ **解决**:
100
+ 1. 确保 `rebuildOnStart: true`(appendDelta 模式要求)
101
+ 2. 确保 `cssOutType: 'uniFile'`
102
+ 3. 检查输出文件是否包含 `/* CLASS2CSS:BASE */` 和 `/* CLASS2CSS:DELTA_START */` 标记
103
+
104
+ ## 文件监听相关
105
+
106
+ ### 文件变更不触发更新
107
+
108
+ **问题**:修改文件后,CSS 没有更新
109
+
110
+ **解决**:
111
+ 1. 检查文件是否在监听范围内(`multiFile.entry.path`,支持 `string | string[]` 多入口)
112
+ 2. 检查文件扩展名是否匹配(`multiFile.entry.fileType`)
113
+ 3. 确认监听模式已启用(未使用 `--no-watch`)
114
+ 4. 检查文件保存是否完整(某些编辑器可能分步保存)
115
+
116
+ ### 监听延迟
117
+
118
+ **问题**:文件变更后,CSS 更新有延迟
119
+
120
+ **解决**:
121
+ 1. 这是正常的防抖行为,避免频繁更新
122
+ 2. 延迟通常在 100ms 以内
123
+ 3. 如需立即更新,可以手动触发全量扫描
124
+
125
+ ## 输出相关
126
+
127
+ ### CSS 格式不正确
128
+
129
+ **问题**:生成的 CSS 格式不符合预期
130
+
131
+ **解决**:
132
+ 1. 检查 `system.cssFormat` 设置:
133
+ - `'multiLine'`:多行格式
134
+ - `'singleLine'`:单行格式
135
+ - `'compressed'`:压缩格式
136
+ 2. 检查 `system.sortClasses` 是否启用排序
137
+
138
+ ### 输出文件路径错误
139
+
140
+ **问题**:输出文件不在预期位置
141
+
142
+ **解决**:
143
+ 1. 检查 `output.path` 配置(相对路径基于配置文件所在目录)
144
+ 2. 使用绝对路径避免路径问题
145
+ 3. 使用 CLI 参数 `-o` 覆盖输出路径:
146
+ ```bash
147
+ class2css -o ./dist
148
+ ```
149
+
150
+ ## 诊断工具
151
+
152
+ ### 运行配置诊断
153
+
154
+ ```javascript
155
+ const ConfigDiagnostics = require('class2css/src/utils/ConfigDiagnostics');
156
+
157
+ const diagnostics = new ConfigDiagnostics(eventBus, configManager);
158
+ const results = await diagnostics.runFullDiagnostics();
159
+ console.log(diagnostics.generateReport());
160
+
161
+ // 获取优化建议
162
+ const suggestions = diagnostics.generateOptimizationSuggestions();
163
+ console.log(suggestions);
164
+ ```
165
+
166
+ ### 获取优化建议
167
+
168
+ 诊断工具会自动生成优化建议,包括:
169
+ - 高优先级:配置错误,必须修复
170
+ - 中优先级:配置警告,建议修复
171
+ - 低优先级:最佳实践建议
172
+
173
+ ## 其他问题
174
+
175
+ ### 版本兼容性
176
+
177
+ **问题**:从旧版本升级后出现问题
178
+
179
+ **解决**:
180
+ 1. Class2CSS 完全向后兼容旧版配置
181
+ 2. 旧版配置会自动映射到新版结构
182
+ 3. 使用兼容性适配器迁移:
183
+ ```javascript
184
+ const CompatibilityAdapter = require('class2css/src/core/CompatibilityAdapter');
185
+ const adapter = new CompatibilityAdapter(eventBus);
186
+ const adaptedConfig = adapter.adaptConfig(oldConfig);
187
+ ```
188
+
189
+ ### 获取帮助
190
+
191
+ 如果以上方法无法解决问题:
192
+
193
+ 1. 查看 [GitHub Issues](https://github.com/wnagchi/css2class/issues)
194
+ 2. 提交新的 Issue,附上:
195
+ - 配置文件(脱敏后)
196
+ - 错误信息
197
+ - 复现步骤
198
+ - 环境信息(Node 版本、操作系统等)
199
+
200
+ ## 下一步
201
+
202
+ - 跑通一次并确认输出是否符合预期:阅读 [快速开始](./getting-started.md)
@@ -0,0 +1,83 @@
1
+ # 快速开始
2
+
3
+ 你将完成:安装 → 写最小配置 → 运行生成 → 在模板中使用类名。
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install css2class --save-dev
9
+ ```
10
+
11
+ :::tip 推荐
12
+ 如果你希望用一条命令直接跑起来,也可以使用 `npx class2css`(前提是已安装到项目里)。
13
+ :::
14
+
15
+ ## 运行方式
16
+
17
+ ### 监听模式(开发)
18
+
19
+ ```bash
20
+ # 启动工具(默认监听模式)
21
+ npm run start
22
+
23
+ # 开发模式(文件监听)
24
+ npm run dev
25
+ ```
26
+
27
+ ### 单次构建(CI/构建)
28
+
29
+ ```bash
30
+ # 构建模式(单次扫描后退出,不监听)
31
+ npm run build
32
+ ```
33
+
34
+ ### 帮助与版本
35
+
36
+ ```bash
37
+ npm run help
38
+ npm run version
39
+ ```
40
+
41
+ ## 创建最小配置
42
+
43
+ 在项目根目录创建 `class2css.config.js`:
44
+
45
+ ```javascript
46
+ module.exports = {
47
+ system: { baseUnit: 'rpx', unitConversion: 2, cssFormat: 'compressed' },
48
+ output: {
49
+ path: '../dist',
50
+ fileName: 'styles.wxss',
51
+ },
52
+ cssName: {
53
+ m: { classArr: ['margin'], unit: 'rpx' },
54
+ w: { classArr: ['width'], unit: 'rpx' },
55
+ h: { classArr: ['height'], unit: 'rpx' },
56
+ },
57
+ };
58
+ ```
59
+
60
+ :::tip 下一步
61
+ 把配置写“可维护”,并开启单位策略/排序/诊断等能力:建议直接阅读 [配置指南](./config.md) 并从示例配置改起。
62
+ :::
63
+
64
+ ## 使用类名
65
+
66
+ ```html
67
+ <view class="m-10 w-100 h-200"></view>
68
+ ```
69
+
70
+ 你会得到类似(取决于单位配置):
71
+
72
+ ```css
73
+ .m-10 { margin: 20rpx; }
74
+ .w-100 { width: 200rpx; }
75
+ .h-200 { height: 400rpx; }
76
+ ```
77
+
78
+ ## 下一步
79
+
80
+ - 先把“语法与规则”弄清楚:阅读 [类名语法与生成规则](./concepts.md)
81
+ - 需要知道有哪些命令:阅读 [CLI](./cli.md)
82
+ - 想性能更稳:了解 [增量模式(只增不删)](./incremental.md)
83
+
@@ -0,0 +1,67 @@
1
+ # Important 与静态类
2
+
3
+ 本页解释两件事:
4
+
5
+ - **Important 标识**:如何用后缀把某条规则变成 `!important`
6
+ - **静态类**:如何把一段固定 CSS 作为“预设类”注册并复用
7
+
8
+ ## Important 标识
9
+
10
+ ### 使用方式
11
+
12
+ ```html
13
+ <view class="m-10-i p-20-i"></view>
14
+ ```
15
+
16
+ 会生成:
17
+
18
+ ```css
19
+ .m-10-i { margin: 20rpx !important; }
20
+ .p-20-i { padding: 40rpx !important; }
21
+ ```
22
+
23
+ ### 配置:importantFlags
24
+
25
+ 你可以配置允许的后缀列表:
26
+
27
+ ```js
28
+ module.exports = {
29
+ importantFlags: {
30
+ suffix: ['-i', '_i'], // 例如 w-100-i / w-100_i
31
+ },
32
+ };
33
+ ```
34
+
35
+ :::warning 注意
36
+ Important 只是在生成规则时追加 `!important`,它无法替代更合理的样式组织。建议只在“必须覆盖第三方样式/遗留样式”时使用。
37
+ :::
38
+
39
+ ## 静态类(baseClassName)
40
+
41
+ 静态类适合放“不会变化的片段”,例如布局容器、常用 flex 组合等:
42
+
43
+ ```js
44
+ module.exports = {
45
+ baseClassName: {
46
+ container: 'max-width: 1200rpx; margin: 0 auto;',
47
+ flex: 'display: flex;',
48
+ 'flex-center': 'display: flex; justify-content: center; align-items: center;',
49
+ },
50
+ };
51
+ ```
52
+
53
+ 使用:
54
+
55
+ ```html
56
+ <view class="container flex-center"></view>
57
+ ```
58
+
59
+ :::tip 经验
60
+ 静态类适合“语义化的组合”,原子类适合“可参数化的规则”。两者结合往往比单独使用更好维护。
61
+ :::
62
+
63
+ ## 下一步
64
+
65
+ - 类名解析全貌:阅读 [类名语法与生成规则](./concepts.md)
66
+ - 单位策略:阅读 [单位与转换策略](./units.md)
67
+
@@ -0,0 +1,162 @@
1
+ # 增量模式(只增不删)与 appendDelta
2
+
3
+ 增量模式是 Class2CSS 的高级功能,主要用于**统一文件模式(`cssOutType: 'uniFile'`)**,解决"历史输出文件累积了旧 class,不希望工具主动删除"的场景。
4
+
5
+ :::tip 什么时候值得用
6
+ 当你的项目很大、写入频繁,或者输出文件会被外部工具/人工修改时,增量模式能显著降低“全量重写”的 I/O 成本,同时让输出更可控。
7
+ :::
8
+
9
+ ## 适用场景
10
+
11
+ - 输出文件可能被其他工具或手动编辑修改
12
+ - 希望保留历史生成的 class,即使当前项目暂时未使用
13
+ - 需要更快的增量更新性能(appendDelta 模式)
14
+
15
+ ## 配置选项
16
+
17
+ ### incrementalOnlyAdd
18
+
19
+ 启用"只增不删"模式。
20
+
21
+ - **类型**:`boolean`
22
+ - **默认值**:`false`
23
+ - **说明**:当设置为 `true` 时,运行期新增的 class 会被保护,不会因为后续文件变化而删除。
24
+
25
+ ### incrementalBaseline
26
+
27
+ 基线来源策略。
28
+
29
+ - **类型**:`string`
30
+ - **默认值**:`'fromOutputFile'`
31
+ - **可选值**:
32
+ - `'fromOutputFile'`:从输出文件中解析已存在的 class 作为基线
33
+
34
+ ### rebuildOnStart
35
+
36
+ 启动时是否重建输出文件。
37
+
38
+ - **类型**:`boolean`
39
+ - **默认值**:`true`
40
+ - **说明**:开启后会全量扫描并覆盖写出一次,输出文件会被"清理到只包含当前项目使用的 class",然后进入运行期只增不删。推荐开启,保证每次启动输出文件都是干净且排序好的。
41
+
42
+ ### unusedReportLimit
43
+
44
+ 未使用 class 报告的最大显示数量。
45
+
46
+ - **类型**:`number`
47
+ - **默认值**:`200`
48
+ - **说明**:启动重建时,如果发现上一版输出文件中存在但当前项目未使用的 class,会在控制台打印。此配置限制打印的示例数量,避免输出过长。
49
+
50
+ ### uniFileWriteMode
51
+
52
+ 统一文件写入策略。
53
+
54
+ - **类型**:`string`
55
+ - **默认值**:`'rewrite'`
56
+ - **可选值**:
57
+ - `'rewrite'`:统一文件写入保持兼容(防抖全量覆盖写)
58
+ - `'appendDelta'`:启动时写入 BASE 段 + `DELTA_START` 标记;运行期仅把新增 class 的 CSS 追加到文件末尾(更快、减少重写)
59
+
60
+ **注意**:当 `uniFileWriteMode='appendDelta'` 时,`rebuildOnStart` 必须为 `true`(否则历史垃圾无法自动清理)。
61
+
62
+ ## 配置示例
63
+
64
+ ```javascript
65
+ module.exports = {
66
+ multiFile: {
67
+ entry: {
68
+ // 扫描/监听入口:
69
+ // - string:单目录/单文件
70
+ // - string[]:多目录/多文件(目录与文件可混用)
71
+ path: "./src",
72
+ fileType: ["wxml", "html"],
73
+ },
74
+ output: {
75
+ cssOutType: "uniFile",
76
+ path: "./dist",
77
+ fileName: "styles.wxss",
78
+
79
+ // 增量"只增不删"
80
+ incrementalOnlyAdd: true,
81
+ incrementalBaseline: "fromOutputFile",
82
+ rebuildOnStart: true,
83
+ unusedReportLimit: 200,
84
+
85
+ // 统一文件写入策略
86
+ uniFileWriteMode: "appendDelta", // or 'rewrite'
87
+ },
88
+ },
89
+ };
90
+ ```
91
+
92
+ ## appendDelta 模式
93
+
94
+ `appendDelta` 模式提供了更快的增量更新性能,通过追加写入而非全量重写来减少文件 I/O。
95
+
96
+ ### 输出文件结构
97
+
98
+ `appendDelta` 模式下输出文件会包含标记:
99
+
100
+ ```css
101
+ /* CLASS2CSS:BASE */
102
+ .w-100 { width: 200rpx; }
103
+ .m-10 { margin: 20rpx; }
104
+ /* ... 其他基础样式 ... */
105
+
106
+ /* CLASS2CSS:DELTA_START */
107
+ .new-class-1 { /* 新增的样式 */ }
108
+ .new-class-2 { /* 新增的样式 */ }
109
+ ```
110
+
111
+ - `/* CLASS2CSS:BASE */`:启动重建写入的基础段(压缩/排序后的全量结果)
112
+ - `/* CLASS2CSS:DELTA_START */`:增量追加段起点(运行期新增 class 会追加到该标记之后)
113
+
114
+ ### 工作流程
115
+
116
+ 1. **启动时**:
117
+ - 读取旧输出文件,提取已存在的 class 作为基线
118
+ - 执行全量扫描,清理上一次运行累积的多余规则
119
+ - 生成 BASE CSS(全量生成,压缩+排序)
120
+ - 写入 BASE + DELTA_START 标记(覆盖写,清空旧 DELTA)
121
+ - 报告未使用的 class(如果存在)
122
+
123
+ 2. **运行期**:
124
+ - 文件变更时,只追加新增 class 的 CSS 到 DELTA_START 之后
125
+ - 新增的 class 自动加入 baseline,保证只增不删
126
+
127
+ ### 优势
128
+
129
+ - **性能提升**:只追加新增内容,避免全量重写
130
+ - **减少 I/O**:文件写入次数和大小显著减少
131
+ - **保持基线**:BASE 段保持压缩和排序,DELTA 段追加新内容
132
+
133
+ ### 注意事项
134
+
135
+ - `rebuildOnStart` 必须为 `true`,否则历史垃圾无法自动清理
136
+ - DELTA 段会随时间增长,建议定期重建(重启工具即可)
137
+ - 如果需要完全清理,可以手动删除输出文件后重启
138
+
139
+ ## 标准模式 vs 增量模式
140
+
141
+ ### 标准模式(incrementalOnlyAdd: false)
142
+
143
+ - 文件变更时,会删除不再使用的 class
144
+ - 输出文件始终保持"干净",只包含当前使用的 class
145
+ - 适合:希望输出文件始终保持最小化的场景
146
+
147
+ ### 增量模式(incrementalOnlyAdd: true)
148
+
149
+ - 文件变更时,只新增 class,不删除已存在的 class
150
+ - 输出文件可能随时间增长
151
+ - 适合:需要保留历史 class 或输出文件可能被外部修改的场景
152
+
153
+ ## 最佳实践
154
+
155
+ 1. **推荐开启 rebuildOnStart**:保证每次启动输出文件都是干净且排序好的
156
+ 2. **定期检查未使用的 class**:关注启动时的 unused 报告
157
+ 3. **使用 appendDelta 提升性能**:在大型项目中,appendDelta 模式可以显著提升增量更新速度
158
+ 4. **合理设置 unusedReportLimit**:避免控制台输出过长
159
+
160
+ ## 下一步
161
+
162
+ - 了解统一文件输出与基础配置:阅读 [配置指南](./config.md)