Skip to content

Update Developer Guide on SSR - #1570

Merged
jonahtanjz merged 4 commits into
MarkBind:masterfrom
wxwxwxwx9:ssr-dev-guide
Jun 3, 2021
Merged

Update Developer Guide on SSR#1570
jonahtanjz merged 4 commits into
MarkBind:masterfrom
wxwxwxwx9:ssr-dev-guide

Conversation

@wxwxwxwx9

@wxwxwxwx9wxwxwxwx9 commented May 30, 2021

Copy link
Copy Markdown
Contributor

What is the purpose of this pull request?

  • Documentation update
  • Bug fix
  • Feature addition or enhancement
  • Code maintenance
  • Others, please explain:

With the SSR implementation in #1534, we should also update the developer guide to let contributors know what they should be aware of (regarding SSR) when making contributions to MarkBind.

Overview of changes:
Added a new section for SSR under Design in the developer guide.

Anything you'd like to highlight / discuss:

  • Whether the content is enough/appropriate
  • Whether the layout of the information is alright
  • Suggestions to improve the readability
  • Concept accuracy
  • The wordings/phrasings

Testing instructions:
NIL

Proposed commit message: (wrap lines at 72 characters)
Update Developer Guide on SSR.

There are a few important information that contributors should
take note of regarding SSR (especially hydration issues).

Let's update the developer guide to include those information.


Checklist: ☑️

  • Updated the documentation for feature additions and enhancements
  • Added tests for bug fixes or features
  • Linked all related issues
  • No blatantly unrelated changes
  • Pinged someone for a review!

@jonahtanjzjonahtanjz left a comment

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.

Good job @wxwxwxwx9 👍 I feel it's clear and detailed. Thanks for working on this. LGTM!

@jonahtanjzjonahtanjz added this to the v3.0 milestone Jun 3, 2021
@jonahtanjz
jonahtanjz merged commit fa3fe71 into MarkBind:masterJun 3, 2021

@ang-zeyuang-zeyu left a comment

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.

Sorry for the late review!

This generally looks good to me as well 👍

Several small suggestions we can deal with later:


SSR and Client-side Hydration are 2 concepts that go hand-in-hand. Essentially, once we produce the static HTML via SSR and send it over to the client-side, Vue on the client-side will execute what is known as Client-side Hydration on the static HTML.

During the hydration process, Vue essentially `diff` your SSR HTML markup against the virtual DOM generated by the render function on the client-side. If any difference is found, meaning that the application that we have on the client-side (the virtual DOM tree) differs from the SSR HTML mark-up that we send to the client, Vue will reject the SSR HTML output, bail Client-side Hydration, and execute full CSR.

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.

essentially diff -> compares

During the hydration process, Vue essentially `diff` your SSR HTML markup against the virtual DOM generated by the render function on the client-side. If any difference is found, meaning that the application that we have on the client-side (the virtual DOM tree) differs from the SSR HTML mark-up that we send to the client, Vue will reject the SSR HTML output, bail Client-side Hydration, and execute full CSR.

This is known as "Hydration Issue" and it is one of the main challenges you will face with SSR in MarkBind.

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.

Could add an alert box here highlighting that this comparison dosen't execute in production vue build. Rather, if there are any runtime errors resulting from hydration errors, then full csr is re-executed.

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.

in case anyone tests this with production builds

Conceptually, to prevent hydration issue, what we should always strive to achieve is a "universal application".

It is not difficult to achieve a "universal application" per-se because we merely have to ensure two things:
1) the state data are the same between client-side and server-side.

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.

state data -> initial state

1) the state data are the same between client-side and server-side.
2) after compiling and rendering the Vue page application, the SSR HTML mark-up is not modified.

However, beyond achieving a "universal application", there are also some more specific rules that we should adhere to, so that we do not run into hydration issue:

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.

Slight reorganisation since both are actually html spec issues:

However

there are also some more specific rules that we should adhere to -> note that the HTML spec should be adhered to. Some common mistakes are as such:

  • Having block-level elements within <p> tag
  • Having unknown ...

- Do not violate HTML spec as much as possible (e.g. having block-level elements within `<p>` tag).
- Having unknown HTML elements within our Vue application during compilation/rendering (though this can be easily resolved by adding `v-pre` to the unknown element, so that Vue will ignore that element during compilation).

