我有一个使用Webpack捆绑资产的Rails应用程序。它目前不使用React。
在一个单独的存储库中,我创建了一个React应用程序。这个React应用程序基本上实现了一个复杂的自定义UI元素。计划是我可以将此React组件导入到我的主应用程序中。
到目前为止,我已将git repo添加到我的package.json
文件中,可以看到我的react应用的源代码已下载到/node_modules
文件夹中。
我可以通过添加以下内容使Webpack捆绑该应用程序:
至React应用package.json
:
"prepare": "npm run build"
在我的主应用程序webpack.config
module.exports = {
...
resolve: {
...
alias: {
MyReactApp: 'my-react-app/dist/bundle.js'
}
}
}
但是它似乎是在bundle.js
内捆绑我的React应用程序使用的所有库,而不是将它们添加到依赖树中。
看来prepare
命令基本上是将我的React应用程序捆绑到一个/dist/bundle.js
文件中,而Webpack只是按原样包含了此文件。我需要Webpack来管理我的React应用程序的依赖关系,这样我才不会在Webpack的最终输出中重复不必要的库。
是否有更好的方法来实现我要实现的目标?
答案 0 :(得分:0)
最好将它们捆绑在一起。基本上,它试图捆绑已经捆绑的代码。 这可能有效:
resolve: {
alias: {
MyReactApp: 'my-react-app/index.js'
}
}
index.js应该是jsx的主要起点。
此外,您需要为jsx文件添加编译规则,我从未捆绑Rail应用程序,但React应用程序应遵循以下步骤;
将规则添加到webpack.config.js
module: {
rules: [
{
// this is so that we can compile any React,
// ES6 and above into normal ES5 syntax
test: /\.(js|jsx)$/,
// we do not want anything from node_modules to be compiled
exclude: /node_modules/,
use: ["babel-loader"]
},
...
]
}
安装Babel模块:
npm install @babel/core @babel/node @babel/preset-env @babel/preset-react babel-loader
创建一个名为.babelrc的文件并粘贴以下代码
{
"presets": ["@babel/env", "@babel/react"],
"plugins": ["@babel/plugin-proposal-class-properties"]
}
像下面的脚本一样通过babel-node运行webpack
"webpack": "babel-node ./node_modules/webpack/bin/webpack"
这将是我解决此问题的方法。它仍然会导入对您的项目的反应。但是,它不会添加已编译的项目,而是会添加jsx文件并在捆绑过程中对其进行编译。
注意: