node.jsのrequire()でjsxファイルを読み込めない
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 2,139
前提・実現したいこと
node.jsとreachでelectronアプリケーションを作成しようとしています。
electron src
でアプリケーションを実行したところ、
作成した画面が表示されていませんでした。
以下jsのみを記載したディレクトリ構成になります。
src/app/javascripts/
├── main
│ ├── main.js
│ └── timeline-window.js
└── renderer
├── components
│ └── main.jsx
├── renderer-main.js
└── services
└── twitter.js
発生している問題・エラーメッセージ
Error: Cannot find module './components/main'
該当のソースコード
src/app/javascripts/renderer/renderer-main.js
(() =>{
require('babel-register')(
{plugins: 'transform-react-jsx'}
);
const React = require('react');
const ReactDOM = require('react-dom');
const MainContent = require('./components/main');
//id: rootにMainContentクラスを入れる
const root = document.getElementById('root');
ReactDOM.render(React.createElement(MainContent), root);
})();
src/app/javascripts/renderer/components/main.jsx
const React = require('react');
const T = require('../service/twitter');
class Tweet extends React.Component {
render(){
const isRetweet = this.props.tweet.
hasOwnProperty('retweeted_status');
const status = isRetweet ? this.props.tweet.
retweeted_status : this.props.tweet.
const media = status.entities.media || [];
const firstImage = media.find((item) => {
return item.type === 'photo';
});
return(
<li className='list-group-item'>
<img src={status.user.profile_image_url_https}
className='img-rounded media-object pull-left'
width='32'
height='32' />
<div className='media-body'>
<strong className='user-name'>
{status.user.name}
</strong>
<span className='user-screen_name'>
@{status.user.screen_name}
</span>
<p className='text'>{status.text}</p>
{firstImage?
<img src={firstImage.media_url_https}
className='img-rounded media-object media-img' />
: null }
</div>
</li>
);
}
}
//timeline class
class Timeline extends React.Component{
render(){
const tweets = this.props.tweets.map((tweet) =>{
return <Tweet tweet={tweet} key={tweet.id}/>;
});
return (
<ul className='list-group'>
{tweets}
</ul>
);
}
}
module.exports = class MainContent extends React.Component {
constructor(props){
super(props);
this.state = {tweets: []};
}
render(){
return (
<div className='window'>
<div id='window-content'
className='window-content'>
<Timeline tweets={this.state.tweets}/>
</div>
</div>
);
}
componentDidMount(){
T.get('statuses/home_timeline')
.catch(error => {
console.log(error);
})
.then((result) => {
this.setState({tweets: result.data});
this.connectStream();
});
}
connectStream(){
const stream = T.stream('user');
stream.on('error',(error) =>{
throw error;
});
stream.on('tweet', (tweet) =>{
const tweets = this.state.tweets;
const newTweets = [tweet].concat(tweets);
this.setState({tweets:newTweets});
});
}
};
試したこと
・nodeのシェルに入り、requireで呼び出そうとしたところ、
ファイルがそもそも見つかりませんでした。
・main.jsxのあるディレクトリで、node main.jsx
をしたところ、
syntaxエラーが出たところを見ると、一応ファイル内は読み込めるそうでした。
補足情報(言語/FW/ツール等のバージョンなど)
node 7.0.0
package.jsonは以下
{
"private": true,
"scripts": {
"start": "electron src"
},
"devDependencies": {
"babel-cli": "^6.18.0",
"electron-prebuilt": "1.2.8"
},
"dependencies": {
"react": "^15.4.0"
}
}
src/package.jsonは以下
{
"name": "electron-twitter",
"version": "1.0.0",
"description": "twitter client from electron",
"author": "subaru",
"license": "ISC",
"main":"./app/javascripts/main/main.js",
"devDependencies": {
"babel-plugin-transform-react-jsx": "^6.8.0",
"babel-register": "^6.14.0",
"react": "^15.3.1",
"react-dom": "^15.3.1",
"twit": "2.2.4"
}
}
かなり調べてみたのですが、どうしてもわからないため、
ご教示いただきたいです。よろしくお願いします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
上の回答にもあるようにそのままでは読み込めないので、
↓下のどれかの対応策はどうでしょうか
require('./components/main.jsx')
と拡張子も指定する- node-require-jsx を読み込んで require が jsx を認識するように拡張する
./components/main.jsx
を./components/main.js
にリネームする (ファイルとして)
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.33%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/02/03 13:48
・./components/main.jsx を ./components/main.js にリネームする (ファイルとして)
こちらはすでに両方とも実行しており、結果は同じでした。
・node-require-jsx を読み込んで require が jsx を認識するように拡張する
→こちらの解決策は、読み込む対象のjsxファイルに
`require('node-require-jsx').install()`
を記述するだけということで問題ないでしょうか?
2017/02/03 14:50 編集
ただ、 `require('./components/main.jsx')` この指定がダメだとすると、うまくいかないかもしれません。
`src/app/javascripts/renderer/renderer-main.js` 自体はどこから読み込んでいますか? script タグで指定していたりしますか?
2017/02/03 21:40
renderer-main.js自体は、
src/app/html/main.html
からscriptタグで読み込んでいます。
2017/02/04 00:46
なので、src/app/html/ から見た src/app/javascripts/renderer/components/main.jsx なので、
`require('../javascripts/renderer/componets/main.jsx')` としてみてはどうでしょうか、、?
2017/02/06 12:01