Note that the list only included the common causes of hydration issue that MarkBind developers have ran into. There may be other causes of hydration issue that are not listed here (although unlikely).

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.

Could also add:

If you are unsure what elements are allowed within other elements, or what constitutes invalid HTML in general, a good resource to reference would be the [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/span)

Sign up for freeto 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

@wxwxwxwx9@ang-zeyu@jonahtanjz
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Update Developer Guide on SSR by wxwxwxwx9 · Pull Request #1570 · MarkBind/markbind · GitHub
Skip to content

Update Developer Guide on SSR - #1570

Merged
jonahtanjz merged 4 commits into
MarkBind:masterfrom
wxwxwxwx9:ssr-dev-guide
Jun 3, 2021
Merged

Update Developer Guide on SSR#1570
jonahtanjz merged 4 commits into
MarkBind:masterfrom
wxwxwxwx9:ssr-dev-guide

Conversation

@wxwxwxwx9

@wxwxwxwx9wxwxwxwx9 commented May 30, 2021

Copy link
Copy Markdown
Contributor

What is the purpose of this pull request?

  • Documentation update
  • Bug fix
  • Feature addition or enhancement
  • Code maintenance
  • Others, please explain:

With the SSR implementation in #1534, we should also update the developer guide to let contributors know what they should be aware of (regarding SSR) when making contributions to MarkBind.

Overview of changes:
Added a new section for SSR under Design in the developer guide.

Anything you'd like to highlight / discuss:

  • Whether the content is enough/appropriate
  • Whether the layout of the information is alright
  • Suggestions to improve the readability
  • Concept accuracy
  • The wordings/phrasings

Testing instructions:
NIL

Proposed commit message: (wrap lines at 72 characters)
Update Developer Guide on SSR.

There are a few important information that contributors should
take note of regarding SSR (especially hydration issues).

Let's update the developer guide to include those information.


Checklist: ☑️

  • Updated the documentation for feature additions and enhancements
  • Added tests for bug fixes or features
  • Linked all related issues
  • No blatantly unrelated changes
  • Pinged someone for a review!

@jonahtanjzjonahtanjz left a comment

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.

Good job @wxwxwxwx9 👍 I feel it's clear and detailed. Thanks for working on this. LGTM!

@jonahtanjzjonahtanjz added this to the v3.0 milestone Jun 3, 2021
@jonahtanjz
jonahtanjz merged commit fa3fe71 into MarkBind:masterJun 3, 2021

@ang-zeyuang-zeyu left a comment

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.

Sorry for the late review!

This generally looks good to me as well 👍

Several small suggestions we can deal with later:


SSR and Client-side Hydration are 2 concepts that go hand-in-hand. Essentially, once we produce the static HTML via SSR and send it over to the client-side, Vue on the client-side will execute what is known as Client-side Hydration on the static HTML.

During the hydration process, Vue essentially `diff` your SSR HTML markup against the virtual DOM generated by the render function on the client-side. If any difference is found, meaning that the application that we have on the client-side (the virtual DOM tree) differs from the SSR HTML mark-up that we send to the client, Vue will reject the SSR HTML output, bail Client-side Hydration, and execute full CSR.

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.

essentially diff -> compares

During the hydration process, Vue essentially `diff` your SSR HTML markup against the virtual DOM generated by the render function on the client-side. If any difference is found, meaning that the application that we have on the client-side (the virtual DOM tree) differs from the SSR HTML mark-up that we send to the client, Vue will reject the SSR HTML output, bail Client-side Hydration, and execute full CSR.

This is known as "Hydration Issue" and it is one of the main challenges you will face with SSR in MarkBind.

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.

Could add an alert box here highlighting that this comparison dosen't execute in production vue build. Rather, if there are any runtime errors resulting from hydration errors, then full csr is re-executed.

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.

in case anyone tests this with production builds

Conceptually, to prevent hydration issue, what we should always strive to achieve is a "universal application".

It is not difficult to achieve a "universal application" per-se because we merely have to ensure two things:
1) the state data are the same between client-side and server-side.

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.

state data -> initial state

1) the state data are the same between client-side and server-side.
2) after compiling and rendering the Vue page application, the SSR HTML mark-up is not modified.

However, beyond achieving a "universal application", there are also some more specific rules that we should adhere to, so that we do not run into hydration issue:

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.

Slight reorganisation since both are actually html spec issues:

However

there are also some more specific rules that we should adhere to -> note that the HTML spec should be adhered to. Some common mistakes are as such:

  • Having block-level elements within <p> tag
  • Having unknown ...

- Do not violate HTML spec as much as possible (e.g. having block-level elements within `<p>` tag).
- Having unknown HTML elements within our Vue application during compilation/rendering (though this can be easily resolved by adding `v-pre` to the unknown element, so that Vue will ignore that element during compilation).

Note that the list only included the common causes of hydration issue that MarkBind developers have ran into. There may be other causes of hydration issue that are not listed here (although unlikely).

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.

Could also add:

If you are unsure what elements are allowed within other elements, or what constitutes invalid HTML in general, a good resource to reference would be the [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/span)

Sign up for freeto 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

@wxwxwxwx9@ang-zeyu@jonahtanjz
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Update Developer Guide on SSR by wxwxwxwx9 · Pull Request #1570 · MarkBind/markbind · GitHub
Skip to content

Update Developer Guide on SSR - #1570

Merged
jonahtanjz merged 4 commits into
MarkBind:masterfrom
wxwxwxwx9:ssr-dev-guide
Jun 3, 2021
Merged

Update Developer Guide on SSR#1570
jonahtanjz merged 4 commits into
MarkBind:masterfrom
wxwxwxwx9:ssr-dev-guide

Conversation

@wxwxwxwx9

@wxwxwxwx9wxwxwxwx9 commented May 30, 2021

Copy link
Copy Markdown
Contributor

What is the purpose of this pull request?

  • Documentation update
  • Bug fix
  • Feature addition or enhancement
  • Code maintenance
  • Others, please explain:

With the SSR implementation in #1534, we should also update the developer guide to let contributors know what they should be aware of (regarding SSR) when making contributions to MarkBind.

Overview of changes:
Added a new section for SSR under Design in the developer guide.

Anything you'd like to highlight / discuss:

  • Whether the content is enough/appropriate
  • Whether the layout of the information is alright
  • Suggestions to improve the readability
  • Concept accuracy
  • The wordings/phrasings

Testing instructions:
NIL

Proposed commit message: (wrap lines at 72 characters)
Update Developer Guide on SSR.

There are a few important information that contributors should
take note of regarding SSR (especially hydration issues).

Let's update the developer guide to include those information.


Checklist: ☑️

  • Updated the documentation for feature additions and enhancements
  • Added tests for bug fixes or features
  • Linked all related issues
  • No blatantly unrelated changes
  • Pinged someone for a review!

@jonahtanjzjonahtanjz left a comment

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.

Good job @wxwxwxwx9 👍 I feel it's clear and detailed. Thanks for working on this. LGTM!

@jonahtanjzjonahtanjz added this to the v3.0 milestone Jun 3, 2021
@jonahtanjz
jonahtanjz merged commit fa3fe71 into MarkBind:masterJun 3, 2021

@ang-zeyuang-zeyu left a comment

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.

Sorry for the late review!

This generally looks good to me as well 👍

Several small suggestions we can deal with later:


SSR and Client-side Hydration are 2 concepts that go hand-in-hand. Essentially, once we produce the static HTML via SSR and send it over to the client-side, Vue on the client-side will execute what is known as Client-side Hydration on the static HTML.

During the hydration process, Vue essentially `diff` your SSR HTML markup against the virtual DOM generated by the render function on the client-side. If any difference is found, meaning that the application that we have on the client-side (the virtual DOM tree) differs from the SSR HTML mark-up that we send to the client, Vue will reject the SSR HTML output, bail Client-side Hydration, and execute full CSR.

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.

essentially diff -> compares

During the hydration process, Vue essentially `diff` your SSR HTML markup against the virtual DOM generated by the render function on the client-side. If any difference is found, meaning that the application that we have on the client-side (the virtual DOM tree) differs from the SSR HTML mark-up that we send to the client, Vue will reject the SSR HTML output, bail Client-side Hydration, and execute full CSR.

