如题,是否可以在编译开始之前把项目中某些可能当前包体不需要的文件复制到独立的路劲下(比如说多个h5平台的sdk,当然有更好的方式抽离,比如在设计的时候就独立,这里只分析一下单独编译再合并这种方式的可行性),有人做过这样的插件么,有没有什么建议?

可行性分析
1、project.js文件编译后有对应class等文件的key值以及依赖项,单独编译的js文件或者ts文件编译完之后再以这种类似键值对的方式插入到project.js文件下。
2、被抽离出来的js文件,需要动态加载
目前看来应该是可行的,有没有人尝试过
‘use strict’;
let path = require(“path”);
let fs = require(“fs”);
let readline = require(‘readline’);
let inifile = path.join(“E:/Cocos/Projects/ywh5”, “./packages/custombuild/build.ini”);
let iniJson;
let back_dir = path.join(“E:/Cocos/Projects/ywh5”, “./packages/custombuild/temp/”);
//裁剪
function reduceScripts(callback) {
fs.exists(inifile, (isExist) => {
if (isExist) {
fs.readFile(inifile, (err, data) => {
if (err) {
console.error(err);
return;
}
iniJson = JSON.parse(data);
if (iniJson && iniJson.files && iniJson.files.length > 0) {
iniJson.scripts_root = iniJson.scripts_root || path.join(“E:/Cocos/Projects/ywh5”, “./assets/”);
backupscript(iniJson.files);
callback && callback();
} else {
callback && callback();
}
});
} else {
callback && callback();
}
});
};
//适配{}
function reg(str, tarReg) {
let startIdex, endIndex, total;
let regIdex = 0;
for (let i = 0; i < str.length; i++) {
if (str[i] === “{”) {
(!total) && (startIdex = i);
total !== void 0 ? (total++) : (total = 1);
} else if (str[i] === “}”) {
total–;
if (total === 0) {
endIndex = i;
regIdex++;
if (tarReg === regIdex)
break;
}
}
}
let targetStr = str.substr(startIdex + 1, endIndex - startIdex - 1);
return targetStr;
}
//分割脚本为map
function split(str) {
let regexp = new RegExp("[0-9a-zA-Z]");
let map = {};
let keyStart;
let key, regTotal;
map.values = {};
map.keys = [];
for (let i = 0; i < str.length; i++) {
if (keyStart === void 0 && regexp.test(str[i])) {
keyStart = i;
}
if (keyStart === void 0) continue;
if (str[i] === “:” && !key) {
key = str.substring(keyStart, i);
} else if (key) {
if (str[i] === “[”) {
regTotal !== void 0 ? (regTotal++) : (regTotal = 1);
} else if (str[i] === “]”) {
regTotal–;
if (regTotal === 0 && str[i - 1] !== “”") {
// console.log(key, i);
map.keys.push(key);
map.values[key] = str.substring(keyStart, i + 1);
keyStart = void 0;
key = void 0;
regTotal = void 0;
}
}
}
}
return map;
}
function merge(scriMap) {
let str = “”;
for(let i=0;i<scriMap.keys.length;i++){
if(scriMap.values[scriMap.keys[i]])
str += scriMap.values[scriMap.keys[i]]+",";
}
return str.substr(0, str.length -1);
}
function backupscript(files) {
let filestr = “”
let readliner = readline.createInterface({
input: fs.createReadStream(“E:/Cocos/Projects/ywh5/build/web-mobile/src/project.246b1.js”),
});
readliner.on(‘line’, function (chunk) {
filestr += chunk;
});
readliner.on(‘close’, function (chunk) {
let targetStr = reg(filestr, 2);
let scri = split(targetStr);
for (let key in files) {
if (scri.values[files[key]]) {
delete scri.values[files[key]];
console.log(files[key]);
}
}
filestr = filestr.replace(targetStr, merge(scri));
fs.writeFile("./tarScri.js", filestr, ()=>{});
});
// let prj = fs.readFileSync(“E:/Cocos/Projects/ywh5/build/web-mobile/src/project.js”);
};
reduceScripts();
无法单独编译,会丢失ccref。只能编译完了抽离