Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2.x part #3 - Decouple MapInstanceManager from window.farmOS.map #117

Merged

Conversation

symbioquine
Copy link
Collaborator

Note: This is intended to be merged to a new 2.x branch after #114 & #116. Unfortunately, the diff includes the changes from those PRs and the prerequisite PR #112 since stacked pull requests don't work across forks on Github.

Why? Better support alternative bundling strategies
and scenarios where having mutable state in the global
window.farmOS.map is ugly/limiting.

These changes should allow farmOS-map to also be used
as follows;

npm install @farmos.org/farmos-map@2
import MapInstanceManager from '@farmos.org/farmos-map/MapInstanceManager';

const maps = new MapInstanceManager();

const map = maps.create('my-map');

Some background can be found in the following issues;

…armOS#112

**Why?** Establish a baseline for how farmOS-map performs with the
current 1.x build. This will make it possible to tell whether
proposed future changes make farmOS-map's performance better or worse.

```sh
$ npm test

> [email protected] test
> rm -rf **/perfData/* && jest test/index.spec.js --maxWorkers=1

 PASS  test/index.spec.js (1239.458 s)
  minimal-html-consumer
    ✓ should build (8392 ms)
    get metrics from 10 perf.test.js runs
      ✓ minimal-html-consumer run #0 (36467 ms)
      ✓ minimal-html-consumer run #1 (35982 ms)
      ✓ minimal-html-consumer run farmOS#2 (36179 ms)
      ✓ minimal-html-consumer run farmOS#3 (36566 ms)
      ✓ minimal-html-consumer run farmOS#4 (36226 ms)
      ✓ minimal-html-consumer run farmOS#5 (35367 ms)
      ✓ minimal-html-consumer run farmOS#6 (35738 ms)
      ✓ minimal-html-consumer run farmOS#7 (35843 ms)
      ✓ minimal-html-consumer run farmOS#8 (36533 ms)
      ✓ minimal-html-consumer run farmOS#9 (35015 ms)
  simple-html-consumer
    ✓ should build (8166 ms)
    get metrics from 10 perf.test.js runs
      ✓ simple-html-consumer run #0 (42998 ms)
      ✓ simple-html-consumer run #1 (42986 ms)
      ✓ simple-html-consumer run farmOS#2 (44794 ms)
      ✓ simple-html-consumer run farmOS#3 (42317 ms)
      ✓ simple-html-consumer run farmOS#4 (42581 ms)
      ✓ simple-html-consumer run farmOS#5 (42097 ms)
      ✓ simple-html-consumer run farmOS#6 (42674 ms)
      ✓ simple-html-consumer run farmOS#7 (43826 ms)
      ✓ simple-html-consumer run farmOS#8 (42665 ms)
      ✓ simple-html-consumer run farmOS#9 (42041 ms)
  extended-behavior
    ✓ should build (10391 ms)
    get metrics from 10 perf.test.js runs
      ✓ extended-behavior run #0 (42462 ms)
      ✓ extended-behavior run #1 (42358 ms)
      ✓ extended-behavior run farmOS#2 (42340 ms)
      ✓ extended-behavior run farmOS#3 (41896 ms)
      ✓ extended-behavior run farmOS#4 (42412 ms)
      ✓ extended-behavior run farmOS#5 (41932 ms)
      ✓ extended-behavior run farmOS#6 (42316 ms)
      ✓ extended-behavior run farmOS#7 (42584 ms)
      ✓ extended-behavior run farmOS#8 (42611 ms)
      ✓ extended-behavior run farmOS#9 (42234 ms)

  console.log
    {
      'minimal-html-consumer/Regular4G-uncached': {
        'first-contentful-paint': 446.90000002384187,
        'nav-to-net-idle': 1512.1465719461441,
        'js-resource-count': 1,
        'js-resource-total-transfer-bytes': 142388,
        'js-resource-total-decoded-bytes': 566734
      },
      'minimal-html-consumer/SlowCPU-uncached': {
        'first-contentful-paint': 492.09000000953677,
        'nav-to-net-idle': 1706.3178470849991,
        'js-resource-count': 1,
        'js-resource-total-transfer-bytes': 142388,
        'js-resource-total-decoded-bytes': 566734
      },
      'minimal-html-consumer/Unthrottled-uncached': {
        'first-contentful-paint': 183.65999999046326,
        'nav-to-net-idle': 1374.6113351106644,
        'js-resource-count': 1,
        'js-resource-total-transfer-bytes': 142388,
        'js-resource-total-decoded-bytes': 566734
      },
      'minimal-html-consumer/Regular2G-uncached': {
        'first-contentful-paint': 5213.679999971389,
        'nav-to-net-idle': 8806.243415784837,
        'js-resource-count': 1,
        'js-resource-total-transfer-bytes': 142388,
        'js-resource-total-decoded-bytes': 566734
      },
      'minimal-html-consumer/Unthrottled-cached': {
        'first-contentful-paint': 122.57000005245209,
        'nav-to-net-idle': 971.3543920755386,
        'js-resource-count': 1,
        'js-resource-total-transfer-bytes': 0,
        'js-resource-total-decoded-bytes': 566734
      },
      'minimal-html-consumer/Regular4G-cached': {
        'first-contentful-paint': 124.43000001907349,
        'nav-to-net-idle': 970.4835140228272,
        'js-resource-count': 1,
        'js-resource-total-transfer-bytes': 0,
        'js-resource-total-decoded-bytes': 566734
      },
      'minimal-html-consumer/SlowCPU-cached': {
        'first-contentful-paint': 530.1500000238418,
        'nav-to-net-idle': 2080.892780327797,
        'js-resource-count': 1,
        'js-resource-total-transfer-bytes': 0,
        'js-resource-total-decoded-bytes': 566734
      },
      'minimal-html-consumer/Regular2G-cached': {
        'first-contentful-paint': 130.1899999856949,
        'nav-to-net-idle': 2055.8916233778,
        'js-resource-count': 1,
        'js-resource-total-transfer-bytes': 0,
        'js-resource-total-decoded-bytes': 566734
      },
      'minimal-html-consumer/DSL-uncached': {
        'first-contentful-paint': 672.9100000143051,
        'nav-to-net-idle': 2104.5823947668077,
        'js-resource-count': 1,
        'js-resource-total-transfer-bytes': 142388,
        'js-resource-total-decoded-bytes': 566734
      },
      'minimal-html-consumer/DSL-cached': {
        'first-contentful-paint': 129.41999998092652,
        'nav-to-net-idle': 972.6821264743805,
        'js-resource-count': 1,
        'js-resource-total-transfer-bytes': 0,
        'js-resource-total-decoded-bytes': 566734
      },
      'simple-html-consumer/DSL-uncached': {
        'first-contentful-paint': 877.7100001096726,
        'nav-to-net-idle': 2393.6956593513487,
        'js-resource-count': 7,
        'js-resource-total-transfer-bytes': 147957,
        'js-resource-total-decoded-bytes': 579733
      },
      'simple-html-consumer/Regular2G-uncached': {
        'first-contentful-paint': 6718.77999997139,
        'nav-to-net-idle': 14342.337829470634,
        'js-resource-count': 7,
        'js-resource-total-transfer-bytes': 147957,
        'js-resource-total-decoded-bytes': 579733
      },
      'simple-html-consumer/Regular4G-cached': {
        'first-contentful-paint': 164.4800000190735,
        'nav-to-net-idle': 1156.7266651630403,
        'js-resource-count': 7,
        'js-resource-total-transfer-bytes': 0,
        'js-resource-total-decoded-bytes': 579733
      },
      'simple-html-consumer/Unthrottled-cached': {
        'first-contentful-paint': 153.54999997615815,
        'nav-to-net-idle': 1055.5395266771316,
        'js-resource-count': 7,
        'js-resource-total-transfer-bytes': 0,
        'js-resource-total-decoded-bytes': 579733
      },
      'simple-html-consumer/SlowCPU-cached': {
        'first-contentful-paint': 775.8299999475479,
        'nav-to-net-idle': 2235.711291909218,
        'js-resource-count': 7,
        'js-resource-total-transfer-bytes': 0,
        'js-resource-total-decoded-bytes': 579733
      },
      'simple-html-consumer/Regular2G-cached': {
        'first-contentful-paint': 151.5399999141693,
        'nav-to-net-idle': 1685.8383747816085,
        'js-resource-count': 7,
        'js-resource-total-transfer-bytes': 0,
        'js-resource-total-decoded-bytes': 579733
      },
      'simple-html-consumer/SlowCPU-uncached': {
        'first-contentful-paint': 750.6200000286102,
        'nav-to-net-idle': 2078.0361548185347,
        'js-resource-count': 7,
        'js-resource-total-transfer-bytes': 147957,
        'js-resource-total-decoded-bytes': 579733
      },
      'simple-html-consumer/Regular4G-uncached': {
        'first-contentful-paint': 552.9100000143051,
        'nav-to-net-idle': 1738.50921125412,
        'js-resource-count': 7.1,
        'js-resource-total-transfer-bytes': 147957,
        'js-resource-total-decoded-bytes': 579733
      },
      'simple-html-consumer/DSL-cached': {
        'first-contentful-paint': 158.12000012397766,
        'nav-to-net-idle': 1152.6239531278611,
        'js-resource-count': 7,
        'js-resource-total-transfer-bytes': 0,
        'js-resource-total-decoded-bytes': 579733
      },
      'simple-html-consumer/Unthrottled-uncached': {
        'first-contentful-paint': 424.30000004768374,
        'nav-to-net-idle': 1665.9948377847672,
        'js-resource-count': 7,
        'js-resource-total-transfer-bytes': 147957,
        'js-resource-total-decoded-bytes': 579733
      },
      'extended-behavior/Unthrottled-uncached': {
        'first-contentful-paint': 374.8199999332428,
        'nav-to-net-idle': 1389.9896256446839,
        'js-resource-count': 8,
        'js-resource-total-transfer-bytes': 149230,
        'js-resource-total-decoded-bytes': 581207
      },
      'extended-behavior/Regular2G-uncached': {
        'first-contentful-paint': 6742.35999994278,
        'nav-to-net-idle': 14359.734034967423,
        'js-resource-count': 8,
        'js-resource-total-transfer-bytes': 149230,
        'js-resource-total-decoded-bytes': 581207
      },
      'extended-behavior/Unthrottled-cached': {
        'first-contentful-paint': 145.82000002861022,
        'nav-to-net-idle': 955.8867040157318,
        'js-resource-count': 8,
        'js-resource-total-transfer-bytes': 0,
        'js-resource-total-decoded-bytes': 581207
      },
      'extended-behavior/Regular2G-cached': {
        'first-contentful-paint': 150.2199999809265,
        'nav-to-net-idle': 1660.2450085639953,
        'js-resource-count': 8,
        'js-resource-total-transfer-bytes': 0,
        'js-resource-total-decoded-bytes': 581207
      },
      'extended-behavior/SlowCPU-uncached': {
        'first-contentful-paint': 758.5700000286103,
        'nav-to-net-idle': 2088.9999500274657,
        'js-resource-count': 8,
        'js-resource-total-transfer-bytes': 149230,
        'js-resource-total-decoded-bytes': 581207
      },
      'extended-behavior/Regular4G-uncached': {
        'first-contentful-paint': 566.8199999332428,
        'nav-to-net-idle': 1697.445786523819,
        'js-resource-count': 8,
        'js-resource-total-transfer-bytes': 149230,
        'js-resource-total-decoded-bytes': 581207
      },
      'extended-behavior/SlowCPU-cached': {
        'first-contentful-paint': 810.9900000572204,
        'nav-to-net-idle': 2215.839546537399,
        'js-resource-count': 8,
        'js-resource-total-transfer-bytes': 0,
        'js-resource-total-decoded-bytes': 581207
      },
      'extended-behavior/DSL-uncached': {
        'first-contentful-paint': 899.310000038147,
        'nav-to-net-idle': 2403.841999006271,
        'js-resource-count': 8,
        'js-resource-total-transfer-bytes': 149230,
        'js-resource-total-decoded-bytes': 581207
      },
      'extended-behavior/Regular4G-cached': {
        'first-contentful-paint': 151.94000000953673,
        'nav-to-net-idle': 1047.6097763061523,
        'js-resource-count': 8,
        'js-resource-total-transfer-bytes': 0,
        'js-resource-total-decoded-bytes': 581207
      },
      'extended-behavior/DSL-cached': {
        'first-contentful-paint': 154.07999997138978,
        'nav-to-net-idle': 1070.1390951633452,
        'js-resource-count': 8,
        'js-resource-total-transfer-bytes': 0,
        'js-resource-total-decoded-bytes': 581207
      }
    }

      at Object.<anonymous> (test/index.spec.js:78:11)

Test Suites: 1 passed, 1 total
Tests:       33 passed, 33 total
Snapshots:   0 total
Time:        1239.846 s, estimated 1392 s
Ran all test suites matching /test\/index.spec.js/i.
```
…#116

**Why?** Subsequent changes will need to leverage non-top-level
import() statements and the old version of eslint/emca did
not support that.
**Why?** Make farmOS-map more modular and efficient without
drastically changing its interface or feature set.

*Note: This **is** a breaking change though because it
makes the existing behaviors load asynchronously so
properties like `instance.edit` won't get populated
until the behavior has loaded and done so.*
**Why?** Better support alternative bundling strategies
and scenarios where having mutable state in the global
`window.farmOS.map` is ugly/limiting.

These changes should allow farmOS-map to also be used
as follows;

```sh
npm install @farmos.org/farmos-map@2
```

```js
import MapInstanceManager from '@farmos.org/farmos-map/MapInstanceManager';

const maps = new MapInstanceManager();

const map = maps.create('my-map');
```

Some background can be found in the following issues;

* farmOS#113
* farmOS#68
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

2 participants