This is known as "Hydration Issue" and it is one of the main challenges you will face with SSR in MarkBind.

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.

Could add an alert box here highlighting that this comparison dosen't execute in production vue build. Rather, if there are any runtime errors resulting from hydration errors, then full csr is re-executed.

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.

in case anyone tests this with production builds

Conceptually, to prevent hydration issue, what we should always strive to achieve is a "universal application".

It is not difficult to achieve a "universal application" per-se because we merely have to ensure two things:
1) the state data are the same between client-side and server-side.

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.

state data -> initial state

1) the state data are the same between client-side and server-side.
2) after compiling and rendering the Vue page application, the SSR HTML mark-up is not modified.

However, beyond achieving a "universal application", there are also some more specific rules that we should adhere to, so that we do not run into hydration issue:

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.

Slight reorganisation since both are actually html spec issues:

However

there are also some more specific rules that we should adhere to -> note that the HTML spec should be adhered to. Some common mistakes are as such:

  • Having block-level elements within <p> tag
  • Having unknown ...

- Do not violate HTML spec as much as possible (e.g. having block-level elements within `<p>` tag).
- Having unknown HTML elements within our Vue application during compilation/rendering (though this can be easily resolved by adding `v-pre` to the unknown element, so that Vue will ignore that element during compilation).

Note that the list only included the common causes of hydration issue that MarkBind developers have ran into. There may be other causes of hydration issue that are not listed here (although unlikely).

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.

Could also add:

If you are unsure what elements are allowed within other elements, or what constitutes invalid HTML in general, a good resource to reference would be the [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/span)

Sign up for freeto 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

@wxwxwxwx9@ang-zeyu@jonahtanjz
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Update Developer Guide on SSR by wxwxwxwx9 · Pull Request #1570 · MarkBind/markbind · GitHub
Skip to content

Update Developer Guide on SSR - #1570

Merged
jonahtanjz merged 4 commits into
MarkBind:masterfrom
wxwxwxwx9:ssr-dev-guide
Jun 3, 2021
Merged

Update Developer Guide on SSR#1570
jonahtanjz merged 4 commits into
MarkBind:masterfrom
wxwxwxwx9:ssr-dev-guide

Conversation

@wxwxwxwx9

@wxwxwxwx9wxwxwxwx9 commented May 30, 2021

Copy link
Copy Markdown
Contributor

What is the purpose of this pull request?

  • Documentation update
  • Bug fix
  • Feature addition or enhancement
  • Code maintenance
  • Others, please explain:

With the SSR implementation in #1534, we should also update the developer guide to let contributors know what they should be aware of (regarding SSR) when making contributions to MarkBind.

Overview of changes:
Added a new section for SSR under Design in the developer guide.

Anything you'd like to highlight / discuss:

  • Whether the content is enough/appropriate
  • Whether the layout of the information is alright
  • Suggestions to improve the readability
  • Concept accuracy
  • The wordings/phrasings

Testing instructions:
NIL

Proposed commit message: (wrap lines at 72 characters)
Update Developer Guide on SSR.

There are a few important information that contributors should
take note of regarding SSR (especially hydration issues).

Let's update the developer guide to include those information.


Checklist: ☑️

  • Updated the documentation for feature additions and enhancements
  • Added tests for bug fixes or features
  • Linked all related issues
  • No blatantly unrelated changes
  • Pinged someone for a review!

@jonahtanjzjonahtanjz left a comment

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.

Good job @wxwxwxwx9 👍 I feel it's clear and detailed. Thanks for working on this. LGTM!

@jonahtanjzjonahtanjz added this to the v3.0 milestone Jun 3, 2021
@jonahtanjz
jonahtanjz merged commit fa3fe71 into MarkBind:masterJun 3, 2021

@ang-zeyuang-zeyu left a comment

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.

Sorry for the late review!

This generally looks good to me as well 👍

Several small suggestions we can deal with later:


SSR and Client-side Hydration are 2 concepts that go hand-in-hand. Essentially, once we produce the static HTML via SSR and send it over to the client-side, Vue on the client-side will execute what is known as Client-side Hydration on the static HTML.

