Brunch, RequireJS, and ReactJS is giving me "Error: Mismatched anonymous define() module"

Brunch, RequireJS, and ReactJS is giving me "Error: Mismatched anonymous define() module"

问题: 在 requirejs 和 b运行ch 情况下,我根本无法使 React.js 正常工作。

我收到 react.js 库的不匹配定义错误,并且 React 没有出现在 windows object.I 我不确定该怎么做,并希望一些这里有人指导如何解决这个问题。也许我错误地使用了这种技术组合,也许这是不可能的?任何对我可能做错了什么的见解或解决此问题的建议都将不胜感激!

顺便说一句,如果我删除对 react.js 的 bower 引用,并从应用程序中删除所有 react.js 信息,一切都会正常工作。

请参阅我的以下编辑以获取一些其他评论和发现!

实际错误:

Error: Mismatched anonymous define() module: function (){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;odereq,module,exports){*

Project文件结构如下:

Projectname
 |-app
   |-assets
     |-index.html
   |-components
     |-appinit.js
   |-styles
 |-bower_components
   |-react
   |-requirejs
 |-node_modules
 |-public
 |-bower.json
 |-brunch.config

brunch.config文件,我觉得挺标准的,下面是内容:

exports.config = {
    "modules": {
        "definition" : "amd",
        "wrapper" : "amd"
    },
    "files": {
        "stylesheets": {
            "defaultExtension": "css",
            "joinTo": {
                "css/app.css": /^app\/styles/,
                "css/vendor.css": /^(bower_components|vendor)/
            }
        },
        "javascripts": {
            "joinTo": {
                "js/app.js": /^app/,
                "js/vendor.js": /^(bower_components|vendor)[\/]/,
                "test/js/test.js": /^test(\/|\)(?!vendor)/,
                "test/js/test-vendor.js": /^test(\/|\)(?=vendor)/
            },
            "order": {
                "before": [
                    'bower_components/requirejs/require.js'
                ]
            }
        }
    }
};

这里是 index.html 文件的内容:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>My Application Test</title>

        <!-- Bootstrap core CSS -->
        <link rel="stylesheet" href="/css/app.css">
        <script src="/js/vendor.js"></script>
        <script src="/js/app.js"></script>
        <script>
            require.config({
                "paths": {
                    "react": "bower_components/react/react-with-addons"
                },
                "shim": {
                    "react": {
                        exports: "React"
                    }
                },
                waitSeconds: 10
            });

            require(["components/appinit"], function (appInit) {
                appInit.init();
            });
        </script>
    </head>
    <body style="height:100%; width:100%;">
        <div id="main-content" style="margin-left: 100px; margin-top: 22px;">
            My Main Content Goes Here.
        </div>
    </body>
</html>

以及appinit.js文件的内容

define(function() {
    var mainModule;

    return mainModule = {
        init: function () {
            console.log("This is a test.");
            return mainModule;
        }
    };
});

bower.json 文件 包含以下内容:

{
  "name": “brunchreactrequirejstest",
  "version": "1.0.0",
  "homepage": "",
  "authors": [
    “person x"
  ],
  "description": “description",
  "main": "public/js/app.js",
  "license": "MIT",
  "ignore": [
    "**/.*",
    "node_modules",
    "bower_components",
    "test",
    "tests"
  ],
  "dependencies": {
    "requirejs": "~2.1.15",
    "react": "~0.12.2"
  }
}

编辑

所以我相信我离解决这个问题越来越近了。我刚刚发现 b运行ch 只在非供应商 javascript 周围添加了定义包装器。所以,react.js 被编译成 vendor.js 文件,没有任何定义名称,所以 require.js 抛出 react.js 是匿名的异常。所以,也许我需要在编译过程中在供应商文件上添加 b运行ch 运行 r.js ?这听起来正确吗?我该如何在 b运行ch 中做到这一点?

React 项目不提供开箱即用的 AMD 接口,正如您在编辑中指出的那样,这不是 Brunch 会在供应商文件上为您做的事情。

您的选择似乎是将您的项目转换为使用 CommonJS 模块模式或使用 AMD 适配器,例如 https://github.com/philix/jsx-requirejs-plugin

可能的解决方案:

所以我现在已经在 requirejs(AMD) 环境中运行了。我发现我的方法存在一个问题,那就是我相信一些与 React 一起工作的库期望将 React 作为全局公开 object.I 相信我可以将其填充到 requirejs export.config () 通过创建一个 requirejs 定义,手动将 react 放入浏览器 window 范围(稍后会详细介绍。)

以下是我所做的允许 React 在 AMD/RequireJS 环境中工作的更改:

(新)brunch.config 文件:

exports.config = {
    "modules": {
        "definition" : "amd",
        "wrapper" : "amd"
    },
    "files": {
        "stylesheets": {
            "defaultExtension": "css",
            "joinTo": {
                "css/app.css": /^app\/styles/,
                "css/vendor.css": /^(bower_components|vendor)/
            }
        },
        "javascripts": {
            "joinTo": {
                "js/app.js": /^app/,
                "js/vendor.js": /^(bower_components|vendor)[\/](?!react\/)/,
                "test/js/test.js": /^test(\/|\)(?!vendor)/,
                "test/js/test-vendor.js": /^test(\/|\)(?=vendor)/
            },
            "order": {
                "before": [
                    'bower_components/requirejs/require.js'
                ]
            }
        }
    },
    "plugins":{
        "react": {
                "harmony": "yes"
            }
    }
};

(新)index.html'head'现在只包含这个:

<link rel="stylesheet" href="/css/app.css">
<script src="/js/vendor.js"></script>
<script src="/js/app.js"></script>
<script>
    require(["components/appinit"], function (appInit) {
        appInit.init();
    });
</script>

build.js 文件: 所以我创建的这个文件在我调用项目 'npm start' 时由 node.js 执行,你将在下面的 package.json 文件中看到:

({
    baseUrl: ".",
    optimize: "none",
    paths: {
        react: "bower_components/react/react-with-addons"
    },
    name: "react",
    out: "vendor/react-built.js"
})

基本上,它将 bower 路径分配给 react 路径,名称获取 bower 路径,以便它知道 r.js 将优化的文件的位置。 require.js 优化后的文件然后作为 react-built.js 被扔到供应商文件夹中。如果你还记得上面的内容,在我的新早午餐配置文件中,我排除了 bower-react javascript 库被编译到最终的 vendor.js 文件中,因为我已经添加了 requirejs 优化的 react 库使用此 build.js 文件生成。

因此 NPM package.json 文件的脚本部分如下所示:

  "scripts": {
    "start": "node node_modules/requirejs/bin/r.js -o build.js && brunch watch --server"
  }

本质上,当您调用 'npm start' 时,r.js 会使用传递给它的 build.js 文件执行,然后调用 brunch。

因此,正如 es128 所提到的,下一部分是让任何 JSX 注释文件在 brunch 包装它们以包含 AMD 之前被预处理到 javascript。

== 编辑 所以通过 npm 安装 react-brunch 插件效果很好。保存 .jsx 文件后,.jsx 文件会编译为 javascript。我用插件信息更新了上面的 brunch-config 文件。我还没有将 React 全局填充和导出到 window 范围,但我相信这可能是一个不同的 Whosebug 主题,因为它与我原来的问题无关。