スポンサー
Support Framework7

遅延モジュール

    遅延モジュールは、Framework7 version 3.4.0から利用可能です。

    遅延モジュールは、ホームページやビューに必要な機能のみを初期にロードし、それらを使用するページに移動した際に追加のモジュールやコンポーネントをロードすることで、ウェブアプリの起動時間を大幅に短縮する方法を提供します。これにより、ウェブアプリやPWAを構築する際に重要となる、初期アプリのスクリプトやスタイルのサイズをより小さくすることができます。

    Framework7には、2種類のモジュールが用意されています。ESモジュールと「ブラウザモジュール」です。ESモジュールを使用するには、WebpackやRollupのような「import/export」をサポートするバンドルラーを使用する必要があります。ブラウザモジュールは、バンドルラーを使用しない場合にのみ使用できるように設計されています。

    モジュール API

    Framework7のモジュールを初期化後にロードするには、以下のappメソッドを使用する必要があります。

    app.loadModule(module) - load module

    • module - 以下のいずれかです。
      - Framework7 プラグインを持つオブジェクト
      - Framework7 Pluginを返すfunction
      - string 読み込みたいモジュール名(例:'searchbar')。
      - string 読み込みたいモジュールのパス(例:'path/to/components/searchbar.js')。

    メソッドは、モジュールを含むPromise

    app.loadModules(modules) - load modules

    • modules - 配列を返します。各配列の項目には、上で説明したモジュールのいずれかが入ります。

    メソッドはPromiseを返します。

    ESモジュール

    このメソッドは、WebpackやRollupなどのバンドルラーを使用している場合にのみ動作します。

    まず、アプリが初期ページを表示するのに必要なモジュールを把握し、それらをインポートする必要があります。

    // import core コアコンポーネントのみのフレームワーク。
    import Framework7 from 'framework7';
    
    // import framework7 初期ページに必要なモジュール/コンポーネント
    import Searchbar from 'framework7/components/searchbar';
    import Accordion from 'framework7/components/accordion';
    
    // コアモジュールのインストール
    Framework7.use([Searchbar, Accordion]);
    
    // アプリの起動
    var app = new Framework7({
      // F7パラメータ
    });

    後でF7モジュールを追加でインストールする必要がある場合は、動的なインポートを使用できます。

    import('framework7/components/gauge')
      .then(module => app.loadModule(module.default))
      .then(() => {
        // モジュールがロードされ、ゲージアピを使用することができます。
        app.gauge.create(/* ... */)
      })

    一度にいくつかのモジュールをロードする必要がある場合。

    Promise
      .all([
        import('framework7/components/gauge'),
        import('framework7/components/calendar')
      ])
      .then((modules) => {
        // ロードされたモジュールは、インポート結果の".default "プロップに表示されます。
        var modulesToLoad = modules.map(module => module.default);
        return app.loadModules(modulesToLoad);
      })
      .then(() => {
        // モジュールがロードされ、そのAPIを使用することができます
        app.gauge.create(/* ... */)
        app.calendar.create(/* ... */)
      })

    毎回それを書くのは不便なので、そのための関数を作ります。

    function loadF7Modules(moduleNames) {
      var modulesToLoad = moduleNames.map((moduleName) => {
        return import(`framework7/components/${moduleName}`);
      });
      return Promise.all(modulesToLoad)
        .then((modules) => {
          return app.loadModules(modules.map(module => module.default));
        })
    }

    そして、それを次のように使うことができます。

    loadF7Modules(['gauge', 'calendar']).then(() => {
      // モジュールがロードされ、それらのAPIを使用することができます
      app.gauge.create(/* ... */)
      app.calendar.create(/* ... */)
    });

    もし、特定のルートに対してモジュールをプリロードする必要がある場合は、ルートの async が最適です。

    var routes = [
      {
        path: '/',
        url: './index.html',
      },
      /* Page where we need Gauge and Calendar modules to be loaded */
      {
        path: '/gauge-calendar/',
        async: function ({ resolve }) {
          // モジュールのロード
          loadF7Modules(['gauge', 'calendar']).then(() => {
            // ルートの解決
            resolve({
              componentUrl: './gauge-calendar.html',
            });
          });
        }
      }
    ]

    以下のESモジュールコンポーネントがインポート可能です(他のコンポーネントはすべてコアの一部です)。

    ComponentPath
    Dialogframework7/components/dialog
    Popupframework7/components/popup
    LoginScreenframework7/components/login-screen
    Popoverframework7/components/popover
    Actionsframework7/components/actions
    Sheetframework7/components/sheet
    Toastframework7/components/toast
    Preloaderframework7/components/preloader
    Progressbarframework7/components/progressbar
    Sortableframework7/components/sortable
    Swipeoutframework7/components/swipeout
    Accordionframework7/components/accordion
    ContactsListframework7/components/contacts-list
    VirtualListframework7/components/virtual-list
    ListIndexframework7/components/list-index
    Timelineframework7/components/timeline
    Tabsframework7/components/tabs
    Panelframework7/components/panel
    Cardframework7/components/card
    Chipframework7/components/chip
    Formframework7/components/form
    Inputframework7/components/input
    Checkboxframework7/components/checkbox
    Radioframework7/components/radio
    Toggleframework7/components/toggle
    Rangeframework7/components/range
    Stepperframework7/components/stepper
    SmartSelectframework7/components/smart-select
    Gridframework7/components/grid
    Calendarframework7/components/calendar
    Pickerframework7/components/picker
    InfiniteScrollframework7/components/infinite-scroll
    PullToRefreshframework7/components/pull-to-refresh
    Lazyframework7/components/lazy
    DataTableframework7/components/data-table
    Fabframework7/components/fab
    Searchbarframework7/components/searchbar
    Messagesframework7/components/messages
    Messagebarframework7/components/messagebar
    Swiperframework7/components/swiper
    PhotoBrowserframework7/components/photo-browser
    Notificationframework7/components/notification
    Autocompleteframework7/components/autocomplete
    Tooltipframework7/components/tooltip
    Gaugeframework7/components/gauge
    Skeletonframework7/components/skeleton
    Menuframework7/components/menu
    Pie Chartframework7/components/pie-chart
    Area Chartframework7/components/area-chart
    Typographyframework7/components/typography
    Text Editorframework7/components/text-editor

    ブラウザモジュール

    ブラウザモジュールは、(WebpackやRollupなどの)バンドルラーを使わない開発セットアップでの使用を想定しています。

    まず、メインの app layout では、フレームワーク全体を含む framework7-bundle.jsframework7-bundle.css のスクリプトやスタイルではなく、いわゆるミニマムコアの Framework7 ライブラリを使用する必要があります。

    <!DOCTYPE html>
    <html>
      <head>
        ...
        <!-- Framework7コアライブラリCSSへのパス -->
        <link rel="stylesheet" href="path/to/framework7/framework7.min.css">
        <!-- カスタムアプリのスタイルへのパス-->
        <link rel="stylesheet" href="path/to/my-app.css">
      </head>
      <body>
        <div id="app">
          ...
        </div>
        <!-- Framework7コアライブラリJSへのパス-->
        <script type="text/javascript" src="path/to/framework7/framework7.min.js"></script>
        <!-- あなたのアプリの js へのパス-->
        <script type="text/javascript" src="path/to/my-app.js"></script>
      </body>
    </html>

    また、初期ページに必要なモジュールやコンポーネントを framework7 のスタイルやスクリプトの後に含める必要があります。検索バーやアコーディオンが必要な場合、アプリのレイアウトにそれらを含める必要があります。

    <!DOCTYPE html>
    <html>
      <head>
        ...
        <!-- Framework7コアライブラリCSSへのパス -->
        <link rel="stylesheet" href="path/to/framework7/framework7.min.css">
        <!-- 初期ページに必要なモジュールを含める -->
        <link rel="stylesheet" href="path/to/framework7/components/accordion/accordion.css">
        <link rel="stylesheet" href="path/to/framework7/components/searchbar/searchbar.css">
        <!-- カスタムアプリのスタイルへのパス-->
        <link rel="stylesheet" href="path/to/my-app.css">
      </head>
      <body>
        <div id="app">
          ...
        </div>
        <!-- Framework7コアライブラリJSへのパス-->
        <script type="text/javascript" src="path/to/framework7/framework7.min.js"></script>
        <!-- 初期ページに必要なモジュールを含める -->
        <script type="text/javascript" src="path/to/framework7/components/accordion/accordion.js"></script>
        <script type="text/javascript" src="path/to/framework7/components/searchbar/searchbar.js"></script>
        <!-- アプリのjsへのパス-->
        <script type="text/javascript" src="path/to/my-app.js"></script>
      </body>
    </html>

    さて、Framework7アプリを初期化する際には、残りのモジュールがどこにあるのかを、lazyModulesPathパラメータで指定する必要があります(/components/フォルダへのパス)。

    var app = new Framework7({
      // ...
      lazyModulesPath: 'path/to/framework7/components',
    });

    これで、モジュールの名前を指定するだけで、モジュールをロードすることができます(指定した lazyModulesPath にあるファイル名のファイルを自動的に取得します)。

    app.loadModules(['calendar', 'gauge']).then(() => {
      // モジュールがロードされ、そのAPIを使えるようになりました
      app.gauge.create(/* ... */)
      app.calendar.create(/* ... */)
    });

    ブラウザモジュールは、モジュールのスタイルも自動的に読み込むことに注意してください。つまり、gauge.js をロードすると、gauge.css スタイルシートも自動的にロードされます。

    つまり、上記の式 app.loadModules(['calendar', 'gauge']) は、以下のファイルを読み込むことになります。

    • パス/to/framework7/components/calendar/calendar.js
    • パス/to/framework7/components/calendar/calendar.css
    • パス/to/framework7/components/gauge/gauge.js
    • パス/to/framework7/components/gauge/gauge.css

    特定のルートに対してモジュールをプリロードする必要があり、ブラウザモジュールを使用している場合は、ルートの modules プロパティを使用することができます。

    var routes = [
      {
        path: '/',
        url: './index.html',
      },
      /* Page where we need Gauge and Calendar modules to be loaded */
      {
        path: '/gauge-calendar/',
        modules: ['gauge', 'calendar'], // will load these components before loading route
        componentUrl: './gauge-calendar.html',
      }
    ]

    または、ESモジュールの例のように、同じように async ルートを使用します。

    var routes = [
      {
        path: '/',
        url: './index.html',
      },
      /* Page where we need Gauge and Calendar modules to be loaded */
      {
        path: '/gauge-calendar/',
        modules: ['gauge', 'calendar'], // will load these components before loading route
        async: function({ resolve }) {
          app.loadModules(['gauge', 'calendar']).then(() => {
            resolve({
              componentUrl: './gauge-calendar.html',
            });
          });
        },
      }
    ]

    以下のブラウザモジュール-コンポーネントがロード可能です(その他のコンポーネントはすべてコアの一部です)。

    ComponentNamePath
    Dialogdialogframework7/components/dialog/dialog.js
    Popuppopupframework7/components/popup/popup.js
    LoginScreenlogin-screenframework7/components/login-screen/login-screen.js
    Popoverpopoverframework7/components/popover/popover.js
    Actionsactionsframework7/components/actions/actions.js
    Sheetsheetframework7/components/sheet/sheet.js
    Toasttoastframework7/components/toast/toast.js
    Preloaderpreloaderframework7/components/preloader/preloader.js
    Progressbarprogressbarframework7/components/progressbar/progressbar.js
    Sortablesortableframework7/components/sortable/sortable.js
    Swipeoutswipeoutframework7/components/swipeout/swipeout.js
    Accordionaccordionframework7/components/accordion/accordion.js
    ContactsListcontacts-listframework7/components/contacts-list/contacts-list.js
    VirtualListvirtual-listframework7/components/virtual-list/virtual-list.js
    ListIndexlist-indexframework7/components/list-index/list-index.js
    Timelinetimelineframework7/components/timeline/timeline.js
    Tabstabsframework7/components/tabs/tabs.js
    Panelpanelframework7/components/panel/panel.js
    Cardcardframework7/components/card/card.js
    Chipchipframework7/components/chip/chip.js
    Formformframework7/components/form/form.js
    Inputinputframework7/components/input/input.js
    Checkboxcheckboxframework7/components/checkbox/checkbox.js
    Radioradioframework7/components/radio/radio.js
    Toggletoggleframework7/components/toggle/toggle.js
    Rangerangeframework7/components/range/range.js
    Stepperstepperframework7/components/stepper/stepper.js
    SmartSelectsmart-selectframework7/components/smart-select/smart-select.js
    Gridgridframework7/components/grid/grid.js
    Calendarcalendarframework7/components/calendar/calendar.js
    Pickerpickerframework7/components/picker/picker.js
    InfiniteScrollinfinite-scrollframework7/components/infinite-scroll/infinite-scroll.js
    PullToRefreshpull-to-refreshframework7/components/pull-to-refresh/pull-to-refresh.js
    Lazylazyframework7/components/lazy/lazy.js
    DataTabledata-tableframework7/components/data-table/data-table.js
    Fabfabframework7/components/fab/fab.js
    Searchbarsearchbarframework7/components/searchbar/searchbar.js
    Messagesmessagesframework7/components/messages/messages.js
    Messagebarmessagebarframework7/components/messagebar/messagebar.js
    Swiperswiperframework7/components/swiper/swiper.js
    PhotoBrowserphotoframework7/components/browser/photo-browser/browser/photo-browser.js
    Notificationnotificationframework7/components/notification/notification.js
    Autocompleteautocompleteframework7/components/autocomplete/autocomplete.js
    Tooltiptooltipframework7/components/tooltip/tooltip.js
    Gaugegaugeframework7/components/gauge/gauge.js
    Skeletonskeletonframework7/components/skeleton/skeleton.js
    Menumenuframework7/components/menu/menu.js
    Pie Chartpie-chartframework7/components/pie-chart/pie-chart.js
    Area Chartarea-chartframework7/components/area-chart/area-chart.js
    Typographytypographyframework7/components/typography/typography.js
    Text Editortext-editorframework7/components/text-editor/text-editor.js