用creator构建web后生成的资源文件怎么切换到CDN?现在访问的是项目部署的服务器,想把资源换到其它CDN服务器上存储。
上传中… @nantas @panda
修改 main.js 里面的 rawAssetsBase 和 libraryPath 为正确的 url 地址
可以了,谢谢@jare
资源链接后面支持加时间戳么?CDN有缓存,用时间戳区分版本
urlAppendTimestamp: function(url) {
cc.game.config[“noCache”]
…
}
你可以在引擎代码里搜搜这一段
noCache==true以后就加时间戳了
不过你这样做,并没有很好的利用缓存
1.6 支持加 md5 了
请教一下,main.js 里面异步加载 project.js ,如果project.js也走cdn。是不是只能修改 main.js 里面的地址。
同问,project.js可以从main里更改为cdn加载么
project.js可以从main里更改为cdn加载么
同问
var bundledScript = settings.debug ? 'src/project.dev.js' : 'src/project.js';
是的,还有那个raw-那里 cocos.min.js前面也可以加 这样都从cdn加载
音频和图片资源想设置不同的cdn域名怎么办
creator 2.x 最新版本,main.js 里面已经没rawAssetsBase 和 libraryPath 了,麻烦更新一下。
这个问题我也遇到了,3.7版本哪个配置可以解决这个问题吗?
分享一个web的解决方案,从index.html出发,递归查询里面用到的所有文件并改成cdn路径
/* ---------- 辅助 ---------- */
function isRelativeUrl(u) { return !/^(\w+:|\/\/|#)/.test(u); }
function cleanUrl(u) { return u.replace(/^\.?\//, ''); }
function read(fp) { return fs.readFileSync(fp, 'utf-8'); }
function write(fp, txt) { fs.writeFileSync(fp, txt); }
function exists(fp) { return fs.existsSync(fp); }
/* ---------- 递归核心 ---------- */
const visited = new Set();
function patchFile(absPath) {
if (!exists(absPath) || visited.has(absPath)) return;
visited.add(absPath);
const ext = path.extname(absPath).toLowerCase();
let code = read(absPath);
let dir = path.dirname(absPath);
if (ext === '.html') {
code = code.replace(/<title>.*<\/title>/, `<title>xxxx</title>`);
/* <base> 统一 */
code = code.replace(/<base[^>]*>/i, '');
code = code.replace(/<head>/i, `<head>\n <base href="${CDN_PREFIX}">`);
/* src / href */
code = code.replace(/(src|href)=["']([^"']+)["']/g, (_, attr, url) => {
if (!isRelativeUrl(url)) return _;
const clean = cleanUrl(url);
const absRef = path.join(dir, clean);
patchFile(absRef); // 递归
return `${attr}="${CDN_PREFIX}${clean}"`;
});
/* System.import(./xxx) */
code = code.replace(/System\.import\((['"])(\.\/[^'"]+)\1\)/g,
(_, q, rel) => `System.import(${q}${CDN_PREFIX}${cleanUrl(rel)}${q})`);
} else if (ext === '.json') {
try {
const obj = JSON.parse(code);
if (obj.importMap) {
for (const k in obj.importMap) {
const url = obj.importMap[k];
if (typeof url === 'string' && isRelativeUrl(url)) {
obj.importMap[k] = CDN_PREFIX + cleanUrl(url);
}
}
}
if (obj.paths) {
for (const k in obj.paths) {
const url = obj.paths[k];
if (typeof url === 'string' && isRelativeUrl(url)) {
obj.paths[k] = CDN_PREFIX + cleanUrl(url);
}
}
}
if (Array.isArray(obj.scripts)) {
obj.scripts = obj.scripts.map(u => isRelativeUrl(u) ? CDN_PREFIX + cleanUrl(u) : u);
}
/* 继续递归本 JSON 里引用的文件 */
for (const val of Object.values(obj)) {
if (typeof val === 'string' && isRelativeUrl(val)) {
patchFile(path.join(dir, cleanUrl(val)));
}
}
code = JSON.stringify(obj);
} catch { /* 非标准 JSON 忽略 */ }
} else if (ext === '.js') {
/* publicPath 注入 */
code = code.replace(/__globalThis__\.__publicPath__\s*=\s*['"][^'"]*['"]/,
`__globalThis__.__publicPath__='${CDN_PREFIX}'`);
/* importScripts 或其他字符串路径 */
code = code.replace(/(['"])(\.\/[^'"]+\.(?:js|json|png|jpg|webp|wasm))\1/g,
(_, q, rel) => {
const absRef = path.join(dir, cleanUrl(rel));
patchFile(absRef);
return `${q}${CDN_PREFIX}${cleanUrl(rel)}${q}`;
});
}
write(absPath, code);
}
const BUILD_DIR = './build/web-mobile';
patchFile(path.join(BUILD_DIR, 'index.html'));