Chevrotain / chevrotain

Parser Building Toolkit for JavaScript
https://chevrotain.io
Apache License 2.0
2.44k stars 200 forks source link

refactor: replace lodash with remeda #1952

Closed bd82 closed 12 months ago

mattbishop commented 1 year ago

Did you have a look at TS-belt for this change? They claim to be much faster and support tree-shaking. https://mobily.github.io/ts-belt/

bd82 commented 1 year ago

Thanks @mattbishop I was not aware of ts-belt Both libraries support tree-shaking so the differences would be around performance and active / on-going maintenance.

I will probably attempt to finish the migration to remeda as I am pleased with what I am seeing so far and it seems to be more actively developed.

If there are any performance regressions I will consider other options.

Potential advantage of ts-belt may be to speed up parser init time, but that may be considered as a separate future (low priority) track.

bd82 commented 12 months ago

While the size has decreased by ~20KB the performance of lexer/parser init time has degraded severely. image

bd82 commented 12 months ago

Webpack output:

asset chevrotain.min.js 153 KiB [compared for emit] [minimized] (name: main) 1 related asset
hidden modules 369 KiB 55 modules
cacheable modules 22 KiB
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/isEmpty.js 502 bytes [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/isArray.js 189 bytes [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/isString.js 198 bytes [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/map.js 1.11 KiB [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/forEach.js 1.25 KiB [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/values.js 189 bytes [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/flatten.js 926 bytes [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/forEachObj.js 876 bytes [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/first.js 696 bytes [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/merge.js 291 bytes [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/reject.js 1.32 KiB [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/keys.js 270 bytes [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/reduce.js 689 bytes [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/noop.js 167 bytes [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/last.js 286 bytes [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/identity.js 180 bytes [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/flatMap.js 977 bytes [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/isObject.js 232 bytes [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/purry.js 1010 bytes [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/_reduceLazy.js 589 bytes [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/_toLazyIndexed.js 229 bytes [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/drop.js 863 bytes [built] [code generated]
  ../../node_modules/.pnpm/is-regexp@2.1.0/node_modules/is-regexp/index.js 102 bytes [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/pickBy.js 492 bytes [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/uniq.js 875 bytes [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/compact.js 244 bytes [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/difference.js 973 bytes [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/isFunction.js 208 bytes [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/find.js 1.2 KiB [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/filter.js 1.32 KiB [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/groupBy.js 964 bytes [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/dropLast.js 772 bytes [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/clone.js 1.42 KiB [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/isTruthy.js 180 bytes [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/_toSingle.js 208 bytes [built] [code generated]
  ../../node_modules/.pnpm/remeda@1.23.0/node_modules/remeda/dist/commonjs/type.js 303 bytes [built] [code generated]
webpack 5.75.0 compiled successfully in 1318 ms
bd82 commented 12 months ago

libraryTarget = ES2015 + ESM + lodash-es will reduce chevrotain.min.js to approx 135Kb. So this is no longer needed