You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Create React App中修改react-unity-webgl的JS文件MIME类型

解决Create React App中React-Unity-WebGL加载Unity包时MIME类型错误问题

问题场景

在Windows环境下使用Create React App运行项目,通过react-unity-webgl加载Unity WebGL构建包时,网络面板显示loader.js文件的MIME类型被识别为text/html,导致文件无法正常执行,触发以下报错:

expected expression, got '<'
The script from “http://localhost:3000/game/samplegame/unity/samplegame/Build/samplegame.loader.js” was loaded even though its MIME type (“text/html”) is not a valid JavaScript MIME type.

使用的React组件代码:

import React from 'react';
import { Unity, useUnityContext } from 'react-unity-webgl';

const Samplegame = () => {
    const { unityProvider } = useUnityContext({
        loaderUrl: "unity/samplegame/Build/samplegame.loader.js",
        dataUrl: "unity/samplegame/Build/samplegame.data.gz",
        frameworkUrl: "unity/samplegame/Build/samplegame.js.gz",
        codeUrl: "unity/samplegame/Build/samplegame.wasm.gz",
    });

    return (
        <div>
            <h2>Sample Game</h2>
            <Unity unityProvider={unityProvider} style={{ width: "960px", height: "600px" }} />
        </div>
    );
};

export default Samplegame;

曾尝试用react-app-rewired修改Webpack配置,但未解决问题,config-overrides.js代码如下:

const { override, addWebpackPlugin } = require('customize-cra');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const path = require('path');

module.exports = override(
    addWebpackPlugin(
        new CopyWebpackPlugin({
            patterns: [
                {
                    from: path.resolve(__dirname, 'public/unity'),
                    to: path.resolve(__dirname, 'build/unity'),
                    transform(content, filePath) {
                        if (filePath.endsWith('.js')) {
                            return Buffer.from(content.toString().replace(/text\/plain/g, 'application/javascript'));
                        }
                        return content;
                    },
                },
            ],
        })
    )
);

解决方案

1. 修正资源路径为绝对路径

报错中的请求路径是http://localhost:3000/game/samplegame/unity/samplegame/Build/samplegame.loader.js,但组件里配置的是相对路径unity/samplegame/Build/...。如果当前组件挂载在/game/samplegame路由下,相对路径会被解析为嵌套的game/samplegame/unity/...,导致请求的文件不存在,服务器返回404页面(HTML),因此MIME类型显示为text/html。

将所有资源路径改为以/开头的绝对路径:

const { unityProvider } = useUnityContext({
    loaderUrl: "/unity/samplegame/Build/samplegame.loader.js",
    dataUrl: "/unity/samplegame/Build/samplegame.data.gz",
    frameworkUrl: "/unity/samplegame/Build/samplegame.js.gz",
    codeUrl: "/unity/samplegame/Build/samplegame.wasm.gz",
});

确保Unity构建包已放置在项目的public/unity目录下,CRA开发服务器会自动托管该目录下的静态文件。

2. 移除无效的Webpack配置

之前的config-overrides.js中尝试替换文件内容的操作完全无效,因为MIME类型错误的根源不是文件内容,而是请求路径错误导致返回HTML页面。此外,CopyWebpackPlugin在开发环境中不会生效,CRA默认会从public目录托管静态资源,无需额外配置拷贝。

如果没有其他Webpack定制需求,直接删除config-overrides.js,恢复CRA默认配置即可。

3. 验证静态资源存在性

确认public/unity/samplegame/Build目录下存在所有需要的文件:samplegame.loader.js、samplegame.data.gz、samplegame.js.gz、samplegame.wasm.gz。重启开发服务器后刷新页面,查看网络面板,确认这些文件的返回状态为200,且MIME类型符合预期:

  • .js文件:application/javascript
  • .gz文件:application/gzip
  • .wasm文件:application/wasm

内容的提问来源于stack exchange,提问作者Hans Joseph Himawan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 01:00:23