Help us understand the problem. What is going on with this article?

Material-UIでPWAのApp-Shellを作ってみた

2019-12-31.png

material-ui について

とても人気のある React UI コンポーネントですが、やや癖が強いところもあるので苦手な方も多いと思います。

個人的に私が苦手な点

  • CSS in JS が独特(styled-componentsEmotion とも微妙に異なる)
  • ただし上記2つに寄せた記法も頑張れば使用できる
  • 公式のサンプルが React Hooks 前提で書かれており、クラスコンポーネントで記載例のまま使おうとすると createStyles, makeStyles 周りでハマる

App Shell モデルについて

  • PWA 構築のために Google が提唱しているアーキテクチャ
  • 詳しくは公式 (developers.google.com, 日本語)をご覧ください

成果物(サンプル)

インストール

  • 中核の3つ(コア、アイコン、スタイル)
bash
$ npm install @material-ui/core
$ npm install @material-ui/icons
$ npm install @material-ui/styles
  • Robot フォント(必須ではない)
bash
$ npm install typeface-roboto --save

フォントフェイスのインポート方法

App.jsx
import 'typeface-roboto';

留意したところ

バンドルサイズがデカすぎ問題

公式でもガイド(Minimizing Bundle Size)を用意するほど、あっという間にバンドルサイズが肥大化します。

  • トップレベルの import ではなく、コンポーネントパスでインポートする
App.jsx
// NG 使わないコンポーネントもインポートしてしまっている
import { Button, TextField } from '@material-ui/core';

// OK
import Button from '@material-ui/core/Button';
import TextField from '@material-ui/core/TextField';

使用しないコンポーネントもバンドルされてしまうのを防げます。

  • アイコンも同様
App.jsx
// NG 補完が効いてラクだけどダメ
import { AccessAlarm, ThreeDRotation } from '@material-ui/icons';

// OK
import AccessAlarmIcon from '@material-ui/icons/AccessAlarm';
import ThreeDRotation from '@material-ui/icons/ThreeDRotation';

React.lazysplitChunks の利用については別のお話なので割愛。公式ドキュメント読みましょう。

もう SwipeableDrawer は非推奨かも

iOS では以前から問題のあったスワイプしたら出てくるドロワーですが、Android でももう避けるべきかも。

Android10 からジェスチャーナビゲーションが利用できるようになり、画面左端からのスワイプに従来の戻るが割り当てられたため、スワイパブルドロワーはほぼ機能しません。

と言うか、もうドロワーというUI自体が時代遅れなのかも。

手っ取り早くブラウザ標準の margin, padding などをリセットする方法はないの?

タブやツールバー周辺の白地を消してPWAらしく見せるためにはブラウザにプリセットされた marginpadding を無効化する必要があります。

グローバルレベル(body など)に効かせる CSS を書いてもいいのですが、CssBaseline という便利なコンポーネントが用意されています。

App.jsx
import CssBaseline from '@material-ui/core/CssBaseline';

const App = () => {
return (
  <React.Fragment>
    <CssBaseline />
    {/* あなたのアプリ */}
  </React.Fragment>
};

CssBaseline がやってくれること

  • htmlbody がページ幅に合わせて調整されます
  • デフォルトのマテリアルデザイン背景色が設定されます
  • html 全体に box-sizing: border-box が適用されます
  • そのほかにもいろいろ(公式 をどうぞ)

AppBar(ツールバー)の下にメインコンテンツが潜ってしまうんですが…?

これも公式のデモページにドキュメントがありました。

ツールバーを画面上部に fixed する(アプリなので)と初期画面でメインコンテンツがツールバーの下に隠れてしまいます。

公式が提案している解決策は以下の3つ。

  1. fixed の代わりに position="sticky" が使えます(ただしIEをのぞく)
  2. 空の Toolbar コンポーネントをスペーサーとしてもう一つ差し込む手もあるでよ
  3. 2と同じことを CSS で出来るように Theme も用意してるよ
App.jsx
// *2
const App = () => {
  return (
    <React.Fragment>
      <AppBar position="fixed">
        <Toolbar>{/* 省略 */}</Toolbar>
      </AppBar>
      <Toolbar />  // 空!
    </React.Fragment>
  );
}
App.tsx
// *3

import { createStyles, makeStyles, Theme } from '@material-ui/core/styles';

const useStyles = makeStyles((theme: Theme) =>
  createStyles({
    offset: theme.mixins.toolbar,
  })
};

const App = (): JSX.Element => {
  const classes = useStyles();
  return (
    <React.Fragment>
      <AppBar position="fixed">
        <Toolbar>{/* 省略 */}</Toolbar>
      </AppBar>
      <div className={classes.offset} />  // 空Div!
    </React.Fragment>
  )
};

雑感

react-onsenui をちゃんとアップデートしてくれればこんな苦労しなくても済むのに・・・

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした