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

⚡️ perf: fix SSR hydration to improve first-visit first-page loading #2640

Merged
merged 1 commit into from
May 24, 2024

Conversation

arvinxx
Copy link
Contributor

@arvinxx arvinxx commented May 24, 2024

💻 变更类型 | Change Type

  • ✨ feat
  • 🐛 fix
  • ♻️ refactor
  • 💄 style
  • 🔨 chore
  • ⚡️ perf
  • 📝 docs

🔀 变更说明 | Description of Change

close #2572
close #2516

📝 补充信息 | Additional Information

#253 中,我们基于 Cookie 实现了用户浏览器自适应语种的 SSR 方案。

当时存在一个问题是:用户第一次打开时是没有 cookie 的,这就会导致 fallback 到 en-US,而中文用户的浏览器(client端)又是 zh-CN ,这就会出现 SSR 水合不匹配问题。

利用 next@14.2.x 的 dev 报错可以看得非常清楚:

image

当 React SSR 水合出错时,界面会一直维持在骨架屏上,必须要用户做一次鼠标点击的操作,才能触发 client fallback 渲染。

在之前看来,在第二次及以后都不会出现这个问题,只有首次会遇到,而且是必须什么也不做才会碰到,这个场景感觉不算很多,因此暂时选择了搁置。

