自定义打包 #
Math.js 是一个包含多种数据类型和函数的庞大库。您很可能只需要该库的一小部分。Math.js 允许您仅选择所需的函数和数据类型。这可以缩短加载时间并减小浏览器包的大小。Math.js 使用 ES 模块,并且在例如使用 Webpack 时,开箱即用地支持通过 tree-shaking 创建小型包。
本页介绍
- 如何仅使用少量函数以获得更快的加载时间和更小的包。
- 如何使用轻量级的、仅包含数字的函数实现。
- 使用 tree-shaking 时,可以从包大小方面获得怎样的预期。
仅使用少量函数 #
使用 create 函数,可以创建一个 mathjs 实例。 all 对象包含 mathjs 中所有可用的功能,可以像这样创建一个包含所有内容的 mathjs 实例:
import { create, all } from 'mathjs'
const math = create(all)
要创建一个仅包含少量函数的实例,您需要传递所需函数及其所有依赖项的工厂函数。例如,add 函数依赖于 addScalar、equalScalar 函数,DenseMatrix 和 SparseMatrix 类,以及更多。由于很难确定一个函数及其依赖项的依赖项,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 不同部分的大小有一个大致的了解:
- 大约 5% 来自核心功能,如
create、import、factory、typed-function等。 - 大约 30% 的包大小来自数据类
Complex、BigNumber、Fraction、Unit、SparseMatrix、DenseMatrix。 - 大约 25% 的包大小来自表达式解析器。其中一半来自嵌入式文档。
- 大约 40% 来自大约 200 个内置函数和一些常量。
为了更好地了解您的 JavaScript 包中包含哪些内容,您可以使用 source-map-explorer 等工具。