自定义打包 #

Math.js 是一个包含多种数据类型和函数的庞大库。您很可能只需要该库的一小部分。Math.js 允许您仅选择所需的函数和数据类型。这可以缩短加载时间并减小浏览器包的大小。Math.js 使用 ES 模块,并且在例如使用 Webpack 时,开箱即用地支持通过 tree-shaking 创建小型包。

本页介绍

仅使用少量函数 #

使用 create 函数,可以创建一个 mathjs 实例。 all 对象包含 mathjs 中所有可用的功能,可以像这样创建一个包含所有内容的 mathjs 实例:

import { create, all } from 'mathjs'

const math = create(all)

要创建一个仅包含少量函数的实例,您需要传递所需函数及其所有依赖项的工厂函数。例如,add 函数依赖于 addScalarequalScalar 函数,DenseMatrixSparseMatrix 类,以及更多。由于很难确定一个函数及其依赖项的依赖项,mathjs 为每个函数提供了所有依赖项的现成集合。例如,函数 add 及其依赖项的所有工厂函数都可用作 addDependencies

下面是一个在 mathjs 实例中仅加载少量函数的完整示例:

// file: custom_loading.js

import {
  create,
  fractionDependencies,
  addDependencies,
  divideDependencies,
  formatDependencies
} from 'mathjs'

const config = {
  // optionally, you can specify configuration
}

// Create just the functions we need
const { fraction, add, divide, format } = create({
  fractionDependencies,
  addDependencies,
  divideDependencies,
  formatDependencies
}, config)

// Use the created functions
const a = fraction(1, 3)
const b = fraction(3, 7)
const c = add(a, b)
const d = divide(a, b)
console.log('c =', format(c)) // outputs "c = 16/21"
console.log('d =', format(d)) // outputs "d = 7/9"

此示例可以使用例如 Webpack 进行打包。

npx webpack custom_loading.js -o custom_loading.bundle.js --mode=production

由于 tree-shaking,只有使用的 mathjs 部分会被打包。

仅数字 #

Math.js 的函数开箱即支持多种数据类型,如数字、大数字、复数、单位和矩阵。然而,通常情况下,只需要支持数字,而其他数据类型则过于冗余。

为了满足仅需要 JavaScript number 类型用例的需求,mathjs 提供了所有相关函数的轻量级、仅数字的实现。这些可以通过从 'mathjs/number' 导入而不是从 'mathjs' 导入来获得。

// use light-weight, number-only implementations of functions
import { create, all } from 'mathjs/number'

const math = create(all)
console.log(math.add(2, 3)) // 5

包大小 #

当仅使用 mathjs 的少量函数而不是整个库时,您可以预期包的大小只是完整库的一小部分。然而,要创建支持所有数据类型的 add 函数,必须包含所有这些数据类型:Unit、BigNumber、Complex、DenseMatrix、SparseMatrix 等。对 mathjs 不同部分的大小有一个大致的了解:

为了更好地了解您的 JavaScript 包中包含哪些内容,您可以使用 source-map-explorer 等工具。

Fork me on GitHub