Ruby on RailsでReact.jsを使用するため、react-railsのgemを用いて開発をしています。
また、JavaScriptでES6(ES2015)を使用するためにwebpackを使用しています。
webpackの設定は以下のとおりです。
JavaScript
1// webpack.config.js 2module.exports = { 3 entry: { 4 hello_world: __dirname + '/src/hello_world/components/hello_world.jsx', 5 }, 6 output: { 7 path: __dirname + '/../app/assets/javascripts/components', 8 filename: '[name].js' 9 }, 10 module: { 11 loaders: [ 12 { 13 test: /\.(js|jsx)$/, 14 loader: 'babel-loader', 15 exclude: /node_modules/, 16 query: { 17 presets: ["es2015", "react"], 18 } 19 } 20 ] 21 }, 22 resolve: { 23 extensions: ['.js', '.jsx'], 24 }, 25 externals: { 26 'react': 'React', 27 'react-dom': 'ReactDOM' 28 } 29};
##発生するエラーについて
react-railsにはサーバーサイドレンダリング(SSR)のための機能があり、
以下のように、prerender: true
を react_component
メソッドで
指定することによりSSRが可能になります。
<!-- index.html.erb --> <%= react_component('HelloWorld', {}, { prerender: true }) %>
React側のコードは以下のとおりです。
JavaScript
1// hello_world.jsx 2import React from 'react'; 3 4class HelloWorld extends React.Component { 5 render() { 6 return ( 7 <div> 8 <h1>Hello World!</h1> 9 </div> 10 ); 11 } 12}
しかし、これを実行すると以下のようなエラーが発生してしまいます。
Ruby
1React::ServerRendering::PrerenderError 2 3Encountered error "#<ExecJS::ProgramError: ReferenceError: HelloWorld is not defined>" when prerendering HelloWorld with {} 4eval (eval at module.exports ((execjs):20743:19), <anonymous>:1:1) 5Object.module.exports [as getConstructor] ((execjs):20743:19) 6Object.serverRender ((execjs):20934:31) 7...
このエラーが発生する原因は把握しており、
react-railsではSSRを実行するためにExecJSを使用しているのですが、
ExecJSは module.exports
や require
に対応していないためエラーが発生するようです。
babelでのトランスパイル時に module.exports
や require
が発生しないように
しようかと思いましたが、良い方法が見つかりませんでした。
もし、解決方法がわかる方がいらっしゃいましたら、教えていただけると幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/21 07:51 編集
2017/06/21 08:52
2017/06/22 02:48