質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Electron

Electronは、HTML5とNode.jsというWebの技術を用いてデスクトップアプリケーションを作成できるクロスプラットフォームな実行環境です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

4218閲覧

node.jsのrequire()でjsxファイルを読み込めない

HayateTabata

総合スコア12

Electron

Electronは、HTML5とNode.jsというWebの技術を用いてデスクトップアプリケーションを作成できるクロスプラットフォームな実行環境です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2017/02/02 16:34

###前提・実現したいこと
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

node.js

1(() =>{ 2 require('babel-register')( 3 {plugins: 'transform-react-jsx'} 4 ); 5 6 const React = require('react'); 7 const ReactDOM = require('react-dom'); 8 const MainContent = require('./components/main'); 9 10 //id: rootにMainContentクラスを入れる 11 const root = document.getElementById('root'); 12 ReactDOM.render(React.createElement(MainContent), root); 13})();

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" } }

かなり調べてみたのですが、どうしてもわからないため、
ご教示いただきたいです。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

上の回答にもあるようにそのままでは読み込めないので、
↓下のどれかの対応策はどうでしょうか

  • require('./components/main.jsx') と拡張子も指定する
  • node-require-jsx を読み込んで require が jsx を認識するように拡張する
  • ./components/main.jsx./components/main.js にリネームする (ファイルとして)

投稿2017/02/03 04:12

kt3k

総合スコア87

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HayateTabata

2017/02/03 04:48

・require('./components/main.jsx') と拡張子も指定する ・./components/main.jsx を ./components/main.js にリネームする (ファイルとして) こちらはすでに両方とも実行しており、結果は同じでした。 ・node-require-jsx を読み込んで require が jsx を認識するように拡張する →こちらの解決策は、読み込む対象のjsxファイルに `require('node-require-jsx').install()` を記述するだけということで問題ないでしょうか?
kt3k

2017/02/03 05:50 編集

jsx ファイルの中ではなくて、jsx ファイルの require が走る前のタイミング (たとえば、renderer-main.js の上の方など) で、呼ぶ必要があるかと思います。 ただ、 `require('./components/main.jsx')` この指定がダメだとすると、うまくいかないかもしれません。 `src/app/javascripts/renderer/renderer-main.js` 自体はどこから読み込んでいますか? script タグで指定していたりしますか?
HayateTabata

2017/02/03 12:40

読み込めませんでした。。。 renderer-main.js自体は、 src/app/html/main.html からscriptタグで読み込んでいます。
kt3k

2017/02/03 15:46

html から `<script src='path/to/render-main.js'></script>` としてしまうと、render-main.js が、 html のあるディレクトリで実行されたことになって、相対パスの起点がずれてしまっているのではないかなと思います。 なので、src/app/html/ から見た src/app/javascripts/renderer/components/main.jsx なので、 `require('../javascripts/renderer/componets/main.jsx')` としてみてはどうでしょうか、、?
HayateTabata

2017/02/06 03:01

ありがとうございます!読み込めました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問