jyj-components 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.
- package/.babelrc +11 -0
- package/.eslintrc.js +101 -0
- package/LICENSE +21 -0
- package/MIGRATION.md +336 -0
- package/QUICKSTART.md +300 -0
- package/README.md +200 -0
- package/gulpfile.js +26 -0
- package/miniprogram_dist/ad-banner/index.js +369 -0
- package/miniprogram_dist/ad-banner/index.js.map +1 -0
- package/miniprogram_dist/ad-banner/index.json +4 -0
- package/miniprogram_dist/ad-banner/index.wxml +10 -0
- package/miniprogram_dist/ad-banner/index.wxss +12 -0
- package/miniprogram_dist/ad-interstitial/index.js +450 -0
- package/miniprogram_dist/ad-interstitial/index.js.map +1 -0
- package/miniprogram_dist/ad-interstitial/index.json +4 -0
- package/miniprogram_dist/ad-interstitial/index.wxml +10 -0
- package/miniprogram_dist/ad-interstitial/index.wxss +56 -0
- package/miniprogram_dist/ad-rewarded-video/index.js +439 -0
- package/miniprogram_dist/ad-rewarded-video/index.js.map +1 -0
- package/miniprogram_dist/ad-rewarded-video/index.json +4 -0
- package/miniprogram_dist/ad-rewarded-video/index.wxml +2 -0
- package/miniprogram_dist/ad-rewarded-video/index.wxss +5 -0
- package/miniprogram_dist/ad-splash/index.js +402 -0
- package/miniprogram_dist/ad-splash/index.js.map +1 -0
- package/miniprogram_dist/ad-splash/index.json +4 -0
- package/miniprogram_dist/ad-splash/index.wxml +8 -0
- package/miniprogram_dist/ad-splash/index.wxss +31 -0
- package/miniprogram_dist/assets/copy.wxss +3 -0
- package/miniprogram_dist/assets/icon.png +0 -0
- package/miniprogram_dist/utils.js +5 -0
- package/nul +2 -0
- package/package.json +69 -0
- package/src/ad-banner/index.js +45 -0
- package/src/ad-banner/index.json +4 -0
- package/src/ad-banner/index.wxml +10 -0
- package/src/ad-banner/index.wxss +12 -0
- package/src/ad-interstitial/index.js +125 -0
- package/src/ad-interstitial/index.json +4 -0
- package/src/ad-interstitial/index.wxml +10 -0
- package/src/ad-interstitial/index.wxss +56 -0
- package/src/ad-rewarded-video/index.js +113 -0
- package/src/ad-rewarded-video/index.json +4 -0
- package/src/ad-rewarded-video/index.wxml +2 -0
- package/src/ad-rewarded-video/index.wxss +5 -0
- package/src/ad-splash/index.js +74 -0
- package/src/ad-splash/index.json +4 -0
- package/src/ad-splash/index.wxml +8 -0
- package/src/ad-splash/index.wxss +31 -0
- package/src/assets/copy.wxss +3 -0
- package/src/assets/icon.png +0 -0
- package/src/common.wxss +5 -0
- package/src/index.js +24 -0
- package/src/index.json +9 -0
- package/src/index.wxml +2 -0
- package/src/index.wxss +6 -0
- package/src/lib.ts +5 -0
- package/src/mixins/ad-base.js +125 -0
- package/src/request.js +40 -0
- package/src/reset.wxss +3 -0
- package/src/utils.js +5 -0
- package/tsconfig.json +25 -0
package/.babelrc
ADDED
package/.eslintrc.js
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
'extends': [
|
|
3
|
+
'airbnb-base',
|
|
4
|
+
'plugin:promise/recommended'
|
|
5
|
+
],
|
|
6
|
+
'parser': '@typescript-eslint/parser',
|
|
7
|
+
'plugins': ['@typescript-eslint'],
|
|
8
|
+
'parserOptions': {
|
|
9
|
+
'ecmaVersion': 9,
|
|
10
|
+
'ecmaFeatures': {
|
|
11
|
+
'jsx': false
|
|
12
|
+
},
|
|
13
|
+
'sourceType': 'module'
|
|
14
|
+
},
|
|
15
|
+
'env': {
|
|
16
|
+
'es6': true,
|
|
17
|
+
'node': true,
|
|
18
|
+
'jest': true
|
|
19
|
+
},
|
|
20
|
+
'plugins': [
|
|
21
|
+
'import',
|
|
22
|
+
'node',
|
|
23
|
+
'promise'
|
|
24
|
+
],
|
|
25
|
+
'rules': {
|
|
26
|
+
'arrow-parens': 'off',
|
|
27
|
+
'comma-dangle': [
|
|
28
|
+
'error',
|
|
29
|
+
'only-multiline'
|
|
30
|
+
],
|
|
31
|
+
'complexity': ['error', 20],
|
|
32
|
+
'func-names': 'off',
|
|
33
|
+
'global-require': 'off',
|
|
34
|
+
'handle-callback-err': [
|
|
35
|
+
'error',
|
|
36
|
+
'^(err|error)$'
|
|
37
|
+
],
|
|
38
|
+
'import/no-unresolved': [
|
|
39
|
+
'error',
|
|
40
|
+
{
|
|
41
|
+
'caseSensitive': true,
|
|
42
|
+
'commonjs': true,
|
|
43
|
+
'ignore': ['^[^.]']
|
|
44
|
+
}
|
|
45
|
+
],
|
|
46
|
+
'import/prefer-default-export': 'off',
|
|
47
|
+
'linebreak-style': 'off',
|
|
48
|
+
'no-catch-shadow': 'error',
|
|
49
|
+
'no-continue': 'off',
|
|
50
|
+
'no-div-regex': 'warn',
|
|
51
|
+
'no-else-return': 'off',
|
|
52
|
+
'no-param-reassign': 'off',
|
|
53
|
+
'no-plusplus': 'off',
|
|
54
|
+
'no-shadow': 'off',
|
|
55
|
+
'no-multi-assign': 'off',
|
|
56
|
+
'no-underscore-dangle': 'off',
|
|
57
|
+
'node/no-deprecated-api': 'error',
|
|
58
|
+
'node/process-exit-as-throw': 'error',
|
|
59
|
+
'object-curly-spacing': [
|
|
60
|
+
'error',
|
|
61
|
+
'never'
|
|
62
|
+
],
|
|
63
|
+
'operator-linebreak': [
|
|
64
|
+
'error',
|
|
65
|
+
'after',
|
|
66
|
+
{
|
|
67
|
+
'overrides': {
|
|
68
|
+
':': 'before',
|
|
69
|
+
'?': 'before'
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
],
|
|
73
|
+
'prefer-arrow-callback': 'off',
|
|
74
|
+
'prefer-destructuring': 'off',
|
|
75
|
+
'prefer-template': 'off',
|
|
76
|
+
'quote-props': [
|
|
77
|
+
1,
|
|
78
|
+
'as-needed',
|
|
79
|
+
{
|
|
80
|
+
'unnecessary': true
|
|
81
|
+
}
|
|
82
|
+
],
|
|
83
|
+
'semi': [
|
|
84
|
+
'error',
|
|
85
|
+
'never'
|
|
86
|
+
],
|
|
87
|
+
'no-await-in-loop': 'off',
|
|
88
|
+
'no-restricted-syntax': 'off',
|
|
89
|
+
'promise/always-return': 'off',
|
|
90
|
+
},
|
|
91
|
+
'globals': {
|
|
92
|
+
'window': true,
|
|
93
|
+
'document': true,
|
|
94
|
+
'App': true,
|
|
95
|
+
'Page': true,
|
|
96
|
+
'Component': true,
|
|
97
|
+
'Behavior': true,
|
|
98
|
+
'wx': true,
|
|
99
|
+
'getCurrentPages': true,
|
|
100
|
+
}
|
|
101
|
+
}
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/MIGRATION.md
ADDED
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
# 插件到组件迁移指南
|
|
2
|
+
|
|
3
|
+
本文档说明了从微信小程序插件到自定义组件的重构过程和主要变更。
|
|
4
|
+
|
|
5
|
+
## 重构概览
|
|
6
|
+
|
|
7
|
+
### 原插件结构
|
|
8
|
+
```
|
|
9
|
+
plugin/
|
|
10
|
+
├── index.js # 插件入口
|
|
11
|
+
├── plugin.json # 插件配置
|
|
12
|
+
├── request.js # 请求模块
|
|
13
|
+
├── components/
|
|
14
|
+
│ └── banner/ # 广告组件(包含所有类型)
|
|
15
|
+
└── pages/
|
|
16
|
+
└── coupon/ # 优惠券页面(Page)
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### 新组件结构
|
|
20
|
+
```
|
|
21
|
+
src/
|
|
22
|
+
├── ad-banner/ # 横幅广告组件
|
|
23
|
+
├── ad-interstitial/ # 插屏广告组件
|
|
24
|
+
├── ad-rewarded-video/ # 激励视频组件
|
|
25
|
+
├── ad-splash/ # 开屏广告组件
|
|
26
|
+
├── ad-coupon/ # 优惠券组件(Component)
|
|
27
|
+
├── mixins/
|
|
28
|
+
│ └── ad-base.js # 公共逻辑
|
|
29
|
+
└── request.js # 请求模块
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## 主要变更
|
|
33
|
+
|
|
34
|
+
### 1. 组件拆分
|
|
35
|
+
|
|
36
|
+
**变更前:** 一个 `banner` 组件包含所有广告类型
|
|
37
|
+
```javascript
|
|
38
|
+
// plugin/components/banner/banner.js
|
|
39
|
+
Component({
|
|
40
|
+
properties: {
|
|
41
|
+
type: String // "banner" | "interstitial" | "rewardedVideo" | "splash"
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**变更后:** 拆分为 4 个独立组件
|
|
47
|
+
```javascript
|
|
48
|
+
// src/ad-banner/index.js
|
|
49
|
+
// src/ad-interstitial/index.js
|
|
50
|
+
// src/ad-rewarded-video/index.js
|
|
51
|
+
// src/ad-splash/index.js
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**优势:**
|
|
55
|
+
- 代码更清晰,每个组件专注单一功能
|
|
56
|
+
- 按需加载,减少包体积
|
|
57
|
+
- 独立维护,互不影响
|
|
58
|
+
|
|
59
|
+
### 2. Page 转 Component
|
|
60
|
+
|
|
61
|
+
**变更前:** coupon 使用 Page() 构造器
|
|
62
|
+
```javascript
|
|
63
|
+
// plugin/pages/coupon/coupon.js
|
|
64
|
+
Page({
|
|
65
|
+
onLoad(options) {
|
|
66
|
+
this.setData({ params: options });
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**变更后:** 使用 Component() 构造器
|
|
72
|
+
```javascript
|
|
73
|
+
// src/ad-coupon/index.js
|
|
74
|
+
Component({
|
|
75
|
+
properties: {
|
|
76
|
+
secret: String,
|
|
77
|
+
phone: String,
|
|
78
|
+
userId: String
|
|
79
|
+
},
|
|
80
|
+
lifetimes: {
|
|
81
|
+
attached() {
|
|
82
|
+
// 初始化逻辑
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**使用方式变更:**
|
|
89
|
+
|
|
90
|
+
插件方式(旧):
|
|
91
|
+
```xml
|
|
92
|
+
<navigator url="plugin://juyoujia-adv/promotions?secret=xxx">
|
|
93
|
+
领取优惠券
|
|
94
|
+
</navigator>
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
组件方式(新):
|
|
98
|
+
```xml
|
|
99
|
+
<ad-coupon secret="{{secret}}" phone="{{phone}}" userId="{{userId}}" />
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 3. 公共逻辑提取
|
|
103
|
+
|
|
104
|
+
**变更前:** 公共逻辑分散在各个组件中
|
|
105
|
+
|
|
106
|
+
**变更后:** 提取到 `mixins/ad-base.js`
|
|
107
|
+
```javascript
|
|
108
|
+
// src/mixins/ad-base.js
|
|
109
|
+
module.exports = {
|
|
110
|
+
restoreAdState() { /* ... */ },
|
|
111
|
+
saveAdState() { /* ... */ },
|
|
112
|
+
loadNextAd() { /* ... */ },
|
|
113
|
+
report(actionType) { /* ... */ }
|
|
114
|
+
};
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**使用方式:**
|
|
118
|
+
```javascript
|
|
119
|
+
const adBase = require('../mixins/ad-base.js');
|
|
120
|
+
|
|
121
|
+
Component({
|
|
122
|
+
methods: {
|
|
123
|
+
...adBase,
|
|
124
|
+
// 组件特有方法
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### 4. 路径引用变更
|
|
130
|
+
|
|
131
|
+
**变更前:** 插件内部使用相对路径
|
|
132
|
+
```javascript
|
|
133
|
+
const { getAds } = require('../../request.js');
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
**变更后:** 组件使用相对路径
|
|
137
|
+
```javascript
|
|
138
|
+
const { getAds } = require('../request.js');
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### 5. 配置文件变更
|
|
142
|
+
|
|
143
|
+
**变更前:** 需要 `plugin.json`
|
|
144
|
+
```json
|
|
145
|
+
{
|
|
146
|
+
"publicComponents": {
|
|
147
|
+
"juyoujia-ad": "components/banner/banner"
|
|
148
|
+
},
|
|
149
|
+
"pages": {
|
|
150
|
+
"promotions": "pages/coupon/coupon"
|
|
151
|
+
},
|
|
152
|
+
"main": "index.js"
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
**变更后:** 不需要特殊配置,直接使用标准组件配置
|
|
157
|
+
```json
|
|
158
|
+
{
|
|
159
|
+
"component": true,
|
|
160
|
+
"usingComponents": {}
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### 6. 宿主小程序引用方式
|
|
165
|
+
|
|
166
|
+
**变更前:** 插件引用
|
|
167
|
+
```json
|
|
168
|
+
{
|
|
169
|
+
"plugins": {
|
|
170
|
+
"juyoujia-adv": {
|
|
171
|
+
"version": "1.0.0",
|
|
172
|
+
"provider": "wxAppId"
|
|
173
|
+
}
|
|
174
|
+
},
|
|
175
|
+
"usingComponents": {
|
|
176
|
+
"juyoujia-ad": "plugin://juyoujia-adv/juyoujia-ad"
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**变更后:** 普通组件引用
|
|
182
|
+
```json
|
|
183
|
+
{
|
|
184
|
+
"usingComponents": {
|
|
185
|
+
"ad-banner": "/components/jyj-components/ad-banner/index",
|
|
186
|
+
"ad-interstitial": "/components/jyj-components/ad-interstitial/index",
|
|
187
|
+
"ad-rewarded-video": "/components/jyj-components/ad-rewarded-video/index",
|
|
188
|
+
"ad-splash": "/components/jyj-components/ad-splash/index",
|
|
189
|
+
"ad-coupon": "/components/jyj-components/ad-coupon/index"
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## 迁移步骤
|
|
195
|
+
|
|
196
|
+
### 对于组件开发者
|
|
197
|
+
|
|
198
|
+
1. **构建组件库**
|
|
199
|
+
```bash
|
|
200
|
+
cd D:\myCode\miniProgram\jyj-components
|
|
201
|
+
npm install
|
|
202
|
+
npm run build
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
2. **发布到 npm(可选)**
|
|
206
|
+
```bash
|
|
207
|
+
npm publish
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### 对于小程序开发者
|
|
211
|
+
|
|
212
|
+
1. **移除插件配置**
|
|
213
|
+
|
|
214
|
+
从 `app.json` 中删除:
|
|
215
|
+
```json
|
|
216
|
+
{
|
|
217
|
+
"plugins": {
|
|
218
|
+
"juyoujia-adv": { ... }
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
2. **安装组件库**
|
|
224
|
+
|
|
225
|
+
方式 A:npm 安装
|
|
226
|
+
```bash
|
|
227
|
+
npm install jyj-components
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
方式 B:本地复制
|
|
231
|
+
```bash
|
|
232
|
+
# 复制 miniprogram_dist 到项目的 components 目录
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
3. **更新组件引用**
|
|
236
|
+
|
|
237
|
+
```json
|
|
238
|
+
{
|
|
239
|
+
"usingComponents": {
|
|
240
|
+
"ad-banner": "jyj-components/ad-banner/index"
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
4. **更新代码**
|
|
246
|
+
|
|
247
|
+
**横幅广告:**
|
|
248
|
+
```xml
|
|
249
|
+
<!-- 旧 -->
|
|
250
|
+
<juyoujia-ad slotId="xxx" type="banner" />
|
|
251
|
+
|
|
252
|
+
<!-- 新 -->
|
|
253
|
+
<ad-banner slotId="xxx" />
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
**插屏广告:**
|
|
257
|
+
```xml
|
|
258
|
+
<!-- 旧 -->
|
|
259
|
+
<juyoujia-ad slotId="xxx" type="interstitial" />
|
|
260
|
+
|
|
261
|
+
<!-- 新 -->
|
|
262
|
+
<ad-interstitial slotId="xxx" isShow="{{show}}" />
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
**激励视频:**
|
|
266
|
+
```xml
|
|
267
|
+
<!-- 旧 -->
|
|
268
|
+
<juyoujia-ad slotId="xxx" type="rewardedVideo" />
|
|
269
|
+
|
|
270
|
+
<!-- 新 -->
|
|
271
|
+
<ad-rewarded-video slotId="xxx" isShow="{{show}}" />
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
**开屏广告:**
|
|
275
|
+
```xml
|
|
276
|
+
<!-- 旧 -->
|
|
277
|
+
<juyoujia-ad slotId="xxx" type="splash" />
|
|
278
|
+
|
|
279
|
+
<!-- 新 -->
|
|
280
|
+
<ad-splash slotId="xxx" />
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
**优惠券:**
|
|
284
|
+
```xml
|
|
285
|
+
<!-- 旧 -->
|
|
286
|
+
<navigator url="plugin://juyoujia-adv/promotions?secret=xxx&phone=xxx">
|
|
287
|
+
领取优惠券
|
|
288
|
+
</navigator>
|
|
289
|
+
|
|
290
|
+
<!-- 新 -->
|
|
291
|
+
<ad-coupon secret="{{secret}}" phone="{{phone}}" userId="{{userId}}" />
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
## 兼容性说明
|
|
295
|
+
|
|
296
|
+
### 保持不变的部分
|
|
297
|
+
|
|
298
|
+
1. **广告数据格式**:后端接口返回的数据格式保持不变
|
|
299
|
+
2. **slotId**:广告位 ID 保持不变
|
|
300
|
+
3. **事件名称**:`adLoad`、`adError`、`adClose` 等事件名保持不变
|
|
301
|
+
4. **业务逻辑**:广告轮播、状态管理、数据上报逻辑保持不变
|
|
302
|
+
|
|
303
|
+
### 需要调整的部分
|
|
304
|
+
|
|
305
|
+
1. **组件名称**:从 `juyoujia-ad` 改为 `ad-banner` 等
|
|
306
|
+
2. **type 属性**:不再需要 `type` 属性,直接使用对应的组件
|
|
307
|
+
3. **优惠券参数传递**:从 URL 参数改为组件属性
|
|
308
|
+
|
|
309
|
+
## 性能对比
|
|
310
|
+
|
|
311
|
+
| 指标 | 插件方式 | 组件方式 |
|
|
312
|
+
|------|---------|---------|
|
|
313
|
+
| 包体积 | 所有类型打包在一起 | 按需加载 |
|
|
314
|
+
| 代码可读性 | 大量条件判断 | 清晰独立 |
|
|
315
|
+
| 维护成本 | 修改影响全部 | 独立维护 |
|
|
316
|
+
| 加载速度 | 加载全部代码 | 只加载使用的组件 |
|
|
317
|
+
|
|
318
|
+
## 常见问题
|
|
319
|
+
|
|
320
|
+
### Q: 为什么要拆分组件?
|
|
321
|
+
A: 提高代码可读性、可维护性,支持按需加载,减少包体积。
|
|
322
|
+
|
|
323
|
+
### Q: 旧版插件还能用吗?
|
|
324
|
+
A: 可以,但建议迁移到新版组件,获得更好的性能和维护体验。
|
|
325
|
+
|
|
326
|
+
### Q: 迁移需要多久?
|
|
327
|
+
A: 对于简单项目,约 30 分钟;复杂项目可能需要 1-2 小时。
|
|
328
|
+
|
|
329
|
+
### Q: 数据会丢失吗?
|
|
330
|
+
A: 不会,广告展示状态保存在本地存储中,迁移后会自动恢复。
|
|
331
|
+
|
|
332
|
+
## 技术支持
|
|
333
|
+
|
|
334
|
+
如有迁移问题,请联系开发团队或查看:
|
|
335
|
+
- [完整文档](./README.md)
|
|
336
|
+
- [快速开始](./QUICKSTART.md)
|