LoginSignup
5
5

More than 5 years have passed since last update.

Cordova + JSPM + React + AFrame-ReactでVRを試す

Posted at

ソースコード


手順

グローバルで必要なものをインストール

$ npm i cordova -g
$ npm i jspm -g

プロジェクトセットアップ

$ cordova create VRSample
$ cordova platform add android
$ cordova platform add browser
$ npm init -y
$ npm i jspm --save-dev
$ npm i uglifyjs --save-dev

JSPMセットアップ

$ jspm init
Would you like jspm to prefix the jspm package.json properties under jspm? [yes]:
Enter server baseURL (public folder path) [./]:./www # ここはwwwにする
Enter jspm packages folder [www/app/jspm_packages]:
Enter config file path [www/app/config.js]:MacBook-Pro:VRSample mk2$ jspm init
Would you like jspm to prefix the jspm package.json properties under jspm? [yes]:
Enter server baseURL (public folder path) [./]:./www
Enter jspm packages folder [www/jspm_packages]:
Enter config file path [www/config.js]:
Configuration file www/config.js doesn't exist, create it? [yes]:
Enter client baseURL (public folder URL) [/]:./www
Do you wish to use a transpiler? [yes]:
Which ES6 transpiler would you like to use, Babel, TypeScript or Traceur? [babel]:
ok   Verified package.json at package.json
...

JSPMでライブラリインストール

$ jspm install npm:react npm:react-addons-update npm:react-dom npm:aframe-react

aframeのライブラリを用意する

https://aframe.io/ からダウンロードし、distに入っているファイルを丸っとコピーする。最終的にwwwディレクトリが下の感じになっているようにする(配置は自由)

.
├── config.js
├── css
│   └── index.css
├── img
│   └── logo.png
├── index.html
├── js
│   └── index.js
├── jspm_packages
│   └── ...
└── managed_packages
    └── aframe
        ├── aframe-v0.2.0.js
        ├── aframe-v0.2.0.js.map
        ├── aframe-v0.2.0.min.js
        ├── aframe.js
        ├── aframe.js.map
        └── aframe.min.js

ゴリゴリっとソースコードを書く

config.xmlでbrowserとandroidのエントリHTMLファイルを分ける

  • browser
    • index.html
  • android
    • index.android.html

にするので、下記の記述をconfig.xmlに追加。

    <platform name="android">
        <allow-intent href="market:*" />
        <content src="index.android.html"/>
    </platform>
    <platform name="browser">
        <content src="index.html"/>
    </platform>

browserとandroidで読み込みのscriptタグを分ける

browser

SystemJSが普通に動くので、JSPMを使っていれば見慣れた記述。

        <script type="text/javascript" src="managed_packages/aframe/aframe.js"></script>
        <script type="text/javascript" src="jspm_packages/system.js"></script>
        <script type="text/javascript" src="config.js"></script>
        <script type="text/javascript" src="cordova.js"></script>
        <script type="text/javascript" src="js/index.js"></script>

android

JSPM Bundleしたファイルを読みこませる。

        <script type="text/javascript" src="cordova.js"></script>
        <script type="text/javascript" src="js/build.js"></script>

npm scriptsを設定して、環境ごとにビルドが走るようにしておく

uglifyもかましておこう。

    "bundle": "./node_modules/.bin/jspm bundle-sfx ./www/app/index.js ./www/js/bundle.js --skip-source-maps",
    "uglify": "./node_modules/.bin/uglifyjs --keep-fnames --reserved-file --screw-ie8 --output ./www/js/build.js -- ./www/managed_packages/aframe/aframe.js ./www/js/bundle.js ./www/js/index.js",
    "android": "npm run bundle && npm run uglify && cordova run android",
    "browser": "cordova run browser",

TIPS

cordovaとJSPMを併用するときの注意点は、

  • ブラウザで動かすときはSystemJSが正しく動くので、普通に開発する
  • androidで動かすときはSystemJS経由で読み込むファイルがAPKにバンドルされないので(ここ要調査)、JSPM Bundleの機能で1ファイルにまとめてそれを読み込ませる

AFrame-Reactを使ってみる

wwwの下にappディレクトリを切り、そこにReactのエントリーポイントを作る。

import React, { Component } from 'react';
import { render } from 'react-dom';
import { Animation, Entity, Scene } from 'aframe-react';

class App extends Component {
  render() {
    return (
      <Scene>
        <Entity geometry={{primitive: 'box'}} material="color: red" position={[0, 0, -5]}>
          <Animation attribute="rotation" dur="5000" repeat="indefinite" to={[0, 360, 360]}/>
        </Entity>
      </Scene>
    );
  }
}

render(<App/>, document.getElementById("app"));

動かす

browser

npm run browser

android

※Android SDKがインストール済みであること

npm run android
5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5