但也是因此,很多用户认为是加载资源多导致感觉加载慢的问题。(譬如 #2516 (comment) 的反馈)

本 PR 通过读取 header 中的 accept-language 字段,针对没有 cookie 的场景,补充 fallback 语种。这样一来,理论上就能解决大部分用户的首次访问的首屏水合问题。

Copy link

vercel bot commented May 24, 2024

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
lobe-chat-community ✅ Ready (Inspect) Visit Preview 💬 Add feedback May 24, 2024 8:36am

Copy link

coderabbitai bot commented May 24, 2024

Walkthrough

The recent changes involve adding a new dependency to handle language resolution and modifying the GlobalProvider to implement language fallback logic. This ensures that the user locale is correctly determined based on available languages, enhancing the application's internationalization support.

Changes

Files Change Summary
package.json Added the resolve-accept-language dependency to handle language resolution.
src/layout/GlobalProvider/index.tsx Updated imports, added parserFallbackLang function, and modified GlobalLayout to handle language fallback logic.

Assessment against linked issues

Objective Addressed Explanation
Improve startup and response times (Issue #2572) The changes focus on language fallback logic and do not address performance issues related to startup or response times.

In code, we find our way anew,
With languages, we now construe,
A rabbit's touch, so swift and light,
Enhances locales, day and night.
🌐🐇

Tip

New Features and Improvements

Review Settings

Introduced new personality profiles for code reviews. Users can now select between "Chill" and "Assertive" review tones to tailor feedback styles according to their preferences. The "Assertive" profile posts more comments and nitpicks the code more aggressively, while the "Chill" profile is more relaxed and posts fewer comments.

AST-based Instructions

CodeRabbit offers customizing reviews based on the Abstract Syntax Tree (AST) pattern matching. Read more about AST-based instructions in the documentation.

Community-driven AST-based Rules

We are kicking off a community-driven initiative to create and share AST-based rules. Users can now contribute their AST-based rules to detect security vulnerabilities, code smells, and anti-patterns. Please see the ast-grep-essentials repository for more information.

New Static Analysis Tools

We are continually expanding our support for static analysis tools. We have added support for biome, hadolint, and ast-grep. Update the settings in your .coderabbit.yaml file or head over to the settings page to enable or disable the tools you want to use.

Tone Settings

Users can now customize CodeRabbit to review code in the style of their favorite characters or personalities. Here are some of our favorite examples:

  • Mr. T: "You must talk like Mr. T in all your code reviews. I pity the fool who doesn't!"
  • Pirate: "Arr, matey! Ye must talk like a pirate in all yer code reviews. Yarrr!"
  • Snarky: "You must be snarky in all your code reviews. Snark, snark, snark!"

Revamped Settings Page

We have redesigned the settings page for a more intuitive layout, enabling users to find and adjust settings quickly. This change was long overdue; it not only improves the user experience but also allows our development team to add more settings in the future with ease. Going forward, the changes to .coderabbit.yaml will be reflected in the settings page, and vice versa.

Miscellaneous

  • Turn off free summarization: You can switch off free summarization of PRs opened by users not on a paid plan using the enable_free_tier setting.
  • Knowledge-base scope: You can now set the scope of the knowledge base to either the repository (local) or the organization (global) level using the knowledge_base setting. In addition, you can specify Jira project keys and Linear team keys to limit the knowledge base scope for those integrations.
  • High-level summary placement: You can now customize the location of the high-level summary in the PR description using the high_level_summary_placeholder setting (default @coderabbitai summary).
  • Revamped request changes workflow: You can now configure CodeRabbit to auto-approve or request changes on PRs based on the review feedback using the request_changes_workflow setting.

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

Share
Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai generate interesting stats about this repository and render them as a table.
    • @coderabbitai show all the console.log statements in this repository.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (invoked as PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger a review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai help to get help.

Additionally, you can add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.

CodeRabbit Configration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@lobehubbot
Copy link
Member

👍 @arvinxx

Thank you for raising your pull request and contributing to our Community
Please make sure you have followed our contributing guidelines. We will review it as soon as possible.
If you encounter any problems, please feel free to connect with us.
非常感谢您提出拉取请求并为我们的社区做出贡献,请确保您已经遵循了我们的贡献指南,我们会尽快审查它。
如果您遇到任何问题,请随时与我们联系。

Copy link

codecov bot commented May 24, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 93.68%. Comparing base (ab4216e) to head (e2eb5e0).
Report is 2 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #2640   +/-   ##
=======================================
  Coverage   93.68%   93.68%           
=======================================
  Files         349      349           
  Lines       20408    20408           
  Branches     1574     1576    +2     
=======================================
  Hits        19119    19119           
  Misses       1289     1289           

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Outside diff range and nitpick comments (1)
src/layout/GlobalProvider/index.tsx (1)

Line range hint 56-79: The use of any type for defaultNeutralColor and defaultPrimaryColor should be replaced with more specific types to enhance type safety.

- defaultNeutralColor={neutralColor?.value as any}
- defaultPrimaryColor={primaryColor?.value as any}
+ defaultNeutralColor={neutralColor?.value as string}  // Assuming the type is string, adjust as necessary
+ defaultPrimaryColor={primaryColor?.value as string}  // Assuming the type is string, adjust as necessary
Review Details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits Files that changed from the base of the PR and between 73989e7 and e2eb5e0.
Files selected for processing (2)
  • package.json (1 hunks)
  • src/layout/GlobalProvider/index.tsx (4 hunks)
Files skipped from review due to trivial changes (1)
  • package.json
Additional Context Used
Biome (3)
src/layout/GlobalProvider/index.tsx (3)

82-82: Unexpected any. Specify a different type.


83-83: Unexpected any. Specify a different type.


2-3: All these imports are only used as types.

Comment on lines +2 to +3
import { cookies, headers } from 'next/headers';
import { FC, PropsWithChildren } from 'react';
Copy link

Choose a reason for hiding this comment

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

Consider using TypeScript's type-only import to prevent runtime imports where only types are needed.

- import { cookies, headers } from 'next/headers';
- import { FC, PropsWithChildren } from 'react';
+ import type { cookies, headers } from 'next/headers';
+ import type { FC, PropsWithChildren } from 'react';

Committable suggestion was skipped due low confidence.

Comment on lines +36 to +54
const parserFallbackLang = () => {
/**
* The arguments are as follows:
*
* 1) The HTTP accept-language header.
* 2) The available locales (they must contain the default locale).
* 3) The default locale.
*/
let fallbackLang: string = resolveAcceptLanguage(
headers().get('accept-language') || '',
// Invalid locale identifier 'ar'. A valid locale should follow the BCP 47 'language-country' format.
locales.map((locale) => (locale === 'ar' ? 'ar-EG' : locale)),
'en-US',
);
// if match the ar-EG then fallback to ar
if (fallbackLang === 'ar-EG') fallbackLang = 'ar';

return fallbackLang;
};
Copy link

Choose a reason for hiding this comment

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

Ensure the hardcoded locale fix ('ar-EG' to 'ar') is scalable. Consider using a mapping object for such exceptions to facilitate easier updates and maintenance.

+ const localeExceptions = { 'ar-EG': 'ar' };
- if (fallbackLang === 'ar-EG') fallbackLang = 'ar';
+ if (localeExceptions[fallbackLang]) fallbackLang = localeExceptions[fallbackLang];

Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.

Suggested change
const parserFallbackLang = () => {
/**
* The arguments are as follows:
*
* 1) The HTTP accept-language header.
* 2) The available locales (they must contain the default locale).
* 3) The default locale.
*/
let fallbackLang: string = resolveAcceptLanguage(
headers().get('accept-language') || '',
// Invalid locale identifier 'ar'. A valid locale should follow the BCP 47 'language-country' format.
locales.map((locale) => (locale === 'ar' ? 'ar-EG' : locale)),
'en-US',
);
// if match the ar-EG then fallback to ar
if (fallbackLang === 'ar-EG') fallbackLang = 'ar';
return fallbackLang;
};
const parserFallbackLang = () => {
/**
* The arguments are as follows:
*
* 1) The HTTP accept-language header.
* 2) The available locales (they must contain the default locale).
* 3) The default locale.
*/
let fallbackLang: string = resolveAcceptLanguage(
headers().get('accept-language') || '',
// Invalid locale identifier 'ar'. A valid locale should follow the BCP 47 'language-country' format.
locales.map((locale) => (locale === 'ar' ? 'ar-EG' : locale)),
'en-US',
);
const localeExceptions = { 'ar-EG': 'ar' };
// if match the ar-EG then fallback to ar
if (localeExceptions[fallbackLang]) fallbackLang = localeExceptions[fallbackLang];
return fallbackLang;
};

@arvinxx arvinxx changed the title ⚡️ perf: fix ssr hydration to improve home loading ⚡️ perf: fix ssr hydration to improve first-visit first-page loading May 24, 2024
@arvinxx arvinxx changed the title ⚡️ perf: fix ssr hydration to improve first-visit first-page loading ⚡️ perf: fix SSR hydration to improve first-visit first-page loading May 24, 2024
@arvinxx arvinxx merged commit 5bfc0df into main May 24, 2024
11 checks passed
@arvinxx arvinxx deleted the perf/ssr branch May 24, 2024 09:10
@lobehubbot
Copy link
Member

❤️ Great PR @arvinxx ❤️

The growth of project is inseparable from user feedback and contribution, thanks for your contribution! If you are interesting with the lobehub developer community, please join our discord and then dm @arvinxx or @canisminor1990. They will invite you to our private developer channel. We are talking about the lobe-chat development or sharing ai newsletter around the world.
项目的成长离不开用户反馈和贡献,感谢您的贡献! 如果您对 LobeHub 开发者社区感兴趣,请加入我们的 discord,然后私信 @arvinxx@canisminor1990。他们会邀请您加入我们的私密开发者频道。我们将会讨论关于 Lobe Chat 的开发,分享和讨论全球范围内的 AI 消息。

@lobehubbot
Copy link
Member

🎉 This PR is included in version 0.161.13 🎉

The release is available on:

Your semantic-release bot 📦🚀

ipoly pushed a commit to ipoly/lobe-chat that referenced this pull request Jul 29, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

启动慢,响应慢[Bug] 打开设置页面卡顿[Bug]
2 participants