懒加载模块

懒加载模块从 Framework7 版本 3.4.0 开始可用。

懒加载模块提供了一种方法,通过仅加载主页/视图所需的功能来使您的 Web 应用启动时间更快,并在导航到使用它们的页面时加载额外的模块/组件。这将使您的初始应用脚本和样式的大小更小,这在您构建 Web 应用或 PWA 时非常重要。

Framework7 提供了两种类型的模块。ES 模块和“浏览器模块”。要使用 ES 模块,您需要使用支持 Webpack 或 Rollup 的打包器。import/export浏览器模块仅设计用于在您不使用任何打包器时使用。

模块 API

要加载 Framework7 模块后置在初始化时我们需要使用以下应用方法:

app.loadModule(module)- 加载模块

  • module- 以下之一:
    - 对象包裹Framework7 插件
    - 函数返回Framework7 插件
    - 字符串模块名称以加载(例如'searchbar')
    - 字符串模块路径以加载(例如'path/to/components/searchbar.js')

方法返回 Promise

app.loadModules(模块)- 加载模块

  • 模块- 模块数组,其中每个数组项是上述之一

方法返回 Promise

ES 模块

如果您使用 Webpack 或 Rollup 等打包器,此方法才会工作。

首先,我们需要确定我们的应用需要显示初始页面所需的模块并导入它们:

// import core framework with core components only:
import Framework7 from 'framework7';

// import framework7 modules/components we need on initial page
import Searchbar from 'framework7/components/searchbar';
import Accordion from 'framework7/components/accordion';

// install core modules
Framework7.use([Searchbar, Accordion]);

// init app
var app = new Framework7({
  // f7 params
});

之后,当我们需要安装额外的 F7 模块时,我们可以使用动态导入:

import('framework7/components/gauge')
  .then(module => app.loadModule(module.default))
  .then(() => {
    // module loaded and we can use gauge api
    app.gauge.create(/* ... */)
  })

如果我们需要一次加载几个模块:

Promise
  .all([
    import('framework7/components/gauge'),
    import('framework7/components/calendar')
  ])
  .then((modules) => {
    // loaded module will be at ".default" prop of import result
    var modulesToLoad = modules.map(module => module.default);
    return app.loadModules(modulesToLoad);
  })
  .then(() => {
    // modules loaded and we can use their 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(() => {
  // modules loaded and we can use their 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 }) {
      // load modules
      loadF7Modules(['gauge', 'calendar']).then(() => {
        // resolve route
        resolve({
          componentUrl: './gauge-calendar.html',
        });
      });
    }
  }
]

以下 ES 模块组件可用于导入(所有其他组件都是核心的一部分):

组件路径
对话框framework7/components/dialog
弹出窗口framework7/components/popup
登录屏幕framework7/components/login-screen
弹出框framework7/components/popover
动作framework7/components/actions
表单framework7/components/sheet
提示framework7/components/toast
预加载器framework7/components/preloader
进度条framework7/components/progressbar
可排序framework7/components/sortable
滑动删除framework7/components/swipeout
手风琴framework7/components/accordion
联系人列表framework7/components/contacts-list
虚拟列表framework7/components/virtual-list
列表索引framework7/components/list-index
时间线framework7/components/timeline
标签页framework7/components/tabs
面板framework7/components/panel
卡片framework7/components/card
芯片framework7/components/chip
表单framework7/components/form
输入framework7/components/input
复选框framework7/components/checkbox
单选按钮framework7/components/radio
开关framework7/components/toggle
范围framework7/components/range
步进器framework7/components/stepper
智能选择framework7/components/smart-select
网格framework7/components/grid
日历framework7/components/calendar
选择器framework7/components/picker
无限滚动framework7/components/infinite-scroll
下拉刷新framework7/components/pull-to-refresh
数据表格framework7/components/data-table
FABframework7/components/fab
搜索栏framework7/components/searchbar
消息framework7/components/messages
消息栏framework7/components/messagebar
Swiperframework7/components/swiper
照片浏览器framework7/components/photo-browser
通知framework7/components/notification
自动完成framework7/components/autocomplete
提示框framework7/components/tooltip
计量表framework7/components/gauge
骨架framework7/components/skeleton
饼图framework7/components/pie-chart
面积图framework7/components/area-chart
字体排印framework7/components/typography
文本编辑器framework7/components/text-editor
面包屑framework7/components/breadcrumbs