Ruby on Rails+react-rails应用中模块找不到的问题求助
我有一个Ruby on Rails应用,尝试为现有视图添加一个带依赖包的react-rails组件。不带依赖包时,React组件能在.erb视图中正常加载,组件位于/app/javascript/components目录下。但在HelloWorld.jsx组件中导入模块后,应用崩溃并提示找不到模块。
错误信息:
Uncaught Error: Cannot find module 'connectkit' at webpackMissingModule (application.js:1:1) at Module.<anonymous> (application.js:1:1) at ./app/javascript/packs/application.js (application.js:62:1) at __webpack_require__ (bootstrap:19:1) at bootstrap:83:1 at bootstrap:83:1
我已使用yarn add <module_name>安装了相关模块,且在package.json和node_modules中能看到对应包。尝试删除node_modules文件夹并重新安装,但问题仍未解决。注释掉导入语句时组件能正常运行,一旦添加导入就会出现上述错误。
组件代码:
import React from 'react'; import PropTypes from 'prop-types'; import { WagmiConfig, createClient } from 'wagmi'; // 导入这些会导致组件崩溃 import { ConnectKitProvider, ConnectKitButton, getDefaultClient } from 'connectkit'; // 导入这些会导致组件崩溃,去掉就能正常运行 const alchemyId = process.env.ALCHEMY_ID; const client = createClient( getDefaultClient({ appName: 'Your App Name', alchemyId, }) ); class HelloWorld extends React.Component { render() { return ( <React.Fragment> <WagmiConfig client={client}> <ConnectKitProvider> Greeting: {this.props.greeting} <ConnectKitButton /> </ConnectKitProvider> </WagmiConfig> Greeting: {this.props.greeting} </React.Fragment> ); } } HelloWorld.propTypes = { greeting: PropTypes.string, }; export default HelloWorld;
检查Webpack模块解析配置
如果你使用Webpacker,打开config/webpack/environment.js,确保node_modules被包含在模块解析路径中:const { environment } = require('@rails/webpacker'); environment.resolve.modules.prepend('node_modules'); module.exports = environment;保存后重启Webpack开发服务器。
确认依赖版本兼容性
检查wagmi和connectkit的版本是否与项目的React、Webpack版本匹配。比如connectkit需要特定版本的wagmi支撑,查看官方文档后安装对应兼容版本:yarn add wagmi@^1.0.0 connectkit@^1.0.0重启开发服务
Rails的Webpack开发服务器可能缓存了旧的依赖信息,修改依赖后完全重启服务:bin/webpack-dev-server stop bin/rails s验证环境变量配置
组件中用到的process.env.ALCHEMY_ID需要在项目中正确配置。在.env文件中添加:ALCHEMY_ID=你的Alchemy ID确保
dotenv-railsgem已安装并在项目中加载。确认组件打包入口
检查app/javascript/packs/application.js,确保components目录下的组件被正确加载:import "@hotwired/turbo-rails" import "controllers" import React from 'react' import ReactDOM from 'react-dom/client' // 自动加载components目录下的所有JSX组件 const components = require.context('../components', true, /\.jsx$/) components.keys().forEach(components)
内容的提问来源于stack exchange,提问作者Ryan Floyd

