Skip to content

refactor: drop lodash for lib/theme - #3807

Closed
SukkaW wants to merge 10 commits into
hexojs:masterfrom
SukkaW:drop-lodash-lib-theme
Closed

refactor: drop lodash for lib/theme#3807
SukkaW wants to merge 10 commits into
hexojs:masterfrom
SukkaW:drop-lodash-lib-theme

Conversation

@SukkaW

@SukkaW SukkaW commented Oct 27, 2019

Copy link
Copy Markdown
Member

What does it do?

This PR is a part of #3753

How to test

git clone -b drop-lodash-lib-theme https://github.com/sukkaw/hexo.git
cd hexo
npm install
npm test

Screenshots

Pull request tasks

  • Add test cases for the changes.
  • Passed the CI test.

@SukkaW
SukkaW requested review from curbengh and segayuu October 27, 2019 02:54
@SukkaW

SukkaW commented Oct 27, 2019

Copy link
Copy Markdown
Member Author

According to benchmark performed by Travis CI, this PR makes generation speed 3x slower.

@coveralls

coveralls commented Oct 27, 2019

Copy link
Copy Markdown

Coverage Status

Coverage decreased (-0.002%) to 97.265% when pulling 3d3d41b on SukkaW:drop-lodash-lib-theme into 17c2bbb on hexojs:master.

Comment thread lib/theme/view.js Outdated
@SukkaW
SukkaW force-pushed the drop-lodash-lib-theme branch from f093749 to 7928973 Compare October 27, 2019 07:11
Comment thread lib/theme/index.js

this.i18n = new I18n({
languages: _(languages).compact().uniq().value()
languages: [...new Set(languages.filter(Boolean))]

@curbengh curbengh Oct 27, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what about Array.from(new Set(languages.filter(Boolean)))?

I wonder if value() is needed, I can't find it in lodash doc, perhaps it's a function of languages?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

value() is a lodash method, which is used to get value from lodash wrapped prototype chain.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have make a benchmark at jsPerf: https://jsperf.com/lodash-uniq-vs-javascript-set/1

It seems the diffrence between Array.from & spread syntax is negligible, at least in browser.

@curbengh curbengh Oct 27, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see.

The travis benchmark showed the spread syntax is the source of regression. I noticed you reverted the last commit; to confirm the source?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems the diffrence between Array.from & spread syntax is negligible, at least in browser.

Similar result in travis too. Can you try revert back to lodash just for this line? to test whether Set() is the culprit.

@curbengh curbengh Oct 27, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But that doesn't explain why lodash is faster in view.js.


btw, as for the lib/theme, I think it's fine to use Set() since languages array would only have 2 elements max, so it wouldn't (and shouldn't) make any difference.

@SukkaW SukkaW Oct 27, 2019

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@curbengh I have done through some investigation about performance of Object.assign. It seems that Object.assign will meet performance issue when facing large object. Even Node.js itself is still using the deprecated util._extend, because it is still a lot more faster than Object.assign.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A bit more interesting... Even if I replace Object.assign with lodash.assign, the impact is still there. So maybe the problem is at Object.getPrototypeOf..

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That seems like the last suspect now. what about return Object.assign({}, locals, locals.prototype, data, { ? (source)

@SukkaW SukkaW Oct 27, 2019

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@curbengh In fact I have tried local.prototype at very beginning but it won't pass the test. The locals here is differentwith a constructor.

@SukkaW
SukkaW force-pushed the drop-lodash-lib-theme branch from 4fd4a9f to 10d8fb7 Compare October 27, 2019 09:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants