@playcraft/devkit 1.0.1-8.beta.1 → 1.0.1-8.beta.3
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 +259 -0
- package/cli/bin/playable-scripts.js +44 -1
- package/cli/commands/build.js +130 -18
- package/cli/commands/builds.js +13 -2
- package/cli/commands/dev.js +7 -1
- package/cli/commands/pack.js +308 -39
- package/cli/commands/vite-dev.js +7 -1
- package/core/batch-build.js +1091 -125
- package/core/cos-uploader.js +264 -20
- package/core/index.js +71 -6
- package/core/loaders/gltf-loader.js +74 -28
- package/core/options.js +310 -15
- package/core/plugins/AdikteevInjectorPlugin.js +26 -4
- package/core/plugins/BigoAdsInjectorPlugin.js +21 -4
- package/core/plugins/DAPIInjectorPlugin.js +25 -2
- package/core/plugins/DebuggerInjectionPlugin.js +31 -3
- package/core/plugins/ExitAPIInjectorPlugin.js +57 -3
- package/core/plugins/FflateCompressionPlugin.js +225 -37
- package/core/plugins/FontInjectionWebpackPlugin.js +46 -4
- package/core/plugins/LiftoffInjectorPlugin.js +26 -4
- package/core/plugins/MRAIDInjectorPlugin.js +24 -2
- package/core/plugins/MintegralInjectorPlugin.js +25 -2
- package/core/plugins/PangleInjectorPlugin.js +24 -2
- package/core/plugins/SnapchatInjectorPlugin.js +26 -4
- package/core/plugins/TikTokInjectorPlugin.js +24 -2
- package/core/plugins/UnityInjectorPlugin.js +37 -8
- package/core/plugins/ZipPlugin.js +138 -19
- package/core/resources/fonts/maoken-regular.woff2 +0 -0
- package/core/resources/fonts/maoken-regular.woff2.chars +1 -0
- package/core/resources/fonts/maoken-zhuyuan.ttf +0 -0
- package/core/resources/fonts/pangmen-biaoti.ttf +0 -0
- package/core/resources/fonts/pangmen-regular.woff2 +0 -0
- package/core/resources/fonts/pangmen-regular.woff2.chars +1 -0
- package/core/utils/buildDefines.js +29 -2
- package/core/utils/buildTemplateString.js +40 -5
- package/core/utils/date.js +16 -1
- package/core/utils/fontRegistry.js +81 -12
- package/core/utils/fontResolver.js +335 -34
- package/core/utils/generateAdikteevHtmlWebpackPluginConfig.js +42 -7
- package/core/utils/generateBigabidHtmlWebpackPluginConfig.js +30 -3
- package/core/utils/generateInMobiHtmlWebpackPluginConfig.js +43 -7
- package/core/utils/injectSDKPlugins.js +58 -11
- package/core/utils/logOptions.js +37 -4
- package/core/utils/mergeOptions.js +19 -2
- package/core/utils/parseArgvOptions.js +110 -5
- package/core/utils/resolveChannelFold2Zip.js +15 -3
- package/core/utils/validateThemeData.js +220 -25
- package/core/validators/pre-build-checker.js +201 -21
- package/core/validators/tracking-validator.js +358 -40
- package/core/vite.dev.js +332 -18
- package/core/webpack.build.js +489 -56
- package/core/webpack.common.js +177 -11
- package/core/webpack.dev.js +82 -5
- package/package.json +3 -2
- package/core/resources/fonts/maoken/04e60956bbe055746aa7bca5c229ca8c.woff2 +0 -0
- package/core/resources/fonts/maoken/086a30eeaa0f5558062389361dca8685.woff2 +0 -0
- package/core/resources/fonts/maoken/1b1c9545aa1da01979d240f38f979b9e.woff2 +0 -0
- package/core/resources/fonts/maoken/1dd31fae60d98fcad0812cb4dc54afdd.woff2 +0 -0
- package/core/resources/fonts/maoken/1f08966635ca0dc4a64f519863df0dcc.woff2 +0 -0
- package/core/resources/fonts/maoken/26aab6a388b04c37fd5a4d066a512e14.woff2 +0 -0
- package/core/resources/fonts/maoken/29390db71394eb0d298fa1c339590e45.woff2 +0 -0
- package/core/resources/fonts/maoken/2b743d9f736c5cda9250fc8b85f69db8.woff2 +0 -0
- package/core/resources/fonts/maoken/2f16b1f8881909c4e65404610460797f.woff2 +0 -0
- package/core/resources/fonts/maoken/339dc88f6fd1b09336410154252f858f.woff2 +0 -0
- package/core/resources/fonts/maoken/3665591d2bd9a3f31a302a34a76c74dc.woff2 +0 -0
- package/core/resources/fonts/maoken/3b58ece5ff16a5addc9adc1c74717d12.woff2 +0 -0
- package/core/resources/fonts/maoken/3e3aacd6cd2255be39c97c4ed6eb978b.woff2 +0 -0
- package/core/resources/fonts/maoken/3e8cdd750fcbbfcf9a1101c7418eeb36.woff2 +0 -0
- package/core/resources/fonts/maoken/3f71b3c0ecb555f9fa88d1b2ae0ec77f.woff2 +0 -0
- package/core/resources/fonts/maoken/40f956d892d89a442992737448f0330b.woff2 +0 -0
- package/core/resources/fonts/maoken/47ecbb41501b6cb923aaa8b8324bb22f.woff2 +0 -0
- package/core/resources/fonts/maoken/4a6e704952e05d217e4f4d2c2a330094.woff2 +0 -0
- package/core/resources/fonts/maoken/4ec9fc653a6aaabd2296fac3fe906416.woff2 +0 -0
- package/core/resources/fonts/maoken/5d950afcbaac4bb8f44083e5f4572957.woff2 +0 -0
- package/core/resources/fonts/maoken/6505b718e31b5b2b29c4f50a2a2b5fe6.woff2 +0 -0
- package/core/resources/fonts/maoken/673405ebfdfebae1104f36efa778714d.woff2 +0 -0
- package/core/resources/fonts/maoken/695a686e27152d8e81b4459b64d7b6a1.woff2 +0 -0
- package/core/resources/fonts/maoken/6b5fb0c960eed7a53f39adb18d0ab28b.woff2 +0 -0
- package/core/resources/fonts/maoken/6f53ca6c761ff540e11d5f7111dad67c.woff2 +0 -0
- package/core/resources/fonts/maoken/7125e9df28437d053e56f85a908a7343.woff2 +0 -0
- package/core/resources/fonts/maoken/731865983ae51e2a4bdc6c194da0b82e.woff2 +0 -0
- package/core/resources/fonts/maoken/74d993e9aa68ef636eb1287439d06bb0.woff2 +0 -0
- package/core/resources/fonts/maoken/797653f0a72360cd584f625972b5d217.woff2 +0 -0
- package/core/resources/fonts/maoken/7af5930fe5e6dade3cf31d3287d6414c.woff2 +0 -0
- package/core/resources/fonts/maoken/7c6fe2ee55f924f00b097da208852a34.woff2 +0 -0
- package/core/resources/fonts/maoken/8cff8ef36a011ca7e6d103f29b22f98b.woff2 +0 -0
- package/core/resources/fonts/maoken/8ff8566257c5df17ddde67b2b48243a4.woff2 +0 -0
- package/core/resources/fonts/maoken/93988344f6df526a0033a05d2d927d76.woff2 +0 -0
- package/core/resources/fonts/maoken/99d1c5647f1ce540674bd32354c2038f.woff2 +0 -0
- package/core/resources/fonts/maoken/a328b132aac2a3f53d97b8e7ad940e1a.woff2 +0 -0
- package/core/resources/fonts/maoken/a7dc00c95dd1e7a8eca8053975b0c07c.woff2 +0 -0
- package/core/resources/fonts/maoken/ab93ca86fb3e7ad8e95b93f7de5d8f97.woff2 +0 -0
- package/core/resources/fonts/maoken/b1b83e931f7e2187786b87545a6ee842.woff2 +0 -0
- package/core/resources/fonts/maoken/bb31b8c0ccf2d93af7cc25f19a576970.woff2 +0 -0
- package/core/resources/fonts/maoken/bd4a61534e4a0f426dd0d396362b211d.woff2 +0 -0
- package/core/resources/fonts/maoken/bec7534be141c6473023f18f5aee7a0e.woff2 +0 -0
- package/core/resources/fonts/maoken/c133a76c68c645b46b20e7faf9894ab6.woff2 +0 -0
- package/core/resources/fonts/maoken/c2deab25bd23b63c794da537e208c61a.woff2 +0 -0
- package/core/resources/fonts/maoken/cf13611d9749dd23fd9737073d2110f6.woff2 +0 -0
- package/core/resources/fonts/maoken/d01182e5dd9f51dce713916e8f872bbf.woff2 +0 -0
- package/core/resources/fonts/maoken/d1d4c88b2a14e679d3cc9d0ad8e8abdb.woff2 +0 -0
- package/core/resources/fonts/maoken/df61c7f5fa45aa6156122c09653f6700.woff2 +0 -0
- package/core/resources/fonts/maoken/e1867d1454d8c903ba29bac70f88c211.woff2 +0 -0
- package/core/resources/fonts/maoken/ef912f41f9109c5d936005af5552f521.woff2 +0 -0
- package/core/resources/fonts/maoken/f0f119744871bb6bec7e0eef4e1ce8ba.woff2 +0 -0
- package/core/resources/fonts/maoken/f32a268245b50f6c19bd946239fd8cc0.woff2 +0 -0
- package/core/resources/fonts/maoken/f4735851e08da122f471100ecff5c4ae.woff2 +0 -0
- package/core/resources/fonts/maoken/f85b8f6994600622f767506ae55d6280.woff2 +0 -0
- package/core/resources/fonts/maoken/fc145bdf9c20b67db44156382155b465.woff2 +0 -0
- package/core/resources/fonts/maoken/fcd8571ec88b953c893d77c4fd5c6ebc.woff2 +0 -0
- package/core/resources/fonts/maoken/fcdcb3f4b26b5c1f45fdd151f45e0c6d.woff2 +0 -0
- package/core/resources/fonts/maoken/index.json +0 -59
- package/core/resources/fonts/pangmen/0047cd3053f8c06117a653b73e100391.woff2 +0 -0
- package/core/resources/fonts/pangmen/008870151036457b39ee8794f5bc7a64.woff2 +0 -0
- package/core/resources/fonts/pangmen/01b5355e45274055ad794cc1b1305e69.woff2 +0 -0
- package/core/resources/fonts/pangmen/0756361ea2445ec1c500d354fa0867d0.woff2 +0 -0
- package/core/resources/fonts/pangmen/091cf1201fbbda8dc98c01e775991bab.woff2 +0 -0
- package/core/resources/fonts/pangmen/0c854072dc9998bd02ea8b29b5f1f55e.woff2 +0 -0
- package/core/resources/fonts/pangmen/10f3f7f8da6ab5f882e816c97532a4c6.woff2 +0 -0
- package/core/resources/fonts/pangmen/141229a7039c633c894ea5168d0ae849.woff2 +0 -0
- package/core/resources/fonts/pangmen/1b0b982276f5f93b3c71b3f6b1b81184.woff2 +0 -0
- package/core/resources/fonts/pangmen/1e415e51c4efb3182b87665d726fc423.woff2 +0 -0
- package/core/resources/fonts/pangmen/1f5fb0c8d785813dc765ff889b491361.woff2 +0 -0
- package/core/resources/fonts/pangmen/1fe8065222947d67d4177fe3bdd782cd.woff2 +0 -0
- package/core/resources/fonts/pangmen/229674de0b8d208f607468537d10ca48.woff2 +0 -0
- package/core/resources/fonts/pangmen/27230f128a3708090bed2eb5bb6ad437.woff2 +0 -0
- package/core/resources/fonts/pangmen/2d8f78526cd5d63e22274b3f0e5c4e50.woff2 +0 -0
- package/core/resources/fonts/pangmen/2f441859584ca1d060378be9f1173a6a.woff2 +0 -0
- package/core/resources/fonts/pangmen/319ed7be5128268f3cf297464b305a55.woff2 +0 -0
- package/core/resources/fonts/pangmen/35a41344eec91ef694ca59fda4dc9ccc.woff2 +0 -0
- package/core/resources/fonts/pangmen/3715cbec78511ff67e44fdd363b5fd79.woff2 +0 -0
- package/core/resources/fonts/pangmen/37d468e8e898644f8fddc9f83f04a5b1.woff2 +0 -0
- package/core/resources/fonts/pangmen/384b560d66242e5c1062489020d8749c.woff2 +0 -0
- package/core/resources/fonts/pangmen/38ef10dd61436ebaeb8dada7b827595c.woff2 +0 -0
- package/core/resources/fonts/pangmen/3e8bdfd8597f723100ff7d6b54e803f9.woff2 +0 -0
- package/core/resources/fonts/pangmen/43d57e12e1ec85c68a289d88f920f62e.woff2 +0 -0
- package/core/resources/fonts/pangmen/4c4ee1006529ddcc67e7c195d5ddb2e0.woff2 +0 -0
- package/core/resources/fonts/pangmen/4f65210dd5014352f4c6eb1a791e56c9.woff2 +0 -0
- package/core/resources/fonts/pangmen/5179f5b92b71d655b9094b282ca39161.woff2 +0 -0
- package/core/resources/fonts/pangmen/5282fc1cc80a878d744621a36279a1fa.woff2 +0 -0
- package/core/resources/fonts/pangmen/57604d7bad494a118e0fa9a6c0f1035a.woff2 +0 -0
- package/core/resources/fonts/pangmen/5891eaedeb9999f6b71434efc42407db.woff2 +0 -0
- package/core/resources/fonts/pangmen/592e3b1817378c607c8b6b183c89019a.woff2 +0 -0
- package/core/resources/fonts/pangmen/5c7c16778cf226e25ef39e475a19afa0.woff2 +0 -0
- package/core/resources/fonts/pangmen/5eccbf1ee87f73db786ee0a8441df8a3.woff2 +0 -0
- package/core/resources/fonts/pangmen/606a4091be7a3307a2d9adc4d2206b04.woff2 +0 -0
- package/core/resources/fonts/pangmen/62da615f3cbb7d19ce02973b009ec5b9.woff2 +0 -0
- package/core/resources/fonts/pangmen/63f9972982226af9df16006408160e8a.woff2 +0 -0
- package/core/resources/fonts/pangmen/6702bbfff577fce5bc621a91fdcb78bc.woff2 +0 -0
- package/core/resources/fonts/pangmen/6cd32dbf440a9b7711cc293b19f4c2d7.woff2 +0 -0
- package/core/resources/fonts/pangmen/6ef49a0811c0a0892dfbca6602365e6f.woff2 +0 -0
- package/core/resources/fonts/pangmen/7194cb1fa135d58fee1611bb8915fe25.woff2 +0 -0
- package/core/resources/fonts/pangmen/71baf3daab3248b0748dd187ab2fbc45.woff2 +0 -0
- package/core/resources/fonts/pangmen/7457db009eff249ec587c7d912c5d347.woff2 +0 -0
- package/core/resources/fonts/pangmen/762d1c7a28837c08180123e98dbe8cbf.woff2 +0 -0
- package/core/resources/fonts/pangmen/76e3d855d8684a1ee4d12cf7a572ca78.woff2 +0 -0
- package/core/resources/fonts/pangmen/78a97efdf675a6dcf903b4725de01219.woff2 +0 -0
- package/core/resources/fonts/pangmen/7b42a8cbf34bd2a0820ed81bb4730b6d.woff2 +0 -0
- package/core/resources/fonts/pangmen/7d07b13e8fc6502f0d2e21a7bb87ddb1.woff2 +0 -0
- package/core/resources/fonts/pangmen/7e710c007a48e4410861c67a9a26d4fc.woff2 +0 -0
- package/core/resources/fonts/pangmen/7eb8fe8685f6f2d6f0e223337f3a2b2b.woff2 +0 -0
- package/core/resources/fonts/pangmen/7ec1b00b541c2c2817cf352e2634bf5b.woff2 +0 -0
- package/core/resources/fonts/pangmen/7ffdd7059669ad52af7995b515889eeb.woff2 +0 -0
- package/core/resources/fonts/pangmen/818c6b2f12623b5a43d1036cb7f71b61.woff2 +0 -0
- package/core/resources/fonts/pangmen/81983731abfefd6a400b83b93d9e3665.woff2 +0 -0
- package/core/resources/fonts/pangmen/821ad173f8fd8eccd214241cc651657b.woff2 +0 -0
- package/core/resources/fonts/pangmen/83ee6dce60a5f156da3ad18e5cfb3e6e.woff2 +0 -0
- package/core/resources/fonts/pangmen/87db73da676a2e7b3e640e84187a5c86.woff2 +0 -0
- package/core/resources/fonts/pangmen/89b2edc17dd7ab4332f18b038d268068.woff2 +0 -0
- package/core/resources/fonts/pangmen/8b3f89232252b80f6e12ab91d93fda96.woff2 +0 -0
- package/core/resources/fonts/pangmen/928a7b39a7c4efdca10f70dfcdb917ac.woff2 +0 -0
- package/core/resources/fonts/pangmen/945d03601ca6e8be5f7e6043ecb716a5.woff2 +0 -0
- package/core/resources/fonts/pangmen/97de16fa122ebcbff22956b7b2de2f77.woff2 +0 -0
- package/core/resources/fonts/pangmen/9882677dd482462a6c1c0a1d7efbb15d.woff2 +0 -0
- package/core/resources/fonts/pangmen/9c46188cc1e1711f860fa06d2c29dcc1.woff2 +0 -0
- package/core/resources/fonts/pangmen/a279650fd2f2f115ab30cbbf748f85f9.woff2 +0 -0
- package/core/resources/fonts/pangmen/a3bfd69906b38ab891501ac997bd577d.woff2 +0 -0
- package/core/resources/fonts/pangmen/a4cc4f73c30d1dca3f7abd656705e239.woff2 +0 -0
- package/core/resources/fonts/pangmen/a54d94633b077f678d15b96ad9e6a9c9.woff2 +0 -0
- package/core/resources/fonts/pangmen/ab9bd513cba626dee079d3f8f35da118.woff2 +0 -0
- package/core/resources/fonts/pangmen/b4b057c12d1e44681bdb5c5e92f8e070.woff2 +0 -0
- package/core/resources/fonts/pangmen/b8c1e4b1ab3beb334fa773a50c9221b0.woff2 +0 -0
- package/core/resources/fonts/pangmen/b93617eda1294f0696193c5237320892.woff2 +0 -0
- package/core/resources/fonts/pangmen/bac50a33e26632667ed330c817b37dcf.woff2 +0 -0
- package/core/resources/fonts/pangmen/c31e6efe815ccefa90bebc1fa64aba8b.woff2 +0 -0
- package/core/resources/fonts/pangmen/c75ff5aa44a05db009b0a38d05f4040b.woff2 +0 -0
- package/core/resources/fonts/pangmen/ca70255a9a388b3f33cff49d5abc31f2.woff2 +0 -0
- package/core/resources/fonts/pangmen/cb249c8c31a2bee3d6a68fd1c74c061a.woff2 +0 -0
- package/core/resources/fonts/pangmen/cb898d32532efe5a7933672228bc620c.woff2 +0 -0
- package/core/resources/fonts/pangmen/cc3c33c20e8abd03b9e5acc637985d63.woff2 +0 -0
- package/core/resources/fonts/pangmen/cca20bec40d1a11ede1ec496d22cd026.woff2 +0 -0
- package/core/resources/fonts/pangmen/cedee24be6ea34e35c53c0ce5edd7af0.woff2 +0 -0
- package/core/resources/fonts/pangmen/d42c580643039640037f5c63750ac711.woff2 +0 -0
- package/core/resources/fonts/pangmen/dbe1c94b8d92f8915c33fff55b625716.woff2 +0 -0
- package/core/resources/fonts/pangmen/dced2d67eceeefa7f45ba44854174b8b.woff2 +0 -0
- package/core/resources/fonts/pangmen/dee98b9b0545a42fd3aaa87ec1fa213e.woff2 +0 -0
- package/core/resources/fonts/pangmen/e6ac6bb1654d431fe62556a342b16e52.woff2 +0 -0
- package/core/resources/fonts/pangmen/eb9be6e3e450bf5706308fcec576c6df.woff2 +0 -0
- package/core/resources/fonts/pangmen/ee8cb027810ba5b5d9016774789f747b.woff2 +0 -0
- package/core/resources/fonts/pangmen/f0ecb29938306af8e9117a24eefad319.woff2 +0 -0
- package/core/resources/fonts/pangmen/f1a1a697d45d7f13a71a0a38424a98a7.woff2 +0 -0
- package/core/resources/fonts/pangmen/f203894451810a009d6795f1b0493989.woff2 +0 -0
- package/core/resources/fonts/pangmen/f53b808c0d5afb527499049ba225198e.woff2 +0 -0
- package/core/resources/fonts/pangmen/f6f69823eda331486d1d1a6e676e1d4a.woff2 +0 -0
- package/core/resources/fonts/pangmen/fb1ad0e1ba9ca84b66aa88867ce4109c.woff2 +0 -0
- package/core/resources/fonts/pangmen/index.json +0 -95
package/README.md
ADDED
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
# @tencent/playable-scripts
|
|
2
|
+
|
|
3
|
+
HTML5 Playable Ads 构建工具,支持多广告渠道打包。
|
|
4
|
+
|
|
5
|
+
## 特性
|
|
6
|
+
|
|
7
|
+
- 🚀 **一键构建** - 轻松为不同广告渠道生成构建包
|
|
8
|
+
- ⚡ **自动优化** - 包含压缩、Tree-shaking 和死代码消除
|
|
9
|
+
- 🗜️ **fflate 压缩** - 编译时压缩,运行时解压,体积减少 40-60%
|
|
10
|
+
- 🎯 **多渠道支持** - 支持 Google Ads、Meta、AppLovin、Unity、IronSource、BigoAds 等
|
|
11
|
+
- 🎨 **主题系统** - 支持多主题批量构建
|
|
12
|
+
- 🔄 **并发构建** - 智能并发,大幅提升构建效率
|
|
13
|
+
|
|
14
|
+
## 快速开始
|
|
15
|
+
|
|
16
|
+
### 安装
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
tnpm install --save-dev @tencent/playable-scripts
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### 配置 package.json
|
|
23
|
+
|
|
24
|
+
```json
|
|
25
|
+
{
|
|
26
|
+
"scripts": {
|
|
27
|
+
"dev": "playable-scripts dev",
|
|
28
|
+
"build": "playable-scripts build",
|
|
29
|
+
"builds": "playable-scripts builds"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 启动开发服务器
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
npm run dev # 默认预览模式
|
|
38
|
+
npm run dev bigoads # 指定渠道调试
|
|
39
|
+
npm run dev -- --port 8080 # 指定端口
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 构建指定渠道
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
npm run build google # Google Ads
|
|
46
|
+
npm run build facebook # Meta
|
|
47
|
+
npm run build unity # Unity Ads
|
|
48
|
+
npm run build bigoads # BigoAds
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### 批量构建
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
npm run builds # 构建所有渠道
|
|
55
|
+
npm run builds -- -t "theme1,theme2" # 指定主题
|
|
56
|
+
npm run builds -- -c "google,facebook" # 指定渠道
|
|
57
|
+
npm run builds -- --parallel 4 # 指定并发数
|
|
58
|
+
|
|
59
|
+
# Windows PowerShell 兼容格式(推荐)
|
|
60
|
+
npm run builds -- "theme1" "google" # 位置参数:主题 渠道
|
|
61
|
+
npm run builds -- --themes="theme1,theme2" --channels="google,facebook"
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## 支持的广告渠道
|
|
65
|
+
|
|
66
|
+
| 渠道 | 命令 | 协议 |
|
|
67
|
+
|------|------|------|
|
|
68
|
+
| Preview (预览) | `preview` | none |
|
|
69
|
+
| Google Ads | `google` | none |
|
|
70
|
+
| Meta (Facebook) | `facebook` | none |
|
|
71
|
+
| AppLovin | `applovin` | mraid |
|
|
72
|
+
| Unity Ads | `unity` | mraid |
|
|
73
|
+
| IronSource | `ironsource` | mraid/dapi |
|
|
74
|
+
| TikTok / Pangle | `tiktok` | none |
|
|
75
|
+
| BigoAds | `bigoads` | bigo-mraid |
|
|
76
|
+
| Adikteev | `adikteev` | mraid |
|
|
77
|
+
| Moloco | `moloco` | none |
|
|
78
|
+
| Liftoff | `liftoff` | mraid (ZIP) |
|
|
79
|
+
| InMobi | `inmobi` | mraid |
|
|
80
|
+
| Snapchat | `snapchat` | snapchat |
|
|
81
|
+
|
|
82
|
+
## CLI 参数
|
|
83
|
+
|
|
84
|
+
| 参数 | 描述 | 默认值 |
|
|
85
|
+
|------|----------------|-----------|
|
|
86
|
+
| **广告渠道** | 目标广告渠道 | `preview` |
|
|
87
|
+
| `--out-dir` | 输出目录 | `dist` |
|
|
88
|
+
| `--obfuscate-level` | 代码混淆等级 (1-4) | `4` |
|
|
89
|
+
| `--fflate-compression` | 启用 fflate 压缩 | `true` |
|
|
90
|
+
| `--protocol` | 广告协议 | 渠道自动决定 |
|
|
91
|
+
| `--zip` | ZIP 输出结果 | `false` |
|
|
92
|
+
| `--port` | 开发服务器端口 | `3000` |
|
|
93
|
+
| `--open` | 自动打开浏览器 | `false` |
|
|
94
|
+
| `--language` | 语言代码 | `en` |
|
|
95
|
+
| `--is-channel-fold2zip ` | 所有渠道输出为 ZIP 结果 | `false` |
|
|
96
|
+
|
|
97
|
+
## 配置文件
|
|
98
|
+
|
|
99
|
+
支持两种配置文件(推荐使用 `builds.config.js`):
|
|
100
|
+
|
|
101
|
+
### builds.config.js(推荐)
|
|
102
|
+
|
|
103
|
+
```javascript
|
|
104
|
+
module.exports = {
|
|
105
|
+
// 项目基本信息
|
|
106
|
+
projectName: 'My-Game', // 可选,默认 'Phaser Game'
|
|
107
|
+
googlePlayUrl: 'https://play.google.com/...', // 可选
|
|
108
|
+
appStoreUrl: 'https://apps.apple.com/...', // 可选
|
|
109
|
+
|
|
110
|
+
// 渠道配置
|
|
111
|
+
channels: ['google', 'facebook', 'unity'], // 可选,有默认值
|
|
112
|
+
|
|
113
|
+
// 主题配置(可选)
|
|
114
|
+
themes: {
|
|
115
|
+
enabled: true, // 默认 false
|
|
116
|
+
sourceDir: 'src/theme', // 默认 'src/theme'
|
|
117
|
+
entryFile: 'src/theme/index.ts', // 默认 'src/theme/index.ts'
|
|
118
|
+
whitelist: null, // 可选,过滤函数
|
|
119
|
+
},
|
|
120
|
+
|
|
121
|
+
// 文件命名配置(可选)
|
|
122
|
+
naming: {
|
|
123
|
+
language: 'EN', // 默认 'EN'
|
|
124
|
+
format: '无', // 默认 '无'
|
|
125
|
+
supplier: 'AIX', // 默认 'AIX'
|
|
126
|
+
follower: 'ZQL', // 默认 'ZQL'
|
|
127
|
+
generator: null, // 可选,自定义生成函数
|
|
128
|
+
},
|
|
129
|
+
|
|
130
|
+
// 构建配置(可选)
|
|
131
|
+
build: {
|
|
132
|
+
outputDir: 'dist-all', // 默认 'dist-all'
|
|
133
|
+
tempDirPrefix: 'dist-temp', // 默认 'dist-temp'
|
|
134
|
+
continueOnError: true, // 默认 true
|
|
135
|
+
cleanTemp: true, // 默认 true
|
|
136
|
+
parallel: undefined, // 默认自动计算(CPU核心数-1,最小2最大8)
|
|
137
|
+
},
|
|
138
|
+
cosConfig: {
|
|
139
|
+
enabled: true, // 是否启用 COS 上传
|
|
140
|
+
SecretId: 'YOUR_SECRET_ID', // 腾讯云 SecretId
|
|
141
|
+
SecretKey: 'YOUR_SECRET_KEY', // 腾讯云 SecretKey
|
|
142
|
+
Bucket: 'your-bucket-1234567890', // COS 存储桶名称
|
|
143
|
+
Region: 'ap-guangzhou', // COS 区域
|
|
144
|
+
CdnDomain: 'your-cdn-domain.com', // CDN 域名(用于生成访问链接)
|
|
145
|
+
PathPrefix: 'playable/preview', // COS 路径前缀(可选)
|
|
146
|
+
},
|
|
147
|
+
// 打包参数(可选)
|
|
148
|
+
obfuscateLevel: 4, // 默认 4
|
|
149
|
+
fflateCompression: false, // 默认 true
|
|
150
|
+
};
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### build.json(向后兼容)
|
|
154
|
+
|
|
155
|
+
```json
|
|
156
|
+
{
|
|
157
|
+
"app": "AppName",
|
|
158
|
+
"name": "ConceptName",
|
|
159
|
+
"google_play_url": "https://play.google.com/...",
|
|
160
|
+
"app_store_url": "https://apps.apple.com/..."
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### 配置优先级
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
命令行参数 > build.json > builds.config.js > 默认值
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## 代码混淆等级
|
|
171
|
+
|
|
172
|
+
| 等级 | 名称 | 说明 | 体积影响 |
|
|
173
|
+
|------|------|------|----------|
|
|
174
|
+
| **1** | terser-only | 仅 Terser 压缩 | 基准 |
|
|
175
|
+
| **2** | basic | 控制流平坦化 + 字符串编码 | +5~10% |
|
|
176
|
+
| **3** | dead-code | 等级 2 + 死代码注入 | +15~25% |
|
|
177
|
+
| **4** | maximum | 全部拉满(默认) | +30~50% |
|
|
178
|
+
|
|
179
|
+
## fflate 压缩
|
|
180
|
+
|
|
181
|
+
| 指标 | 效果 |
|
|
182
|
+
|------|------|
|
|
183
|
+
| **压缩率** | 66-68% |
|
|
184
|
+
| **体积减少** | 40-60% |
|
|
185
|
+
| **解压速度** | 3-5ms |
|
|
186
|
+
| **兼容性** | 99%+ 浏览器 |
|
|
187
|
+
|
|
188
|
+
## 批量构建
|
|
189
|
+
|
|
190
|
+
### 特性
|
|
191
|
+
|
|
192
|
+
1. **智能并发** - 自动根据 CPU 核心数优化(默认:核心数-1,最小2最大8)
|
|
193
|
+
2. **独立临时目录** - 每个任务使用独立目录,避免冲突
|
|
194
|
+
3. **主题切换** - 自动切换主题入口文件
|
|
195
|
+
4. **错误容忍** - 单个失败不影响其他构建
|
|
196
|
+
|
|
197
|
+
### 命令行参数
|
|
198
|
+
|
|
199
|
+
| 参数 | 缩写 | 描述 | 示例 |
|
|
200
|
+
|------|------|------|------|
|
|
201
|
+
| `--themes` | `-t` | 指定主题列表(逗号分隔) | `-t "theme1,theme2"` |
|
|
202
|
+
| `--channels` | `-c` | 指定渠道列表(逗号分隔) | `-c "google,facebook"` |
|
|
203
|
+
| `--parallel` | `-p` | 指定并发数 | `-p 4` |
|
|
204
|
+
| 位置参数 | - | 第一个参数=主题,第二个=渠道 | `"theme1" "google"` |
|
|
205
|
+
| `=` 格式 | - | Windows PowerShell 兼容 | `--themes="theme1"` |
|
|
206
|
+
|
|
207
|
+
**注意**:
|
|
208
|
+
- **Mac/Linux**:所有格式均可使用
|
|
209
|
+
- **Windows PowerShell**:推荐使用位置参数或 `--themes=value` 格式
|
|
210
|
+
- **Windows CMD**:所有格式均可使用
|
|
211
|
+
|
|
212
|
+
### 输出结构
|
|
213
|
+
|
|
214
|
+
```
|
|
215
|
+
dist-all/
|
|
216
|
+
├── theme1/
|
|
217
|
+
│ ├── google/
|
|
218
|
+
│ │ └── theme1-EN-无-3月-20260304-AIX-ZQL-google.html
|
|
219
|
+
│ └── facebook/
|
|
220
|
+
│ └── theme1-EN-无-3月-20260304-AIX-ZQL-facebook.html
|
|
221
|
+
└── theme2/
|
|
222
|
+
└── ...
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
## 全局变量
|
|
226
|
+
|
|
227
|
+
构建时自动注入:
|
|
228
|
+
|
|
229
|
+
| 变量 | 描述 | 示例 |
|
|
230
|
+
|------|------|------|
|
|
231
|
+
| `__DEV__` | 开发模式标志 | `true` / `false` |
|
|
232
|
+
| `AD_NETWORK` | 当前广告渠道 | `"google"`, `"bigoads"` |
|
|
233
|
+
| `AD_PROTOCOL` | 当前广告协议 | `"none"`, `"mraid"` |
|
|
234
|
+
| `GOOGLE_PLAY_URL` | Google Play 链接 | `"https://..."` |
|
|
235
|
+
| `APP_STORE_URL` | App Store 链接 | `"https://..."` |
|
|
236
|
+
|
|
237
|
+
## 配套 SDK
|
|
238
|
+
|
|
239
|
+
配合 `@tencent/playable-sdk` 使用:
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
tnpm install @tencent/playable-sdk
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
```javascript
|
|
246
|
+
import { sdk } from '@tencent/playable-sdk';
|
|
247
|
+
|
|
248
|
+
sdk.init((width, height) => {
|
|
249
|
+
new Game(width, height);
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
sdk.start(); // 游戏开始
|
|
253
|
+
sdk.finish(); // 游戏结束
|
|
254
|
+
sdk.install(); // 跳转商店
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
## 许可证
|
|
258
|
+
|
|
259
|
+
MIT License
|
|
@@ -1,2 +1,45 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
'use strict';
|
|
4
|
+
|
|
5
|
+
process.on('unhandledRejection', (err) => {
|
|
6
|
+
throw err;
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
const spawn = require('cross-spawn');
|
|
10
|
+
|
|
11
|
+
const args = process.argv.slice(2);
|
|
12
|
+
|
|
13
|
+
const scriptIndex = args.findIndex((x) => x === 'build' || x === 'dev' || x === 'vite-dev' || x === 'builds' || x === 'pack');
|
|
14
|
+
|
|
15
|
+
const script = scriptIndex === -1 ? args[0] : args[scriptIndex];
|
|
16
|
+
const nodeArgs = scriptIndex > 0 ? args.slice(0, scriptIndex) : [];
|
|
17
|
+
|
|
18
|
+
if (['build', 'dev', 'vite-dev', 'builds', 'pack'].includes(script)) {
|
|
19
|
+
const result = spawn.sync(
|
|
20
|
+
process.execPath,
|
|
21
|
+
nodeArgs.concat(require.resolve('../commands/' + script)).concat(args.slice(scriptIndex + 1)),
|
|
22
|
+
{
|
|
23
|
+
stdio: 'inherit'
|
|
24
|
+
}
|
|
25
|
+
);
|
|
26
|
+
if (result.signal) {
|
|
27
|
+
if (result.signal === 'SIGKILL') {
|
|
28
|
+
console.log(
|
|
29
|
+
'The build failed because the process exited too early. ' +
|
|
30
|
+
'This probably means the system ran out of memory or someone called ' +
|
|
31
|
+
'`kill -9` on the process.'
|
|
32
|
+
);
|
|
33
|
+
} else if (result.signal === 'SIGTERM') {
|
|
34
|
+
console.log(
|
|
35
|
+
'The build failed because the process exited too early. ' +
|
|
36
|
+
'Someone might have called `kill` or `killall`, or the system could ' +
|
|
37
|
+
'be shutting down.'
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
process.exit(result.status);
|
|
43
|
+
} else {
|
|
44
|
+
console.log('Unknown script "' + script + '".');
|
|
45
|
+
}
|
package/cli/commands/build.js
CHANGED
|
@@ -1,27 +1,139 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
process.env.BABEL_ENV = 'production';
|
|
4
|
+
process.env.NODE_ENV = 'production';
|
|
5
|
+
|
|
6
|
+
const fs = require('fs');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
const { runBuild } = require('../../core/webpack.build.js');
|
|
9
|
+
const { runThemeValidation, restoreSchema } = require('../../core/utils/validateThemeData');
|
|
10
|
+
const { runPreBuildChecks } = require('../../core/validators/pre-build-checker.js');
|
|
11
|
+
const { FontInjectionWebpackPlugin } = require('../../core/plugins/FontInjectionWebpackPlugin.js');
|
|
12
|
+
|
|
13
|
+
/**
|
|
2
14
|
* 从主题入口文件中检测当前主题名称。
|
|
3
15
|
* 支持以下模式:
|
|
4
16
|
* export { default } from './themeName';
|
|
5
17
|
* import Theme from './themeName';
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
|
|
18
|
+
*/
|
|
19
|
+
function detectCurrentTheme(projectRoot) {
|
|
20
|
+
// 尝试加载 builds.config.js 获取主题配置
|
|
21
|
+
const buildsConfigPath = path.join(projectRoot, 'builds.config.js');
|
|
22
|
+
let themeConfig = { sourceDir: 'src/theme', entryFile: 'src/theme/index.ts' };
|
|
23
|
+
|
|
24
|
+
if (fs.existsSync(buildsConfigPath)) {
|
|
25
|
+
try {
|
|
26
|
+
delete require.cache[buildsConfigPath];
|
|
27
|
+
const config = require(buildsConfigPath);
|
|
28
|
+
if (config.themes) {
|
|
29
|
+
themeConfig = { ...themeConfig, ...config.themes };
|
|
30
|
+
}
|
|
31
|
+
} catch (e) {
|
|
32
|
+
// 忽略错误
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const entryPath = path.join(projectRoot, themeConfig.entryFile);
|
|
37
|
+
if (!fs.existsSync(entryPath)) {
|
|
38
|
+
return { themeName: null, themeConfig };
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const content = fs.readFileSync(entryPath, 'utf8');
|
|
42
|
+
|
|
43
|
+
// 匹配: export { default } from './themeName' 或 import ... from './themeName'
|
|
44
|
+
const match = content.match(/from\s+['"]\.\/([^'"]+)['"]/);
|
|
45
|
+
if (match) {
|
|
46
|
+
return { themeName: match[1], themeConfig };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return { themeName: null, themeConfig };
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// --- 主流程 ---
|
|
53
|
+
const projectRoot = process.cwd();
|
|
54
|
+
const { themeName, themeConfig } = detectCurrentTheme(projectRoot);
|
|
55
|
+
|
|
56
|
+
let schemaPathToRestore = null;
|
|
57
|
+
|
|
58
|
+
// ============================================================
|
|
11
59
|
// 📌 编译前检查(埋点验证等)
|
|
12
60
|
// ============================================================
|
|
13
61
|
// 支持通过环境变量控制是否跳过检查
|
|
14
62
|
// - SKIP_PRE_BUILD_CHECKS=1: 强制跳过检查
|
|
15
63
|
// - PLAYABLE_BATCH_MODE=1: 批量构建模式,子进程自动跳过检查(主进程已执行)
|
|
16
|
-
const isBatchMode=process.env.PLAYABLE_BATCH_MODE
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
64
|
+
const isBatchMode = process.env.PLAYABLE_BATCH_MODE === '1';
|
|
65
|
+
const shouldSkipChecks = process.env.SKIP_PRE_BUILD_CHECKS === '1' || isBatchMode;
|
|
66
|
+
|
|
67
|
+
async function runPreChecks() {
|
|
68
|
+
if (shouldSkipChecks) {
|
|
69
|
+
console.log('\n⚠️ 跳过编译前检查(SKIP_PRE_BUILD_CHECKS=1)\n');
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const checkResult = await runPreBuildChecks(projectRoot, {
|
|
74
|
+
verbose: false,
|
|
75
|
+
showDetails: true,
|
|
76
|
+
failFast: false
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
if (!checkResult.success) {
|
|
80
|
+
console.error('\n❌ 编译前检查失败,终止构建。');
|
|
81
|
+
console.error('提示:如需跳过检查,可设置环境变量: SKIP_PRE_BUILD_CHECKS=1\n');
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// 执行编译前检查(异步)
|
|
87
|
+
runPreChecks().then(() => {
|
|
88
|
+
// 检查通过后继续原有流程
|
|
89
|
+
continueWithBuild();
|
|
90
|
+
}).catch((err) => {
|
|
91
|
+
console.error('\n❌ 编译前检查出错:', err);
|
|
92
|
+
process.exit(1);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
function continueWithBuild() {
|
|
96
|
+
// In batch mode (PLAYABLE_BATCH_MODE=1), the parent process has already
|
|
97
|
+
// executed runThemeValidation and overwritten theme.schema.json5 with merged data.
|
|
98
|
+
// Running it again in child processes would cause a race condition:
|
|
99
|
+
// 1. Child reads the already-overwritten schema (pure data, no "properties"/"default")
|
|
100
|
+
// 2. extractDefaultsFromSchema returns {} (empty)
|
|
101
|
+
// 3. Child overwrites schema with {} → file becomes empty object
|
|
102
|
+
const isBatchMode = process.env.PLAYABLE_BATCH_MODE === '1';
|
|
103
|
+
|
|
104
|
+
if (themeName && !isBatchMode) {
|
|
105
|
+
const buildLog = (msg, level) => {
|
|
106
|
+
const colors = { info: '\x1b[36m', success: '\x1b[32m', error: '\x1b[31m' };
|
|
107
|
+
const reset = '\x1b[0m';
|
|
108
|
+
const color = colors[level] || '';
|
|
109
|
+
console.log(`${color}[build] ${msg}${reset}`);
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
const { valid, schemaPath } = runThemeValidation(themeName, projectRoot, themeConfig, { log: buildLog });
|
|
113
|
+
schemaPathToRestore = schemaPath;
|
|
114
|
+
|
|
115
|
+
if (!valid) {
|
|
116
|
+
// 校验失败时恢复 schema(备份可能已创建)
|
|
117
|
+
if (schemaPathToRestore) restoreSchema(schemaPathToRestore);
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// 注入字体插件(build 模式 base64 内联)
|
|
123
|
+
const fontPlugin = themeName
|
|
124
|
+
? new FontInjectionWebpackPlugin({ projectRoot, themeName, themeConfig })
|
|
125
|
+
: null;
|
|
126
|
+
|
|
127
|
+
// 执行构建,无论成功或失败都恢复 schema
|
|
128
|
+
runBuild(undefined, undefined, undefined, {
|
|
129
|
+
plugins: fontPlugin ? [fontPlugin] : [],
|
|
130
|
+
})
|
|
131
|
+
.then(() => {
|
|
132
|
+
if (schemaPathToRestore) restoreSchema(schemaPathToRestore);
|
|
133
|
+
})
|
|
134
|
+
.catch((err) => {
|
|
135
|
+
if (schemaPathToRestore) restoreSchema(schemaPathToRestore);
|
|
136
|
+
console.error(err);
|
|
137
|
+
process.exit(1);
|
|
138
|
+
});
|
|
139
|
+
}
|
package/cli/commands/builds.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
'use strict';
|
|
4
|
+
|
|
5
|
+
/**
|
|
3
6
|
* Batch Builds Command for playable-scripts
|
|
4
7
|
*
|
|
5
8
|
* 支持:
|
|
@@ -13,4 +16,12 @@
|
|
|
13
16
|
* playable-scripts builds -c "google,facebook" # 指定渠道
|
|
14
17
|
* playable-scripts builds -t "theme1" -c "google" # 指定主题和渠道
|
|
15
18
|
* playable-scripts builds --parallel 3 # 设置并发数
|
|
16
|
-
*/
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
process.on('unhandledRejection', (err) => {
|
|
22
|
+
throw err;
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
const { buildBatch } = require('../../core/batch-build');
|
|
26
|
+
|
|
27
|
+
buildBatch();
|
package/cli/commands/dev.js
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
process.env.BABEL_ENV = 'development';
|
|
4
|
+
process.env.NODE_ENV = 'development';
|
|
5
|
+
|
|
6
|
+
const { runDev } = require('../../core/webpack.dev.js');
|
|
7
|
+
runDev();
|