@taro-minify-pack/helper 0.1.4-alpha.3 → 0.1.4-alpha.4
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.
- package/README.md +149 -197
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,239 +1,191 @@
|
|
|
1
|
-
|
|
1
|
+
# @taro-minify-pack/helper
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> @taro-minify-pack 系列插件的公共工具库,提供资源上传、上传适配器定义等通用能力。
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
- `@taro-minify-pack/plugin-async-pack`: 异步加载主包代码,优化主包体积
|
|
8
|
-
- `@taro-minify-pack/plugin-remote-assets`: 远程资源上传,优化主包体积
|
|
9
|
-
- `@taro-minify-pack/plugin-cover-browserslist`: 根据微信小程序基础库版本自动设置 browserslist
|
|
10
|
-
- `@taro-minify-pack/plugin-bundle-analyzer`: 包体积分析工具
|
|
5
|
+
该包为系列插件提供底层支持,主要包含资源上传核心逻辑、上传适配器定义工具以及内置的阿里云 OSS 上传适配器,供 `@taro-minify-pack/plugin-remote-assets`、`@taro-minify-pack/plugin-bundle-stats` 等插件复用。
|
|
11
6
|
|
|
12
7
|
## ✨ 功能特性
|
|
13
8
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
| @taro-minify-pack/plugin-bundle-analyzer | 可视化分析包体积,帮助识别体积过大的模块和依赖 |
|
|
9
|
+
* 📤 资源并发上传,基于 PromisePool 控制并发数
|
|
10
|
+
* 🧩 上传适配器定义工具(`defineUploaderAdapter`),支持类型安全地自定义适配器
|
|
11
|
+
* ☁️ 内置阿里云 OSS 上传适配器,开箱即用
|
|
12
|
+
* 🔑 基于文件内容 MD5 的资源唯一性校验
|
|
13
|
+
* 📁 递归目录文件遍历工具
|
|
20
14
|
|
|
21
15
|
## 📦 安装
|
|
22
16
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
17
|
+
### npm
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
npm install @taro-minify-pack/helper
|
|
21
|
+
```
|
|
26
22
|
|
|
27
|
-
|
|
28
|
-
yarn add @taro-minify-pack/preset
|
|
23
|
+
### yarn
|
|
29
24
|
|
|
30
|
-
|
|
31
|
-
|
|
25
|
+
```sh
|
|
26
|
+
yarn add @taro-minify-pack/helper
|
|
32
27
|
```
|
|
33
28
|
|
|
34
|
-
|
|
29
|
+
### pnpm
|
|
30
|
+
|
|
31
|
+
```sh
|
|
32
|
+
pnpm add @taro-minify-pack/helper
|
|
33
|
+
```
|
|
35
34
|
|
|
36
|
-
|
|
35
|
+
## 🔧 API
|
|
36
|
+
|
|
37
|
+
### `uploadAssets(opt)`
|
|
38
|
+
|
|
39
|
+
扫描指定目录下的所有文件,并发上传至远程存储服务。
|
|
37
40
|
|
|
38
41
|
```ts
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
]
|
|
51
|
-
}
|
|
42
|
+
import { uploadAssets } from '@taro-minify-pack/helper'
|
|
43
|
+
|
|
44
|
+
const results = await uploadAssets({
|
|
45
|
+
assetsDirPath: '/path/to/assets',
|
|
46
|
+
upload: async (localAssetInfo) => {
|
|
47
|
+
// 实现上传逻辑,返回包含 remoteUrl 的资源信息
|
|
48
|
+
return { ...localAssetInfo, remoteUrl: 'https://example.com/asset.png' }
|
|
49
|
+
},
|
|
50
|
+
payload: {}, // 可选,透传给 upload 函数的额外参数
|
|
51
|
+
processAssets: (assets) => assets, // 可选,上传前对资源列表进行过滤或排序
|
|
52
|
+
})
|
|
52
53
|
```
|
|
53
54
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
accessKeyId: 'your-access-key-id',
|
|
83
|
-
accessKeySecret: 'your-access-key-secret',
|
|
84
|
-
bucket: 'your-bucket-name',
|
|
85
|
-
bucketDir: 'bucketDir',
|
|
86
|
-
region: 'your-region',
|
|
87
|
-
})
|
|
88
|
-
},
|
|
89
|
-
// 自动设置 browserslist 配置
|
|
90
|
-
coverBrowsersList: {
|
|
91
|
-
// 必填:微信小程序基础库最低版本号
|
|
92
|
-
minBaseLibraryVersion: '2.14.4'
|
|
93
|
-
},
|
|
94
|
-
// 包体积分析配置
|
|
95
|
-
bundleAnalyzer: true,
|
|
96
|
-
// 开启异步加载主包代码,优化主包体积
|
|
97
|
-
asyncPack: true
|
|
98
|
-
}],
|
|
99
|
-
],
|
|
100
|
-
};
|
|
55
|
+
#### 参数说明
|
|
56
|
+
|
|
57
|
+
| 参数名 | 是否必填 | 类型 | 默认值 | 说明 |
|
|
58
|
+
|-----------------|------|------------------------------|----------------------|------------------------|
|
|
59
|
+
| `assetsDirPath` | 是 | `string` | - | 本地静态资源根目录 |
|
|
60
|
+
| `upload` | 是 | `Uploader` | - | 上传函数,接收资源信息并返回远程 URL |
|
|
61
|
+
| `payload` | 否 | `any` | - | 透传给 upload 函数的额外参数 |
|
|
62
|
+
| `processAssets` | 否 | `(assets) => assets` | `(assets) => assets` | 上传前对资源列表进行过滤或排序 |
|
|
63
|
+
|
|
64
|
+
### `defineUploaderAdapter(adapter)`
|
|
65
|
+
|
|
66
|
+
定义上传适配器的工具函数,提供类型推导支持。
|
|
67
|
+
|
|
68
|
+
```ts
|
|
69
|
+
import { defineUploaderAdapter } from '@taro-minify-pack/helper'
|
|
70
|
+
|
|
71
|
+
interface MyAdapterOpt {
|
|
72
|
+
endpoint: string
|
|
73
|
+
apiKey: string
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const myUploadAdapter = defineUploaderAdapter((opt: MyAdapterOpt) => {
|
|
77
|
+
return async (localAssetInfo, payload) => {
|
|
78
|
+
// 实现上传逻辑
|
|
79
|
+
const remoteUrl = await uploadToMyService(opt, localAssetInfo)
|
|
80
|
+
return { ...localAssetInfo, remoteUrl }
|
|
81
|
+
}
|
|
82
|
+
})
|
|
101
83
|
```
|
|
102
84
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
['@taro-minify-pack/preset', {
|
|
120
|
-
// 远程资源上传配置
|
|
121
|
-
remoteAssets: {
|
|
122
|
-
pathAlias: {
|
|
123
|
-
'@': path.resolve(__dirname, '../src/'),
|
|
124
|
-
'~@': path.resolve(__dirname, '../src/'),
|
|
125
|
-
},
|
|
126
|
-
assetsDirPath: path.resolve(__dirname, '../src/assets/'),
|
|
127
|
-
uploader: aliOssUploadAdapter({
|
|
128
|
-
customDomain: 'https://your-custom-domain.com',
|
|
129
|
-
accessKeyId: 'your-access-key-id',
|
|
130
|
-
accessKeySecret: 'your-access-key-secret',
|
|
131
|
-
bucket: 'your-bucket-name',
|
|
132
|
-
bucketDir: 'bucketDir',
|
|
133
|
-
region: 'your-region',
|
|
134
|
-
})
|
|
135
|
-
},
|
|
136
|
-
// 异步加载主包代码配置
|
|
137
|
-
asyncPack: {
|
|
138
|
-
// 动态包名称前缀
|
|
139
|
-
dynamicPackageNamePrefix: 'dynamic-package',
|
|
140
|
-
// 动态包数量
|
|
141
|
-
dynamicPackageCount: 1,
|
|
142
|
-
// 自定义异步分包
|
|
143
|
-
customDynamicPackages: [
|
|
144
|
-
{
|
|
145
|
-
name: 'sync-style',
|
|
146
|
-
test: (module) => /src[\\/]pages[\\/]sync-style[\\/]/.test(module.identifier()),
|
|
147
|
-
},
|
|
148
|
-
{
|
|
149
|
-
name: 'async-style',
|
|
150
|
-
test: (module) => /src[\\/]pages[\\/]async-style[\\/]/.test(module.identifier()),
|
|
151
|
-
asyncStyle: true
|
|
152
|
-
}
|
|
153
|
-
]
|
|
154
|
-
},
|
|
155
|
-
// 自动设置 browserslist 配置
|
|
156
|
-
coverBrowsersList: {
|
|
157
|
-
// 必填:微信小程序基础库最低版本号
|
|
158
|
-
minBaseLibraryVersion: '2.14.4'
|
|
159
|
-
},
|
|
160
|
-
// 包体积分析配置
|
|
161
|
-
bundleAnalyzer: {
|
|
162
|
-
// 服务器主机
|
|
163
|
-
analyzerHost: '127.0.0.1',
|
|
164
|
-
// 服务器端口
|
|
165
|
-
analyzerPort: 8888,
|
|
166
|
-
// 是否自动打开报告
|
|
167
|
-
openAnalyzer: true
|
|
168
|
-
}
|
|
169
|
-
}],
|
|
170
|
-
],
|
|
171
|
-
};
|
|
85
|
+
### `aliOssUploadAdapter(opt)`
|
|
86
|
+
|
|
87
|
+
内置的阿里云 OSS 上传适配器,支持自定义域名、文件名生成、目录前缀等配置。
|
|
88
|
+
|
|
89
|
+
```ts
|
|
90
|
+
import { aliOssUploadAdapter } from '@taro-minify-pack/helper'
|
|
91
|
+
|
|
92
|
+
const uploader = aliOssUploadAdapter({
|
|
93
|
+
accessKeyId: 'your-access-key-id',
|
|
94
|
+
accessKeySecret: 'your-access-key-secret',
|
|
95
|
+
bucket: 'your-bucket-name',
|
|
96
|
+
region: 'oss-cn-hangzhou',
|
|
97
|
+
bucketDir: 'taro-assets', // 可选,OSS 存储目录前缀,默认为根目录
|
|
98
|
+
customDomain: 'https://cdn.example.com', // 可选,自定义域名
|
|
99
|
+
fileName: (info) => info.uniqueKey, // 可选,远程文件名生成函数,默认使用 uniqueKey
|
|
100
|
+
})
|
|
172
101
|
```
|
|
173
102
|
|
|
174
|
-
|
|
103
|
+
#### AliOssUploadAdapterOpt 参数说明
|
|
104
|
+
|
|
105
|
+
| 参数名 | 是否必填 | 类型 | 默认值 | 说明 |
|
|
106
|
+
|------------------|------|--------------------------------------|-------------------------|--------------------------|
|
|
107
|
+
| `accessKeyId` | 是 | `string` | - | 阿里云 AccessKey ID |
|
|
108
|
+
| `accessKeySecret`| 是 | `string` | - | 阿里云 AccessKey Secret |
|
|
109
|
+
| `bucket` | 是 | `string` | - | OSS Bucket 名称 |
|
|
110
|
+
| `region` | 是 | `string` | - | OSS 区域 |
|
|
111
|
+
| `bucketDir` | 否 | `string` | `''` | OSS 存储目录前缀 |
|
|
112
|
+
| `customDomain` | 否 | `string` | - | 自定义域名,设置后远程 URL 使用该域名 |
|
|
113
|
+
| `fileName` | 否 | `(info) => string` | `(info) => info.uniqueKey` | 远程文件名生成函数 |
|
|
114
|
+
|
|
115
|
+
### 工具函数
|
|
175
116
|
|
|
176
|
-
|
|
117
|
+
#### `travelFiles(dir)`
|
|
177
118
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
119
|
+
递归遍历目录,返回所有文件的绝对路径列表。
|
|
120
|
+
|
|
121
|
+
```ts
|
|
122
|
+
import { travelFiles } from '@taro-minify-pack/helper'
|
|
123
|
+
|
|
124
|
+
const files = travelFiles('/path/to/directory')
|
|
125
|
+
// => ['/path/to/directory/a.png', '/path/to/directory/sub/b.png']
|
|
126
|
+
```
|
|
184
127
|
|
|
185
|
-
|
|
128
|
+
#### `generateFileUniqueKey(filePath)`
|
|
186
129
|
|
|
187
|
-
|
|
188
|
-
|--------------------------|--------------------------|---------------------|-----------|
|
|
189
|
-
| dynamicPackageNamePrefix | `string` | `'dynamic-package'` | 动态包名称前缀 |
|
|
190
|
-
| dynamicPackageCount | `number` | `1` | 动态包数量 |
|
|
191
|
-
| customDynamicPackages | `CustomDynamicPackage[]` | `[]` | 自定义异步分包配置 |
|
|
130
|
+
基于文件内容生成 MD5 唯一标识。
|
|
192
131
|
|
|
193
|
-
|
|
132
|
+
```ts
|
|
133
|
+
import { generateFileUniqueKey } from '@taro-minify-pack/helper'
|
|
194
134
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
| pathAlias | `Record<string, string>` | - | 路径别名配置 |
|
|
199
|
-
| uploader | `Function` | - | 资源上传适配器函数 |
|
|
135
|
+
const key = generateFileUniqueKey('/path/to/file.png')
|
|
136
|
+
// => '2f9b7a8c9d0e1f2a3b4c5d6e7f8a9b0c'
|
|
137
|
+
```
|
|
200
138
|
|
|
201
|
-
###
|
|
139
|
+
### 类型定义
|
|
202
140
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
141
|
+
```ts
|
|
142
|
+
interface LocalAssetInfo {
|
|
143
|
+
localPath: string // 本地资源文件路径
|
|
144
|
+
fileName: string // 文件名(不含扩展名)
|
|
145
|
+
uniqueKey: string // 基于文件内容生成的 MD5 值
|
|
146
|
+
ext: string // 文件扩展名(含 .)
|
|
147
|
+
}
|
|
206
148
|
|
|
207
|
-
|
|
149
|
+
interface RemoteAssetInfo {
|
|
150
|
+
ext: string // 文件扩展名
|
|
151
|
+
localPath: string // 本地资源文件路径
|
|
152
|
+
uniqueKey: string // 基于文件内容生成的 MD5 值
|
|
153
|
+
remoteUrl: string // 远程资源访问 URL
|
|
154
|
+
}
|
|
208
155
|
|
|
209
|
-
|
|
210
|
-
|--------------|----------------------|---------------|----------|
|
|
211
|
-
| analyzerHost | `string` | `'127.0.0.1'` | 服务器主机 |
|
|
212
|
-
| analyzerPort | `number` \| `'auto'` | `8888` | 服务器端口 |
|
|
213
|
-
| openAnalyzer | `boolean` | `true` | 是否自动打开报告 |
|
|
156
|
+
type Uploader = (localAssetInfo: LocalAssetInfo, payload?: any) => Promise<RemoteAssetInfo>
|
|
214
157
|
|
|
215
|
-
|
|
158
|
+
type UploaderAdapter<T = any> = (opt: T) => Uploader
|
|
159
|
+
```
|
|
216
160
|
|
|
217
|
-
|
|
218
|
-
* 希望简化多插件配置的项目
|
|
219
|
-
* 需要同时使用多个 @taro-minify-pack 系列插件的项目
|
|
220
|
-
* 对小程序主包体积有严格要求的项目
|
|
161
|
+
## 🧠 工作原理
|
|
221
162
|
|
|
222
|
-
|
|
163
|
+
1. **文件扫描**:`travelFiles` 递归遍历指定目录,收集所有文件路径
|
|
164
|
+
2. **唯一性校验**:`generateFileUniqueKey` 读取文件内容并生成 MD5 值,确保同一内容不会重复上传
|
|
165
|
+
3. **并发上传**:`uploadAssets` 使用 `@supercharge/promise-pool` 控制并发数(默认为 2),批量上传资源
|
|
166
|
+
4. **适配器模式**:通过 `defineUploaderAdapter` 定义上传适配器,将上传逻辑与存储服务解耦,支持灵活扩展
|
|
223
167
|
|
|
224
|
-
|
|
168
|
+
### 阿里云 OSS 适配器工作流程
|
|
225
169
|
|
|
226
|
-
|
|
170
|
+
1. 初始化 OSS 客户端
|
|
171
|
+
2. 对每个资源文件,先通过 `head` 接口检查远程是否已存在同名文件
|
|
172
|
+
3. 若已存在,直接返回远程 URL,跳过上传
|
|
173
|
+
4. 若不存在,调用 `put` 接口上传文件,并返回远程 URL
|
|
174
|
+
5. 如果配置了 `customDomain`,远程 URL 使用自定义域名;否则使用 OSS 签名 URL
|
|
227
175
|
|
|
228
|
-
|
|
176
|
+
## 📌 适用场景
|
|
229
177
|
|
|
230
|
-
|
|
178
|
+
* 为 `@taro-minify-pack` 系列插件提供上传能力
|
|
179
|
+
* 需要在 Taro 项目中将静态资源上传至对象存储
|
|
180
|
+
* 需要自定义上传适配器对接不同的存储服务
|
|
181
|
+
* 需要基于文件内容 MD5 进行资源去重
|
|
231
182
|
|
|
232
|
-
|
|
183
|
+
## ⚠️ 注意事项
|
|
233
184
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
185
|
+
1. **内部依赖**:该包主要为 `@taro-minify-pack` 系列插件提供公共能力,一般不单独使用
|
|
186
|
+
2. **并发控制**:`uploadAssets` 默认并发数为 2,避免对存储服务造成过大压力
|
|
187
|
+
3. **文件唯一性**:基于文件内容 MD5 生成唯一标识,仅修改文件名不会触发重新上传
|
|
188
|
+
4. **OSS 适配器**:使用 `aliOssUploadAdapter` 需要确保阿里云 OSS 配置正确,且有足够的访问权限
|
|
237
189
|
|
|
238
190
|
## 📄 许可证
|
|
239
191
|
|
|
@@ -243,4 +195,4 @@ MIT License
|
|
|
243
195
|
|
|
244
196
|
欢迎提交 Issues 和 Pull Requests!
|
|
245
197
|
|
|
246
|
-
>
|
|
198
|
+
> 该包是 @taro-minify-pack 系列插件的一部分,致力于提供完整的 Taro 项目优化解决方案。
|