小编典典

用React&Webpack编写可嵌入的Javascript插件

reactjs

我希望能够将React应用程序与Webpack捆绑在一起,以便可以使用与客户端相关的一堆配置来获取,调用和初始化放在CDN上的分布式副本。

看完这个,我设置了我的WebPack项文件,如下所示:

// ... React requires etc.

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

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

想法是,在我的客户中,我可以执行以下操作:

<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,因为thisIIFE内部是undefined。我真的很想了解为什么会这样以及如何解决它的建议。

提前致谢!


阅读 331

收藏
2020-07-22

共1个答案

小编典典

让我有种找到了一个解决方案,如所描述这里

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

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

这指定了我与webpack捆绑在一起的文件作为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应用程序渲染。

如果有人认为这是愚蠢的做法,我很想听听!

有关WEBPACK CONFIG的更多信息

请记住,我已经有一段时间没有接触过此代码了。鉴于它是Java语言,世界可能已经发展了,某些实践可能已经过时了。

这是我的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配置(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()
    ]
};

如您所见,我的Webpack配置输出my bundle.js,这是我的前端将摄取的内容。

2020-07-22