creator如何实现资源CDN存储?

用creator构建web后生成的资源文件怎么切换到CDN?现在访问的是项目部署的服务器,想把资源换到其它CDN服务器上存储。


上传中… @nantas @panda

1赞

修改 main.js 里面的 rawAssetsBase 和 libraryPath 为正确的 url 地址

3赞

可以了,谢谢@jare:2:

资源链接后面支持加时间戳么?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'));