我希望能够将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应用呈现在客户端的某个容器中。
MyApp#init
我在以正确的方式思考吗?有没有更简单或更有效的方法来解决此问题?
我的错误是Uncaught TypeError: Cannot set property 'MyApp' of undefined,因为thisIIFE内部是undefined。我真的很想了解为什么会这样以及如何解决它的建议。
Uncaught TypeError: Cannot set property 'MyApp' of undefined
this
undefined
提前致谢!
让我有种找到了一个解决方案,如所描述这里
如果我更改webpack.config.js文件以将以下属性添加到output对象,即
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); }
然后,我可以在我的客户中执行以下操作。
和我的React应用程序渲染。
如果有人认为这是愚蠢的做法,我很想听听!
有关WEBPACK CONFIG的更多信息
请记住,我已经有一段时间没有接触过此代码了。鉴于它是Java语言,世界可能已经发展了,某些实践可能已经过时了。
这是我的React入口点文件(src/index.js)
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,这是我的前端将摄取的内容。
bundle.js