During the hydration process, Vue essentially `diff` your SSR HTML markup against the virtual DOM generated by the render function on the client-side. If any difference is found, meaning that the application that we have on the client-side (the virtual DOM tree) differs from the SSR HTML mark-up that we send to the client, Vue will reject the SSR HTML output, bail Client-side Hydration, and execute full CSR.

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.

essentially diff -> compares

During the hydration process, Vue essentially `diff` your SSR HTML markup against the virtual DOM generated by the render function on the client-side. If any difference is found, meaning that the application that we have on the client-side (the virtual DOM tree) differs from the SSR HTML mark-up that we send to the client, Vue will reject the SSR HTML output, bail Client-side Hydration, and execute full CSR.

This is known as "Hydration Issue" and it is one of the main challenges you will face with SSR in MarkBind.

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.

Could add an alert box here highlighting that this comparison dosen't execute in production vue build. Rather, if there are any runtime errors resulting from hydration errors, then full csr is re-executed.

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.

in case anyone tests this with production builds

Conceptually, to prevent hydration issue, what we should always strive to achieve is a "universal application".

It is not difficult to achieve a "universal application" per-se because we merely have to ensure two things:
1) the state data are the same between client-side and server-side.

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.

state data -> initial state

1) the state data are the same between client-side and server-side.
2) after compiling and rendering the Vue page application, the SSR HTML mark-up is not modified.

However, beyond achieving a "universal application", there are also some more specific rules that we should adhere to, so that we do not run into hydration issue:

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.

Slight reorganisation since both are actually html spec issues:

However

there are also some more specific rules that we should adhere to -> note that the HTML spec should be adhered to. Some common mistakes are as such:

  • Having block-level elements within <p> tag
  • Having unknown ...

- Do not violate HTML spec as much as possible (e.g. having block-level elements within `<p>` tag).
- Having unknown HTML elements within our Vue application during compilation/rendering (though this can be easily resolved by adding `v-pre` to the unknown element, so that Vue will ignore that element during compilation).

Note that the list only included the common causes of hydration issue that MarkBind developers have ran into. There may be other causes of hydration issue that are not listed here (although unlikely).

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.

Could also add:

If you are unsure what elements are allowed within other elements, or what constitutes invalid HTML in general, a good resource to reference would be the [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/span)

Sign up for freeto 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

@wxwxwxwx9@ang-zeyu@jonahtanjz
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Update Developer Guide on SSR by wxwxwxwx9 · Pull Request #1570 · MarkBind/markbind · GitHub
Skip to content

Update Developer Guide on SSR - #1570

Merged
jonahtanjz merged 4 commits into
MarkBind:masterfrom
wxwxwxwx9:ssr-dev-guide
Jun 3, 2021
Merged

Update Developer Guide on SSR#1570
jonahtanjz merged 4 commits into
MarkBind:masterfrom
wxwxwxwx9:ssr-dev-guide

Conversation

@wxwxwxwx9

@wxwxwxwx9wxwxwxwx9 commented May 30, 2021

Copy link
Copy Markdown
Contributor

What is the purpose of this pull request?

  • Documentation update
  • Bug fix
  • Feature addition or enhancement
  • Code maintenance
  • Others, please explain:

With the SSR implementation in #1534, we should also update the developer guide to let contributors know what they should be aware of (regarding SSR) when making contributions to MarkBind.

Overview of changes:
Added a new section for SSR under Design in the developer guide.

Anything you'd like to highlight / discuss:

  • Whether the content is enough/appropriate
  • Whether the layout of the information is alright
  • Suggestions to improve the readability
  • Concept accuracy
  • The wordings/phrasings

Testing instructions:
NIL

Proposed commit message: (wrap lines at 72 characters)
Update Developer Guide on SSR.

There are a few important information that contributors should
take note of regarding SSR (especially hydration issues).

Let's update the developer guide to include those information.


Checklist: ☑️

  • Updated the documentation for feature additions and enhancements
  • Added tests for bug fixes or features
  • Linked all related issues
  • No blatantly unrelated changes
  • Pinged someone for a review!

@jonahtanjzjonahtanjz left a comment

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.

Good job @wxwxwxwx9 👍 I feel it's clear and detailed. Thanks for working on this. LGTM!

