yf-system-cli 1.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.
@@ -0,0 +1,11 @@
1
+ ## ▶️ 项目压缩使用方法
2
+
3
+ 基于 Node.js,可将项目中的 HTML、CSS 和 JS 文件进行压缩优化,并输出到 `dist/` 目录。
4
+
5
+ ### 1. 安装依赖
6
+
7
+ 首先,确保你已经安装了 [Node.js](https://nodejs.org/)(建议版本 >= 14),然后安装项目依赖;
8
+
9
+ ### 2. 执行打包压缩命令
10
+
11
+ 运行以下命令,启动打包压缩流程:node build.js
@@ -0,0 +1,119 @@
1
+ const fs = require('fs-extra');
2
+ const path = require('path');
3
+ const { minify: minifyHtml } = require('html-minifier-terser');
4
+ const CleanCSS = require('clean-css');
5
+ const Terser = require('terser');
6
+ const glob = require('glob');
7
+
8
+ // 工具函数:确保目录存在
9
+ async function ensureDir(filePath) {
10
+ const dir = path.dirname(filePath);
11
+ await fs.ensureDir(dir);
12
+ }
13
+
14
+ // 1. 压缩 HTML 文件
15
+ async function processHtmlFiles() {
16
+ const htmlFiles = glob.sync('**/*.html', { ignore: 'dist/**/*.html' });
17
+
18
+ for (const file of htmlFiles) {
19
+ const content = await fs.readFile(file, 'utf8');
20
+ const result = await minifyHtml(content, {
21
+ collapseWhitespace: true,
22
+ removeComments: true,
23
+ minifyCSS: true,
24
+ minifyJS: true,
25
+ });
26
+
27
+ if (result.error) {
28
+ } else {
29
+ const distPath = path.join('dist', file);
30
+ await ensureDir(distPath);
31
+ await fs.writeFile(distPath, result);
32
+ }
33
+ }
34
+ }
35
+
36
+ // 2. 压缩 CSS 文件(支持 @import 合并)
37
+ async function processCssFiles() {
38
+ const cssFiles = glob.sync('css/**/*.css', { ignore: 'dist/**/*.css' });
39
+
40
+ for (const file of cssFiles) {
41
+ try {
42
+ const content = await fs.readFile(file, 'utf8');
43
+ if (file === 'css/index.css') {
44
+ const content = await fs.readFile(file, 'utf8');
45
+ const distPath = path.join('dist', file);
46
+ await ensureDir(distPath);
47
+ await fs.writeFile(distPath, content);
48
+ continue;
49
+ }
50
+ const output = new CleanCSS({
51
+ inline: ['all'], // ✅ 关键:让 clean-css 自动处理 @import url(...)
52
+ }).minify(content);
53
+
54
+ if (output.errors && output.errors.length > 0) {
55
+
56
+ } else if (output.warnings && output.warnings.length > 0) {
57
+
58
+ } else {
59
+ const distPath = path.join('dist', file);
60
+ await ensureDir(distPath);
61
+ await fs.writeFile(distPath, output.styles);
62
+ }
63
+ } catch (err) {
64
+ }
65
+ }
66
+ }
67
+
68
+ // 3. 压缩 JS 文件
69
+ async function processJsFiles() {
70
+ const jsFiles = glob.sync('js/**/*.js', { ignore: 'dist/**/*.js' });
71
+
72
+ for (const file of jsFiles) {
73
+ const content = await fs.readFile(file, 'utf8');
74
+ const result = await Terser.minify(content, {
75
+ compress: true,
76
+ mangle: true,
77
+ format: { comments: false },
78
+ });
79
+
80
+ if (result.error) {
81
+ } else {
82
+ const distPath = path.join('dist', file);
83
+ await ensureDir(distPath);
84
+ await fs.writeFile(distPath, result.code);
85
+ }
86
+ }
87
+ }
88
+
89
+ // 4. 拷贝其他静态资源(如图片、字体,不压缩)
90
+ async function copyStaticAssets() {
91
+ const assets = glob.sync('**/*', {
92
+ nodir: true,
93
+ ignore: [
94
+ '**/*.html',
95
+ '**/*.css',
96
+ '**/*.js',
97
+ 'dist/**',
98
+ ],
99
+ });
100
+
101
+ for (const file of assets) {
102
+ const distPath = path.join('dist', file);
103
+ await ensureDir(distPath);
104
+ await fs.copyFile(file, distPath);
105
+ }
106
+ }
107
+
108
+ // 主函数
109
+ async function build() {
110
+ await fs.remove('dist'); // 清空旧的 dist(可选)
111
+ await fs.ensureDir('dist');
112
+
113
+ // await processHtmlFiles();
114
+ await processCssFiles();
115
+ await processJsFiles();
116
+ // await copyStaticAssets();
117
+ }
118
+
119
+ build().catch(console.error);
@@ -0,0 +1,18 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIC7DCCAdSgAwIBAgIQNIQXh1dJm75OaDuAUj2UiDANBgkqhkiG9w0BAQsFADAU
3
+ MRIwEAYDVQQDEwlsb2NhbGhvc3QwHhcNMjUwNDA0MTA0OTIxWhcNMzAwNDA0MDAw
4
+ MDAwWjAUMRIwEAYDVQQDEwlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IB
5
+ DwAwggEKAoIBAQDIBPR6mtqlRBDBMhwKCXZS/QJW7hSZEGdhWReTjzdr2VW4oB+j
6
+ qwkCW+EQrXqbFxL/ThtnJ/SyTgC2VSvyova5ziAsvxm/ehtX92rdI1hn1ikpfx86
7
+ iOP8mvDbijW4RTmcoaCVckMwaCuE/9U7weDHfWH/YMGBF1WwTf8nVj24g27TLn8D
8
+ oyoiw6QgNVma9TiyGa4eSScviz3Vm7FWY+K9CYH+iRNCh0o0qeo7Gj8hJxhNoPMc
9
+ ABXifBZDHo5eEl+ABXlrDvqDNTafHugS8zmj5HTCZQkRqCNo5pHQ8DJqtbzW+oMC
10
+ qA9C6WwQCI8rDtGqKnUtCnF2okhEhc6m1+HVAgMBAAGjOjA4MAsGA1UdDwQEAwIE
11
+ sDATBgNVHSUEDDAKBggrBgEFBQcDATAUBgNVHREEDTALgglsb2NhbGhvc3QwDQYJ
12
+ KoZIhvcNAQELBQADggEBAL5ysz6VHM/WruBjGVZYyfqig+Wxj6G2W6Vgkv8dUg6n
13
+ bbNqlYxsh7O7H904SgRAw5K1eJc3oGfz32vS/4V1QeeWvnXEPC9uvSkVPrXaLjR4
14
+ KpyeNgYCOrveNi9pP8QwOlflR9uMUpojbgDqUCclJVwWP2A/wbXaEJAF5br6KmCZ
15
+ CZLFHadahVY0GhpLu9AHXyuAm6DjV7BK43w4mgfBJvbg0HO6pLFIiTrU+lp+hBu5
16
+ jHeOcjfdygcnZb/of1cO9+5hMno4ApH/2XrZAWBNqi5GhnXVxihWXw6pXz121R7v
17
+ VbFLunYSesE0txP5AkoM+HMtHp84o/l+uQY5gn6RJ48=
18
+ -----END CERTIFICATE-----
@@ -0,0 +1,28 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDIBPR6mtqlRBDB
3
+ MhwKCXZS/QJW7hSZEGdhWReTjzdr2VW4oB+jqwkCW+EQrXqbFxL/ThtnJ/SyTgC2
4
+ VSvyova5ziAsvxm/ehtX92rdI1hn1ikpfx86iOP8mvDbijW4RTmcoaCVckMwaCuE
5
+ /9U7weDHfWH/YMGBF1WwTf8nVj24g27TLn8Doyoiw6QgNVma9TiyGa4eSScviz3V
6
+ m7FWY+K9CYH+iRNCh0o0qeo7Gj8hJxhNoPMcABXifBZDHo5eEl+ABXlrDvqDNTaf
7
+ HugS8zmj5HTCZQkRqCNo5pHQ8DJqtbzW+oMCqA9C6WwQCI8rDtGqKnUtCnF2okhE
8
+ hc6m1+HVAgMBAAECggEBALs1yA2pOtRMbNImsI/EY3cxUCtFEwpgjCJVXPfDqD/N
9
+ X6o6VOK/huMqU/FkLclTQ3iqBoP6pdDtqUT/Wu7zELK/9uVqyBKrm0QuU1s/ZdNq
10
+ Y4Rvcy86SQl5i84wAi/CuzWbIc4+8Bwyo+kL+uy/fj+5XyvDx9mnmZA2sIaE9afn
11
+ 1PPqgJVYKuSH4mBnXqy6KJ1REIwl2nUtPxYQOlMPPUBdtLyNBH59YqvG9m9Txnhc
12
+ rxmzQnA7I1TUwvHovMCWZVtJol2HyB5t8A6CpdArNoB3BsTQWD3YrS1NMqfbqcz2
13
+ NXHdL6msW3HG2dAyxgksNrHLLbsWEu2qCGQJ+l8WEVECgYEA3U2hNSDBGNH//KYv
14
+ 7CyZSg4vDYSI0FBdQKL8s9Kuso/t+4TTokPkHyhp1kDmtyWAtDVxi1MmdO+ce7Hb
15
+ Pq5tTlM+0/DI1lox+p4S7BBzqg+SrIdf57JLXulDsBtHmuIH3qlPzXVOS/Ypq8Jg
16
+ ng1FXwWGgLg5m1GD4vpZouv1wUcCgYEA52EPu3A6Bsdcxk8YFA1H7Wg6ohTO6zvm
17
+ AQ6QsuEab10wq/ogi3CU6CJUVcql5KZhoZ41zG8QZyvmMuM23P5xeZrCWWP+1cG4
18
+ IpgdYMdZBTSbeNGRmscTzYnThxdOzjhmAe+wNjdglgRnsWINrnVFGYGgKtohqN9V
19
+ oILFfmBzcgMCgYEAjj/uFYZeWKPz1eTE/RyV0+JWIGxGvRBLQNcDdFtCbAjUQk5Y
20
+ 8v6MzfJeRZgmNSdoGW4Y9COYnqW+gkwKz7mzDRu5UOZ/Ujlb0up040SX9IJaF4hU
21
+ /0u94t4x4itG1angwSE36Ks0juNGWd9x12ZUZwXYNTk13j6Bdg7SO0VNDNUCgYEA
22
+ 2lAOlACT/4lj1AkU4vaVAz/w8rVHd1SQ9DZV+THDy4fWQK5Evsx+83hQspH+bPs/
23
+ 60pn4Hh6tZ4KGcGhJms9jkujTMy4yd96acm1DneJWwwEFb9G7w8fdDOzTieDx7gX
24
+ J4SMcttVWrbVT90Ao7cqd6KDCWu/jqMLG+PHjDJdOxkCgYAJiTMnDfGze3YjUHlv
25
+ yhCR3Fy2lRJ95Gt+AW/VMjV3ozTtgCqNtAk1MM/0hqbyTDCxBqmEvYjmJFElUetl
26
+ txXZTBpyeuxVL2FuVU7eBTkQctF8PHuPiIJMyntmhcztwSxEqQ2r4De7yWiZk6Hs
27
+ BdXLj1fsrRrT6Ec16dsg+5ps0A==
28
+ -----END PRIVATE KEY-----