我希望能够将我的React应用程序与WebpackBundle 在一起,这样就可以使用与客户机相关的一组配置来获取、调用和初始化放在CDN上的分布式副本.

在阅读了thisthis之后,我正在设置我的网页条目文件,如下所示:

// ... React requires etc.

(() => {
  this.MyApp = (config) => {
    // some constructor code here
  }

  MyApp.prototype.init = () => {
    ReactDOM.render(<MyReactApp config={MyApp.config} />, someSelector);
  }
})();

我的 idea 是,在我的客户中,我可以做如下事情:

<script src="./bundle.js" type="text/javascript"></script>
<script type="text/javascript">
  MyApp.init({
    some: "config"
  });
</script>

我的MyApp#init函数将在客户端的某个容器中呈现我的React应用程序.

我想得对吗?有没有更简单或更有效的方法?

我的错误是Uncaught TypeError: Cannot set property 'MyApp' of undefined,因为生命中的thisundefined.我真的很想了解为什么会发生这种情况,以及如何解决它的建议.

提前谢谢!

推荐答案

所以我找到了一个解决方案,如here所述

如果我更改我的webpack.config.js文件,将以下属性添加到output对象,即.

var config = {
  // ...
  output: {
    // ...
    library: 'MyApp',
    libraryTarget: 'umd',
    umdNamedDefine: true,
  }
}

这将指定我将与webpackBundle 的文件作为UMD模块,因此如果我在该文件中有一个函数并将其导出...

export const init = (config) => {
  ReactDOM.render(<MyReactApp config={config} />, someSelector);
}

然后,在我的客户中,我可以做以下事情.

<script src="./bundle.js" type="text/javascript"></script>
<script type="text/javascript">
  MyApp.init({
    some: "config"
  }); 
</script>

我的React应用程序呈现.

如果有人认为这是一种愚蠢的做法,我很乐意听到!

MORE INFORMATION ON WEBPACK CONFIG

请记住,我已经有一段时间没碰过这个代码了.考虑到它是Javascript,世界可能已经向前发展,一些实践可能已经过时.

这是我的React入口点文件(src/index.js)

import 'babel-polyfill';
import React from 'react';
import { render } from 'react-dom';
import Root from './components/Root';
import configureStore from './lib/configureStore';

const store = configureStore();

export const init = (config) => {
  render(
    <Root store={store} config={config} />, 
    document.querySelector(config.selector || "")
  );
}

这是我的网页配置(webpack.config.js)

var webpack = require('webpack');
var path = require('path');
var loaders = require('./webpack.loaders');

module.exports = {
    entry: [
        'webpack-dev-server/client?http://0.0.0.0:8080', // WebpackDevServer host and port
        'webpack/hot/only-dev-server',
        './src/index.js' // Your appʼs entry point
    ],
    devtool: process.env.WEBPACK_DEVTOOL || 'source-map',
    output: {
        path: path.join(__dirname, 'public'),
        filename: 'bundle.js',
        library: 'Foo',
        libraryTarget: 'umd',
        umdNamedDefine: true,
    },
    resolve: {
        extensions: ['', '.js', '.jsx']
    },
    module: {
        loaders: loaders
    },
    devServer: {
        contentBase: "./public",
            noInfo: true, //  --no-info option
            hot: true,
            inline: true
        },
    plugins: [
        new webpack.NoErrorsPlugin()
    ]
};

正如你所见,我的网页配置输出我的bundle.js,这是我的前端将摄取.

Reactjs相关问答推荐

实时收听react前端应用程序中的webhook响应

如何实现黑暗模式 map ?

Reaction路由的问题-在Effect使用API调用响应设置状态之前呈现页面

为多租户SSO登录配置Azure AD应用程序

MUiv5和TSS-Reaction SSR问题:无法可靠地处理样式定义.CSSprops 中的ArrowFunctionExpression

如何使用useState响应快速/顺序状态更新

在任何渲染之前在ReactJs中获取数据

当从子状态更改复制时,react 父状态更改.我该如何防止这种情况?

对于 ref 上的可见 prop 或 open 方法来react 组件,哪种方式更好?

i18next中复数键的理解

每次状态更改时都会提交react 表单

如何在悬停时更改 MUI 卡内容

React - 添加了输入数据但不显示

为什么刷新页面时我的localStorage PET值变成空字符串?

Select 项目后 Select HeadlessUI 组合框中的所有文本?

更新 Next.js 路由查询更改的状态会导致无限循环

如何在 React 中单击鼠标的位置动态添加 div?

当状态改变时如何执行一些动作,但只针对第一次更新?

如何通过 Material Ui 设计将 Accordion 添加到您的 React 项目中?

React useEffect hooks return () => cleanup() vs return cleanup