@jonahtanjzjonahtanjz added this to the v3.0 milestone Jun 3, 2021
@jonahtanjz
jonahtanjz merged commit fa3fe71 into MarkBind:masterJun 3, 2021

@ang-zeyuang-zeyu left a comment

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.

Sorry for the late review!

This generally looks good to me as well 👍

Several small suggestions we can deal with later:


SSR and Client-side Hydration are 2 concepts that go hand-in-hand. Essentially, once we produce the static HTML via SSR and send it over to the client-side, Vue on the client-side will execute what is known as Client-side Hydration on the static HTML.

During the hydration process, Vue essentially `diff` your SSR HTML markup against the virtual DOM generated by the render function on the client-side. If any difference is found, meaning that the application that we have on the client-side (the virtual DOM tree) differs from the SSR HTML mark-up that we send to the client, Vue will reject the SSR HTML output, bail Client-side Hydration, and execute full CSR.

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.

essentially diff -> compares

During the hydration process, Vue essentially `diff` your SSR HTML markup against the virtual DOM generated by the render function on the client-side. If any difference is found, meaning that the application that we have on the client-side (the virtual DOM tree) differs from the SSR HTML mark-up that we send to the client, Vue will reject the SSR HTML output, bail Client-side Hydration, and execute full CSR.

This is known as "Hydration Issue" and it is one of the main challenges you will face with SSR in MarkBind.

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.

Could add an alert box here highlighting that this comparison dosen't execute in production vue build. Rather, if there are any runtime errors resulting from hydration errors, then full csr is re-executed.

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.

in case anyone tests this with production builds

Conceptually, to prevent hydration issue, what we should always strive to achieve is a "universal application".

It is not difficult to achieve a "universal application" per-se because we merely have to ensure two things:
1) the state data are the same between client-side and server-side.

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.

state data -> initial state

1) the state data are the same between client-side and server-side.
2) after compiling and rendering the Vue page application, the SSR HTML mark-up is not modified.

However, beyond achieving a "universal application", there are also some more specific rules that we should adhere to, so that we do not run into hydration issue:

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.

Slight reorganisation since both are actually html spec issues:

However

there are also some more specific rules that we should adhere to -> note that the HTML spec should be adhered to. Some common mistakes are as such:

  • Having block-level elements within <p> tag
  • Having unknown ...

- Do not violate HTML spec as much as possible (e.g. having block-level elements within `<p>` tag).
- Having unknown HTML elements within our Vue application during compilation/rendering (though this can be easily resolved by adding `v-pre` to the unknown element, so that Vue will ignore that element during compilation).

Note that the list only included the common causes of hydration issue that MarkBind developers have ran into. There may be other causes of hydration issue that are not listed here (although unlikely).

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.

Could also add:

If you are unsure what elements are allowed within other elements, or what constitutes invalid HTML in general, a good resource to reference would be the [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/span)

Sign up for freeto 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

@wxwxwxwx9@ang-zeyu@jonahtanjz
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Update Developer Guide on SSR by wxwxwxwx9 · Pull Request #1570 · MarkBind/markbind · GitHub
Skip to content

Update Developer Guide on SSR - #1570

Merged
jonahtanjz merged 4 commits into
MarkBind:masterfrom
wxwxwxwx9:ssr-dev-guide
Jun 3, 2021
Merged

Update Developer Guide on SSR#1570
jonahtanjz merged 4 commits into
MarkBind:masterfrom
wxwxwxwx9:ssr-dev-guide

Conversation

@wxwxwxwx9

@wxwxwxwx9wxwxwxwx9 commented May 30, 2021

Copy link
Copy Markdown
Contributor

What is the purpose of this pull request?

  • Documentation update
  • Bug fix
  • Feature addition or enhancement
  • Code maintenance
  • Others, please explain:

With the SSR implementation in #1534, we should also update the developer guide to let contributors know what they should be aware of (regarding SSR) when making contributions to MarkBind.

Overview of changes:
Added a new section for SSR under Design in the developer guide.

Anything you'd like to highlight / discuss:

  • Whether the content is enough/appropriate
  • Whether the layout of the information is alright
  • Suggestions to improve the readability
  • Concept accuracy
  • The wordings/phrasings

