179 lines
6.4 KiB
JavaScript
179 lines
6.4 KiB
JavaScript
import * as fs from "fs";
|
||
import * as path from "path";
|
||
import archiver from "archiver";
|
||
import { createDist } from "./common/utils.js";
|
||
import do_task from "./single-html/build.js";
|
||
|
||
async function processChannels(options) {
|
||
const zipChannel = options.zipChannel || [
|
||
"facebook",
|
||
"google",
|
||
"tiktok",
|
||
"vungle",
|
||
"liftoff",
|
||
];
|
||
const outputPrefix = options.outputPrefix || "";
|
||
const zipToSingleDir = options.zipToSingleDir || false;
|
||
|
||
for (const channelName of zipChannel) {
|
||
// 遍历 networks 目录下的所有js文件,获取 文件名 然后删除 web-mobile 目录下的同名文件
|
||
const files = fs.readdirSync(path.join("networks"));
|
||
for (const file of files) {
|
||
if (file.endsWith(".js")) {
|
||
const destinationFile = path.join("web-mobile", file);
|
||
if (fs.existsSync(destinationFile)) {
|
||
fs.unlinkSync(destinationFile);
|
||
console.log(`已删除: ${destinationFile}`);
|
||
}
|
||
}
|
||
}
|
||
// tiktok 处理
|
||
const tiktokConfig = path.join("web-mobile", `config.json`);
|
||
if (fs.existsSync(tiktokConfig)) {
|
||
fs.unlinkSync(tiktokConfig);
|
||
}
|
||
const tiktokJs = path.join("web-mobile", `tiktok.js`);
|
||
if (fs.existsSync(tiktokJs)) {
|
||
fs.unlinkSync(tiktokJs);
|
||
}
|
||
|
||
// 从 networks 找到复制到 web-mobile 中
|
||
const sourceFile = path.join("networks", `${channelName}.js`);
|
||
const destinationFile = path.join("web-mobile", `${channelName}.js`);
|
||
|
||
if (channelName === "tiktok") {
|
||
fs.copyFileSync(
|
||
path.join("tiktok/config.json"),
|
||
path.join("web-mobile", `config.json`)
|
||
);
|
||
fs.copyFileSync(
|
||
path.join("tiktok/tiktok.js"),
|
||
path.join("web-mobile", `tiktok.js`)
|
||
);
|
||
} else if (channelName === "vungle" || channelName === "liftoff") {
|
||
// 对于 vungle 和 liftoff,使用 mraid_support.js
|
||
const mraidSupportFile = path.join("networks", "mraid_support.js");
|
||
const mraidDestinationFile = path.join("web-mobile", "mraid_support.js");
|
||
if (fs.existsSync(mraidSupportFile)) {
|
||
fs.copyFileSync(mraidSupportFile, mraidDestinationFile);
|
||
console.log(`已复制: ${mraidSupportFile} 到 ${mraidDestinationFile}`);
|
||
}
|
||
} else {
|
||
if (fs.existsSync(sourceFile)) {
|
||
fs.copyFileSync(sourceFile, destinationFile);
|
||
console.log(`已复制: ${sourceFile} 到 ${destinationFile}`);
|
||
}
|
||
}
|
||
|
||
const htmlFilePath = path.join("web-mobile", "index.html");
|
||
let htmlContent = fs.readFileSync(htmlFilePath, "utf-8");
|
||
|
||
// 移除其他渠道包的 <script> 标签
|
||
zipChannel.forEach((channel) => {
|
||
const scriptRegex = new RegExp(
|
||
`<script src="${channel}.js" charset="utf-8"></script>\\n`,
|
||
"g"
|
||
);
|
||
htmlContent = htmlContent.replace(scriptRegex, "");
|
||
});
|
||
|
||
// 移除所有渠道的 <meta> 标签
|
||
const metaTagRegex =
|
||
/<meta name="ad.size" content="width=480,height=320">\n/g;
|
||
htmlContent = htmlContent.replace(metaTagRegex, "");
|
||
|
||
// 检查并插入新的渠道 script 标签
|
||
let channelScriptTag;
|
||
if (channelName === "vungle" || channelName === "liftoff") {
|
||
channelScriptTag = ` <script src="mraid_support.js" charset="utf-8"></script>\n`;
|
||
} else {
|
||
channelScriptTag = ` <script src="${channelName}.js" charset="utf-8"></script>\n`;
|
||
}
|
||
|
||
if (!htmlContent.includes(channelScriptTag)) {
|
||
htmlContent = htmlContent.replace(
|
||
/<\/head>/,
|
||
`${channelScriptTag}</head>`
|
||
);
|
||
}
|
||
|
||
// 如果是 google 渠道,添加 <meta> 标签
|
||
if (channelName === "google") {
|
||
const metaTag = `<meta name="ad.size" content="width=480,height=320">\n`;
|
||
if (!htmlContent.includes(metaTag)) {
|
||
htmlContent = htmlContent.replace(/<\/head>/, `${metaTag}</head>`);
|
||
}
|
||
}
|
||
|
||
fs.writeFileSync(htmlFilePath, htmlContent);
|
||
console.log(`已将 ${channelName}.js 和 SDK script 引入到 index.html 中`);
|
||
|
||
createDist();
|
||
|
||
if (!zipToSingleDir) {
|
||
// 打包 web-mobile 目录为 zip 文件
|
||
const output = fs.createWriteStream(
|
||
path.join("dist", `${outputPrefix}${channelName}.zip`)
|
||
);
|
||
const archive = archiver("zip", {
|
||
zlib: { level: 9 }, // 设置压缩级别
|
||
});
|
||
|
||
output.on("close", function () {
|
||
console.log(
|
||
`已创建 ${channelName}.zip,大小为 ${archive.pointer()} 字节`
|
||
);
|
||
});
|
||
|
||
archive.on("error", function (err) {
|
||
throw err;
|
||
});
|
||
|
||
archive.pipe(output);
|
||
archive.directory("web-mobile/", false);
|
||
await archive.finalize();
|
||
} else {
|
||
// 单html包
|
||
const htmlFilePath = path.join("web-mobile", "index.html");
|
||
let htmlContent = fs.readFileSync(htmlFilePath, "utf-8");
|
||
|
||
// 替换包含 window.vConsole = new VConsole 的 <script> 标签
|
||
const vConsoleScriptRegex =
|
||
/<script type="text\/javascript">[\s\S]*?window\.vConsole = new VConsole\(\);[\s\S]*?<\/script>/;
|
||
// @TODO cocos的名称需要从web-mobile文件夹中获取找到
|
||
const cocosFileName = fs
|
||
.readdirSync("web-mobile")
|
||
.find(
|
||
(file) => file.startsWith("cocos2d-js-min") && file.endsWith(".js")
|
||
);
|
||
const cocosScriptTag = `<script src="${cocosFileName}" charset="utf-8"></script>\n`;
|
||
htmlContent = htmlContent.replace(vConsoleScriptRegex, cocosScriptTag);
|
||
|
||
// 额外引入 loader-and-starter.js 和 asset-map.js 到 body 中
|
||
const loaderScriptTag = `<script src="loader-and-starter.js" charset="utf-8"></script>\n`;
|
||
const assetMapScriptTag = `<script src="asset-map.js" charset="utf-8"></script>\n`;
|
||
const bodyScriptTags = `${cocosScriptTag}${loaderScriptTag}${assetMapScriptTag}`;
|
||
|
||
if (
|
||
!htmlContent.includes(loaderScriptTag) &&
|
||
!htmlContent.includes(assetMapScriptTag)
|
||
) {
|
||
htmlContent = htmlContent.replace(cocosScriptTag, bodyScriptTags);
|
||
}
|
||
|
||
// 检查并插入新的 SDK script 标签到 <body> 之前
|
||
// const sdkScriptTag = `<script src="https://sf16-muse-va.ibytedtos.com/obj/union-fe-nc-i18n/playable/sdk/playable-sdk.js"></script>\n`;
|
||
// if (!htmlContent.includes(sdkScriptTag)) {
|
||
// htmlContent = htmlContent.replace(/<\/body>/, `${sdkScriptTag}</body>`);
|
||
// }
|
||
|
||
fs.writeFileSync(htmlFilePath, htmlContent);
|
||
console.log(`已将 ${channelName}.js 和相关 script 引入到 index.html 中`);
|
||
|
||
do_task();
|
||
}
|
||
}
|
||
}
|
||
|
||
export default processChannels;
|