基本情報技術者試験のサンプル問題 科目Aを用いて、アプリを作成し、PWA化してみる。
この回で、拡張性のあるクイズアプリ制作は終了です。
次は、拡張性のあるメモ帳アプリ作成やっていこうと思います。
作成中のメモです。
・データベースを使用しないので、選択肢に()が入っているものがある場合に、()使用による問題は発生しない。
選択肢をシャッフルできるようにしました。
App.js
setData/dataSet.js
注意点としては下記。
getCorrectAnswerAlp を作らず、switch文のところで、各自、setCorrectAnswerAlpを設定してしまうと、レンダリングが複数回されてしまい、変なことになってしまいます。
なお、AlpはAlphabetを略してます。
そのあと、データセットのデータを複数にすると、問題文と選択肢が食い違うバグあり。
useEffectのところを下記へ書き換えると、Console Warning出ながらも実行は可能
原因はおいおい考えることとする。
下記HPを参考にしました。
㋐Expoで制作したReactNativeアプリをPWA対応Webビルドする必要最小限の手順 #SPA - Qiita
㋑fyi/enabling-web-service-workers.md at master · expo/fyi · GitHub
expo customize:web 周辺からやっていきます。
ここでは、㋐と違って、㋑に忠実に従ってやってます。
以下、㋑の抜粋です。
Start from a template:
npx create-react-native-app -t with-workbox・・⓵
Expo's Webpack config has is capable of generating icons, splash screens, manifests, and metadata for your progressive web app based on the app.json and other configuration used for your native app. However, the offline support must be added to your Webpack config manually.
webpack.config.js
in your project: expo customize:web
src/service-worker.js
and src/serviceWorkerRegistration.js
(the file path is important).①は無視してよいです。下線部のコードからもコピーして取ってこれるからです。
1.では、提供されるpackage.jsonから、コードをコピーし、自分のプロジェクトのpackage.jsonにペーストします。
npx expo install --fixとしておきます。
2. expo customize:webをコマンドプロンプトで実行
3.下線部のwebpack.config.jsをすべてコピーして、自分のプロジェクトのwebpack.config.jsにペースト
4.Expoでは、プロジェクト直下にsrcディレクトリはないので、自分で作成します。その下に、それぞれのファイルをコピー&ペーストで作成します。
②も無視でよいです。
5.下記のようにコードを追記します。③と④。
次に、
npx expo install react-native-web react-dom
npx expo install --fix
最近は、コマンドが下記のように変更になってます。
expo build:web ⇒ npx expo export:web
ローカルサーバで確認
npx serve web-build --single
それでは次に、web-buildディレクトリを、firebase hostingします。
npm install -g firebase-tools
firebase init
firebase.json内の ”public":"public"を "public":"web-build"に変更
firebase deploy
Deploy complete!と出れば成功です。
https://[firebaseのプロジェクト名].web.appのようなURLが出ます。
.comで終わるURLも使用できます。firebaseの方で確認できます。
スマホでこのURLにアクセスすると、ウェブブラウザで表示され、右上の縦3ドットを押して、メニュー表示し、ダウンロードを押すとダウンロード、インストールされ、その後はオフラインでも一部使用可なようです。PCなら、Microsoft Edgeで開き、同様に、右上の縦3ドットから、アプリをインストールすることができます。
変数名は大事なので改変。
また、問題の形式が、4択でもすこし違う問題もある。たとえば、『~についての下記の文章のうち、正しいものはどれか。1つ選べ。』 とか。
今度はそういう場合について考えてみる。
データセットのオブジェクトリテラルのプロパティにselectionを付け加え、
そこに、配列を設定する。trueの文章2つとfalseの文章4つを用意し、trueを1つ、falseを3つ選ぶようにすれば、上記のような問題になる。
selection: [{boolean:true, sentence:"~は・・・である"}, {boolean:false, sentence:"~~は***である"}]
次は、間違えた問題だけ、復習できるようにしたい。(用意されてるデータセットは、オブジェクトの配列だが、それぞらのオブジェクトにisCorrectというプロパティを追加する。
その次は、間違えて復習してわかった問題だけ集めて、もう一回解きたいという要望に答えることとする。
他には、画像を見て答える問題にも対応も検討(オブジェクトのidを使って、このidならこの画像を選択肢のあとに表示し、このidなら画像表示なしという関数をつくる。別のファイルに作ってインポートで良い。あるいは、この場合は、オブジェクトに、画像があるものだけ、pictureプロパティを追加するのもありだが、その場合、データベースに移行する場合は、firebaseなどのデータベースを使うことになる。)
データセットのオブジェクトの中に、selectionTextを追加します。