Testing instructions:
NIL

Proposed commit message: (wrap lines at 72 characters)
Update Developer Guide on SSR.

There are a few important information that contributors should
take note of regarding SSR (especially hydration issues).

Let's update the developer guide to include those information.


Checklist: ☑️

  • Updated the documentation for feature additions and enhancements
  • Added tests for bug fixes or features
  • Linked all related issues
  • No blatantly unrelated changes
  • Pinged someone for a review!

@jonahtanjzjonahtanjz left a comment

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.

Good job @wxwxwxwx9 👍 I feel it's clear and detailed. Thanks for working on this. LGTM!

@jonahtanjzjonahtanjz added this to the v3.0 milestone Jun 3, 2021
@jonahtanjz
jonahtanjz merged commit fa3fe71 into MarkBind:masterJun 3, 2021

@ang-zeyuang-zeyu left a comment

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.

Sorry for the late review!

This generally looks good to me as well 👍

Several small suggestions we can deal with later:


SSR and Client-side Hydration are 2 concepts that go hand-in-hand. Essentially, once we produce the static HTML via SSR and send it over to the client-side, Vue on the client-side will execute what is known as Client-side Hydration on the static HTML.

During the hydration process, Vue essentially `diff` your SSR HTML markup against the virtual DOM generated by the render function on the client-side. If any difference is found, meaning that the application that we have on the client-side (the virtual DOM tree) differs from the SSR HTML mark-up that we send to the client, Vue will reject the SSR HTML output, bail Client-side Hydration, and execute full CSR.

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.

essentially diff -> compares

During the hydration process, Vue essentially `diff` your SSR HTML markup against the virtual DOM generated by the render function on the client-side. If any difference is found, meaning that the application that we have on the client-side (the virtual DOM tree) differs from the SSR HTML mark-up that we send to the client, Vue will reject the SSR HTML output, bail Client-side Hydration, and execute full CSR.

This is known as "Hydration Issue" and it is one of the main challenges you will face with SSR in MarkBind.

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.

Could add an alert box here highlighting that this comparison dosen't execute in production vue build. Rather, if there are any runtime errors resulting from hydration errors, then full csr is re-executed.

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.

in case anyone tests this with production builds

Conceptually, to prevent hydration issue, what we should always strive to achieve is a "universal application".

It is not difficult to achieve a "universal application" per-se because we merely have to ensure two things:
1) the state data are the same between client-side and server-side.

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.

state data -> initial state

1) the state data are the same between client-side and server-side.
2) after compiling and rendering the Vue page application, the SSR HTML mark-up is not modified.

However, beyond achieving a "universal application", there are also some more specific rules that we should adhere to, so that we do not run into hydration issue:

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.

Slight reorganisation since both are actually html spec issues:

However

there are also some more specific rules that we should adhere to -> note that the HTML spec should be adhered to. Some common mistakes are as such:

  • Having block-level elements within <p> tag
  • Having unknown ...

- Do not violate HTML spec as much as possible (e.g. having block-level elements within `<p>` tag).
- Having unknown HTML elements within our Vue application during compilation/rendering (though this can be easily resolved by adding `v-pre` to the unknown element, so that Vue will ignore that element during compilation).

Note that the list only included the common causes of hydration issue that MarkBind developers have ran into. There may be other causes of hydration issue that are not listed here (although unlikely).

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.

Could also add:

If you are unsure what elements are allowed within other elements, or what constitutes invalid HTML in general, a good resource to reference would be the [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/span)

Sign up for freeto 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

@wxwxwxwx9@ang-zeyu@jonahtanjz
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); Update Developer Guide on SSR by wxwxwxwx9 · Pull Request #1570 · MarkBind/markbind · GitHub
Skip to content

Update Developer Guide on SSR - #1570

Merged
jonahtanjz merged 4 commits into
MarkBind:masterfrom
wxwxwxwx9:ssr-dev-guide
Jun 3, 2021
Merged

Update Developer Guide on SSR#1570
jonahtanjz merged 4 commits into
MarkBind:masterfrom
wxwxwxwx9:ssr-dev-guide

Conversation

@wxwxwxwx9

@wxwxwxwx9wxwxwxwx9 commented May 30, 2021

