【发布时间】:2017-07-12 11:23:40
【问题描述】:
假设我有一个使用 redux 和一些 ajax 调用的普通反应应用程序。 如果我想将它传递给某人,我会给他们我使用 webpack 创建的捆绑 js 文件,并要求他们将其包含在他们的 HTML 中 + 渲染一个具有“myApp”的 id 的 div,例如:
<div id="myApp"></div>
好的,如果他们的网站也是用 react 创建的,并且他们想将我捆绑的 js 文件包含在他们的一个组件中,当然还要渲染相关的 div 怎么办?
我尝试使用import 或require 来模拟这个:require('./path/to/myBundle.js');import './path/to/myBundle.js';
例子:
//...
import './path/to/myBundle.js'; // the file that will render myApp to the relevant div
// ....
export function SomeApp(args){
return(
<div>
<div id="myApp"></div>
<SomeComponent />
</div>
);
};`
这不起作用,因为我收到一些错误:
未捕获的错误:缩小的 React 错误 #37;访问 http://facebook.github.io/react/docs/error-decoder.html?invariant=37 获取完整消息或使用非缩小开发环境获取完整信息 错误和其他有用的警告。
当我访问这个网站时,我看到:
_registerComponent(...):目标容器不是 DOM 元素。
但是,如果他们在他们的组件之外(例如顶级index.html)使用这个文件(myBundle.js),它当然可以正常工作。
编辑:
我忘了提到我想我知道问题出在哪里,应用程序还没有准备好带有这个div 的 HTML。但我不知道等待它存在的好方法。
在@Frxstrem 的回答之后编辑#2:
我正在尝试遵循这个答案,但我认为我做错了。
我有 2 份 corry house slingshot demo app 作为 app1 和 app2。
将 app1 的 webpack.config.prod.js 上的“输出”更改为:
output: {
path: path.resolve(__dirname, 'dist'),
publicPath: '/',
filename: 'app1Bundle.js',
library: "App1",
libraryTarget: "umd"
},
我正在尝试在 app2 的主页组件中呈现 app1。 所以我将“已发布”文件从 app1 复制到 app2 的根目录并调用文件夹 app1,然后添加了导入调用:
import {app1} from '../../app1/app1Bundle';
以及返回函数内的匹配标签:
const HomePage = () => {
return (
<div>
<app1 />
<h1>App 2</h1>
</div>
);
};
我收到与上面发布的相同的错误。
我也尝试了不同的组合:
import app1 from '../../app1/app1Bundle'; // without curly braces
甚至只是将脚本作为普通的 js 脚本获取
import '../../app1/app1Bundle';
或 要求('../../app1/app1Bundle');
然后尝试渲染一个 id 为“app1”的普通 div 标签
const HomePage = () => {
return (
<div>
<div id="app1"></div>
<h1>App 2</h1>
</div>
);
};
似乎没有任何效果,因为我仍然遇到同样的错误。 我认为问题在于脚本加载的时间和元素的渲染。我认为捆绑脚本正在搜索 div 时该 div 尚不存在。
【问题讨论】:
标签: javascript reactjs import webpack require