惰性模块

惰性模块在 Framework7 版本 3.4.0 中提供。

惰性模块提供了一种让你的 Web 应用启动时间更快的办法,一开始只加载主页/视图所需的功能,并在导航到使用它们的页面时加载额外的模块/组件。这会让你的初始应用脚本和样式变得更小,这是在构建 Web 应用或 PWA 时很重要的。

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

模块 API

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

app.loadModule(module) - 加载模块

  • module - 以下之一
    - objectFramework7 插件
    - function 返回 Framework7 插件
    - string 要加载的模块名称(例如 'searchbar'
    - string 要加载的模块路径(例如 'path/to/components/searchbar.js'

方法返回 Promise

app.loadModules(modules) - 加载模块

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

方法返回 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
LoginScreenframework7/components/login-screen
弹出框framework7/components/popover
Actionsframework7/components/actions
Sheetframework7/components/sheet
浮动通知framework7/components/toast
预加载器framework7/components/preloader
进度条framework7/components/progressbar
Sortableframework7/components/sortable
滑出framework7/components/swipeout
Accordionframework7/components/accordion
ContactsListframework7/components/contacts-list
VirtualListframework7/components/virtual-list
ListIndexframework7/components/list-index
时间线framework7/components/timeline
标签framework7/components/tabs
Panelframework7/components/panel
Cardframework7/components/card
Chipframework7/components/chip
Formframework7/components/form
Inputframework7/components/input
复选框framework7/components/checkbox
单选按钮framework7/components/radio
开关framework7/components/toggle
Rangeframework7/components/range
步进器framework7/组件/步进器
SmartSelectframework7/组件/smart-select
栅格framework7/组件/栅格
日历framework7/组件/日历
选择器framework7/组件/选择器
无限滚动framework7/组件/无限滚动
下拉刷新framework7/组件/下拉刷新
数据表framework7/组件/数据表
Fabframework7/组件/fab
搜索栏framework7/组件/搜索栏
消息framework7/组件/消息
消息栏framework7/组件/消息栏
Swiper 切换framework7/组件/Swiper
图片浏览器framework7/组件/图片浏览器
通知framework7/组件/通知
自动完成framework7/组件/自动完成
工具提示framework7/组件/工具栏提示
测量表framework7/组件/计量器
骨架framework7/组件/骨架
饼图framework7/组件/饼图
面积图framework7/组件/面积图
排版framework7/组件/印刷
文本编辑器framework7/组件/文本编辑器
面包屑framework7/组件/面包屑