Copy link
Copy Markdown
Contributor

What is the purpose of this pull request?

  • Documentation update
  • Bug fix
  • Feature addition or enhancement
  • Code maintenance
  • Others, please explain:

With the SSR implementation in #1534, we should also update the developer guide to let contributors know what they should be aware of (regarding SSR) when making contributions to MarkBind.

Overview of changes:
Added a new section for SSR under Design in the developer guide.

Anything you'd like to highlight / discuss:

  • Whether the content is enough/appropriate
  • Whether the layout of the information is alright
  • Suggestions to improve the readability
  • Concept accuracy
  • The wordings/phrasings

Testing instructions:
NIL

Proposed commit message: (wrap lines at 72 characters)
Update Developer Guide on SSR.

There are a few important information that contributors should
take note of regarding SSR (especially hydration issues).

Let's update the developer guide to include those information.


Checklist: ☑️

  • Updated the documentation for feature additions and enhancements
  • Added tests for bug fixes or features
  • Linked all related issues
  • No blatantly unrelated changes
  • Pinged someone for a review!

@jonahtanjzjonahtanjz left a comment

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.

Good job @wxwxwxwx9 👍 I feel it's clear and detailed. Thanks for working on this. LGTM!

@jonahtanjzjonahtanjz added this to the v3.0 milestone Jun 3, 2021
@jonahtanjz
jonahtanjz merged commit fa3fe71 into MarkBind:masterJun 3, 2021

@ang-zeyuang-zeyu left a comment

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.

Sorry for the late review!

This generally looks good to me as well 👍

Several small suggestions we can deal with later:


SSR and Client-side Hydration are 2 concepts that go hand-in-hand. Essentially, once we produce the static HTML via SSR and send it over to the client-side, Vue on the client-side will execute what is known as Client-side Hydration on the static HTML.

During the hydration process, Vue essentially `diff` your SSR HTML markup against the virtual DOM generated by the render function on the client-side. If any difference is found, meaning that the application that we have on the client-side (the virtual DOM tree) differs from the SSR HTML mark-up that we send to the client, Vue will reject the SSR HTML output, bail Client-side Hydration, and execute full CSR.

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.

essentially diff -> compares

During the hydration process, Vue essentially `diff` your SSR HTML markup against the virtual DOM generated by the render function on the client-side. If any difference is found, meaning that the application that we have on the client-side (the virtual DOM tree) differs from the SSR HTML mark-up that we send to the client, Vue will reject the SSR HTML output, bail Client-side Hydration, and execute full CSR.

This is known as "Hydration Issue" and it is one of the main challenges you will face with SSR in MarkBind.

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.

Could add an alert box here highlighting that this comparison dosen't execute in production vue build. Rather, if there are any runtime errors resulting from hydration errors, then full csr is re-executed.

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.

in case anyone tests this with production builds

Conceptually, to prevent hydration issue, what we should always strive to achieve is a "universal application".

It is not difficult to achieve a "universal application" per-se because we merely have to ensure two things:
1) the state data are the same between client-side and server-side.

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.

state data -> initial state

1) the state data are the same between client-side and server-side.
2) after compiling and rendering the Vue page application, the SSR HTML mark-up is not modified.

However, beyond achieving a "universal application", there are also some more specific rules that we should adhere to, so that we do not run into hydration issue:

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.

Slight reorganisation since both are actually html spec issues:

However

there are also some more specific rules that we should adhere to -> note that the HTML spec should be adhered to. Some common mistakes are as such:

  • Having block-level elements within <p> tag
  • Having unknown ...

- Do not violate HTML spec as much as possible (e.g. having block-level elements within `<p>` tag).
- Having unknown HTML elements within our Vue application during compilation/rendering (though this can be easily resolved by adding `v-pre` to the unknown element, so that Vue will ignore that element during compilation).

Note that the list only included the common causes of hydration issue that MarkBind developers have ran into. There may be other causes of hydration issue that are not listed here (although unlikely).

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.

Could also add:

If you are unsure what elements are allowed within other elements, or what constitutes invalid HTML in general, a good resource to reference would be the [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/span)

Sign up for freeto 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

@wxwxwxwx9@ang-zeyu@jonahtanjz