186 lines
6.8 KiB
JavaScript
186 lines
6.8 KiB
JavaScript
import * as fs from "fs";
|
|
import * as path from "path";
|
|
import do_task from "./single-html/build.js";
|
|
import { createDist } from "./common/utils.js";
|
|
|
|
// 处理 HTML 渠道
|
|
async function processHtmlChannels(options) {
|
|
const outputPrefix = options.outputPrefix || "";
|
|
const htmlChannel = options.htmlChannel || [
|
|
"applovin",
|
|
"unity",
|
|
"appier",
|
|
"ironsource",
|
|
"mintegral",
|
|
"moloco",
|
|
];
|
|
for (const channelName of htmlChannel) {
|
|
// 遍历 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 中
|
|
if (["applovin", "unity", "appier", "ironsource"].includes(channelName)) {
|
|
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 (["mintegral", "moloco"].includes(channelName)) {
|
|
const fileName = `${channelName}.js`;
|
|
const sourceFile = path.join("networks", fileName);
|
|
const destFile = path.join("web-mobile", fileName);
|
|
if (fs.existsSync(sourceFile)) {
|
|
fs.copyFileSync(sourceFile, destFile);
|
|
console.log(`已复制: ${sourceFile} 到 ${destFile}`);
|
|
}
|
|
}
|
|
|
|
if (["facebook", "google", "tiktok"].includes(channelName)) {
|
|
if (channelName == "tiktok") {
|
|
fs.copyFileSync(
|
|
path.join("facebook/config.json"),
|
|
path.join("web-mobile", `config.json`)
|
|
);
|
|
fs.copyFileSync(
|
|
path.join("tiktok/tiktok.js"),
|
|
path.join("web-mobile", `tiktok.js`)
|
|
);
|
|
} else {
|
|
const sourceFile = path.join("networks", `${channelName}.js`);
|
|
const destinationFile = path.join("web-mobile", `${channelName}.js`);
|
|
console.log("------------------------", sourceFile);
|
|
if (fs.existsSync(sourceFile)) {
|
|
fs.copyFileSync(sourceFile, destinationFile);
|
|
console.log(`已复制: ${sourceFile} 到 ${destinationFile}`);
|
|
}
|
|
}
|
|
}
|
|
|
|
const htmlFilePath = path.join("web-mobile", "index.html");
|
|
// 读取 index.html 文件
|
|
let htmlContent = fs.readFileSync(htmlFilePath, "utf-8");
|
|
|
|
// 移除非当前渠道包的 <script> 标签
|
|
htmlChannel.forEach((channel) => {
|
|
if (channel !== channelName) {
|
|
const scriptRegex = new RegExp(
|
|
`<script src="${channel}.js" charset="utf-8"></script>\\n`,
|
|
"g"
|
|
);
|
|
htmlContent = htmlContent.replace(scriptRegex, "");
|
|
}
|
|
});
|
|
|
|
// 移除 mraid_support.js 和 mraid.js 的 <script> 标签
|
|
htmlContent = htmlContent.replace(
|
|
/<script src="mraid_support.js" charset="utf-8"><\/script>\n/g,
|
|
""
|
|
);
|
|
htmlContent = htmlContent.replace(
|
|
/<script src="mraid.js"><\/script>\n/g,
|
|
""
|
|
);
|
|
|
|
// 检查并插入新的渠道 script 标签
|
|
let channelScriptTag = '';
|
|
if (["applovin", "unity", "appier", "ironsource"].includes(channelName)) {
|
|
channelScriptTag = ` <script src="mraid_support.js" charset="utf-8"></script>\n`;
|
|
} else {
|
|
// @TODO
|
|
if (!channelName == "facebook") {
|
|
channelScriptTag = ` <script src="${channelName}.js" charset="utf-8"></script>\n`;
|
|
}
|
|
}
|
|
|
|
if (!htmlContent.includes(channelScriptTag)) {
|
|
htmlContent = htmlContent.replace(
|
|
/<\/head>/,
|
|
`${channelScriptTag}</head>`
|
|
);
|
|
}
|
|
|
|
// 替换包含 window.vConsole = new VConsole 的 <script> 标签, 引用 cocos2d-js-min.js
|
|
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(cocosScriptTag) &&
|
|
!htmlContent.includes(assetMapScriptTag)
|
|
) {
|
|
htmlContent = htmlContent.replace(cocosScriptTag, bodyScriptTags);
|
|
}
|
|
|
|
// 移除单渠道的 SDK script 标签
|
|
if (!["tiktok", "facebook", "google"].includes(channelName)) {
|
|
const sdkScriptTag = `<script src="https://sf16-muse-va.ibytedtos.com/obj/union-fe-nc-i18n/playable/sdk/playable-sdk.js"></script>\n`;
|
|
htmlContent = htmlContent.replace(sdkScriptTag, "");
|
|
}
|
|
|
|
fs.writeFileSync(htmlFilePath, htmlContent);
|
|
console.log(`已将 ${channelName}.js 和相关 script 引入到 index.html 中`);
|
|
|
|
// 调用 do_task 方法,将 web-mobile 下的所有包打包成一个 HTML
|
|
createDist();
|
|
|
|
do_task();
|
|
|
|
// 如果是 ironsource 渠道,将 <script src="mraid.js"></script> 插入到 body 标签之前
|
|
if (channelName === "ironsource") {
|
|
htmlContent = fs.readFileSync(path.join("dist", "index.html"), "utf-8");
|
|
htmlContent = htmlContent.replace(
|
|
/<\/body>/,
|
|
`<script src="mraid.js"></script></body>`
|
|
);
|
|
fs.writeFileSync(path.join("dist", "index.html"), htmlContent);
|
|
console.log(
|
|
`已将 <script src="mraid.js"></script> 写入到 ironsource.html 的 body 标签之前`
|
|
);
|
|
}
|
|
|
|
// 重命名生成的 index.html 为对应的渠道名称
|
|
const distIndexPath = path.join("dist", "index.html");
|
|
const channelIndexPath = path.join(
|
|
"dist",
|
|
`${outputPrefix}${channelName}.html`
|
|
);
|
|
if (fs.existsSync(distIndexPath)) {
|
|
fs.renameSync(distIndexPath, channelIndexPath);
|
|
console.log(`已重命名 index.html 为 ${channelName}.html`);
|
|
}
|
|
}
|
|
}
|
|
|
|
export default processHtmlChannels;
|