marko 5.21.2 → 5.21.5
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +6 -6
- package/bin/markoc.js +13 -1
- package/dist/core-tags/core/await/reorderer-renderer.js +26 -6
- package/dist/runtime/RenderResult.js +7 -7
- package/dist/runtime/components/Component.js +129 -129
- package/dist/runtime/components/ComponentDef.js +25 -25
- package/dist/runtime/components/ComponentsContext.js +8 -8
- package/dist/runtime/components/GlobalComponentsContext.js +4 -4
- package/dist/runtime/components/KeySequence.js +3 -3
- package/dist/runtime/components/ServerComponent.js +13 -13
- package/dist/runtime/components/State.js +25 -25
- package/dist/runtime/components/attach-detach.js +8 -8
- package/dist/runtime/components/beginComponent/index-browser.js +2 -2
- package/dist/runtime/components/beginComponent/index.js +7 -7
- package/dist/runtime/components/defineComponent.js +5 -5
- package/dist/runtime/components/dom-data.js +3 -3
- package/dist/runtime/components/endComponent/index.js +2 -2
- package/dist/runtime/components/entry/index-browser.js +4 -4
- package/dist/runtime/components/entry/index.js +15 -15
- package/dist/runtime/components/event-delegation.js +10 -10
- package/dist/runtime/components/init-components/index-browser.js +34 -34
- package/dist/runtime/components/registry/index-browser.js +7 -7
- package/dist/runtime/components/registry/index.js +2 -2
- package/dist/runtime/components/renderer.js +26 -26
- package/dist/runtime/components/update-manager.js +10 -10
- package/dist/runtime/components/util/index-browser.js +17 -17
- package/dist/runtime/components/util/index.js +9 -9
- package/dist/runtime/createOut.js +1 -1
- package/dist/runtime/dom-insert.js +5 -5
- package/dist/runtime/helpers/_change-case.js +2 -2
- package/dist/runtime/helpers/dynamic-tag.js +7 -7
- package/dist/runtime/helpers/style-value.js +1 -1
- package/dist/runtime/html/AsyncStream.js +20 -20
- package/dist/runtime/html/BufferedWriter.js +2 -2
- package/dist/runtime/html/StringWriter.js +1 -1
- package/dist/runtime/html/helpers/attr.js +1 -1
- package/dist/runtime/html/helpers/data-marko.js +4 -4
- package/dist/runtime/html/helpers/escape-quotes.js +1 -1
- package/dist/runtime/html/helpers/escape-xml.js +1 -1
- package/dist/runtime/html/helpers/props-script.js +1 -1
- package/dist/runtime/html/index.js +1 -1
- package/dist/runtime/renderable.js +4 -4
- package/dist/runtime/setImmediate/index-browser.js +1 -1
- package/dist/runtime/setImmediate/index-worker.js +2 -2
- package/dist/runtime/setImmediate/index.js +2 -2
- package/dist/runtime/vdom/AsyncVDOMBuilder.js +28 -28
- package/dist/runtime/vdom/VDocumentFragment.js +1 -1
- package/dist/runtime/vdom/VElement.js +11 -11
- package/dist/runtime/vdom/VFragment.js +3 -3
- package/dist/runtime/vdom/VNode.js +4 -4
- package/dist/runtime/vdom/hot-reload.js +15 -15
- package/dist/runtime/vdom/index.js +1 -1
- package/dist/runtime/vdom/morphdom/fragment.js +2 -2
- package/dist/runtime/vdom/morphdom/helpers.js +4 -4
- package/dist/runtime/vdom/morphdom/index.js +28 -28
- package/dist/runtime/vdom/morphdom/specialElHandlers.js +1 -1
- package/docs/10-awesome-marko-features.md +3 -4
- package/docs/class-components.md +5 -5
- package/docs/cloudflare-workers.md +4 -6
- package/docs/compiler.md +13 -2
- package/docs/core-tags.md +9 -1
- package/docs/express.md +2 -2
- package/docs/http.md +2 -2
- package/docs/koa.md +2 -2
- package/docs/marko-5-upgrade.md +3 -4
- package/docs/marko-vs-react.md +7 -7
- package/docs/redux.md +6 -6
- package/docs/rendering.md +48 -41
- package/docs/troubleshooting-streaming.md +5 -5
- package/docs/webpack.md +9 -9
- package/package.json +3 -3
- package/src/core-tags/core/await/reorderer-renderer.js +27 -7
- package/docs/server-side-rendering.md +0 -144
@@ -5,7 +5,7 @@ var registry = require("../components/registry");
|
|
5
5
|
var updateManager = require("../components/update-manager");
|
6
6
|
|
7
7
|
var createTemplate = runtime.t;
|
8
|
-
var createComponent = registry.
|
8
|
+
var createComponent = registry._Q_;
|
9
9
|
var registered = {};
|
10
10
|
var queue;
|
11
11
|
|
@@ -31,36 +31,36 @@ runtime.t = function (typeName) {
|
|
31
31
|
}
|
32
32
|
|
33
33
|
queue.push(function () {
|
34
|
-
var newProto = registry.
|
34
|
+
var newProto = registry.aw_(typeName).prototype;
|
35
35
|
instances.forEach(function (instance) {
|
36
36
|
if (hasLifecycleChanged(instance.__proto__, newProto)) {
|
37
|
-
var startNode = instance.
|
38
|
-
var endNode = instance.
|
37
|
+
var startNode = instance.L_.startNode;
|
38
|
+
var endNode = instance.L_.endNode;
|
39
39
|
var parentNode = startNode.parentNode;
|
40
40
|
var curNode;
|
41
41
|
|
42
42
|
instance.bY_ = true;
|
43
|
-
instance._a_();
|
44
43
|
instance._b_();
|
44
|
+
instance._c_();
|
45
45
|
|
46
|
-
if (instance.
|
47
|
-
instance.
|
48
|
-
instance.
|
46
|
+
if (instance.M_) {
|
47
|
+
instance.M_.removeAllListeners();
|
48
|
+
instance.M_ = null;
|
49
49
|
}
|
50
50
|
|
51
51
|
while ((curNode = startNode.nextSibling) !== endNode) {
|
52
|
-
util.
|
52
|
+
util.E_(curNode);
|
53
53
|
parentNode.removeChild(curNode);
|
54
54
|
}
|
55
55
|
|
56
56
|
instance.bY_ = false;
|
57
|
-
instance.
|
57
|
+
instance.S_ = false;
|
58
58
|
}
|
59
59
|
|
60
60
|
instance.__proto__ = newProto;
|
61
|
-
instance.
|
62
|
-
instance.
|
63
|
-
afterInsert(instance.
|
61
|
+
instance._q_(
|
62
|
+
instance.R_, false).
|
63
|
+
afterInsert(instance.Y_);
|
64
64
|
});
|
65
65
|
});
|
66
66
|
}
|
@@ -74,7 +74,7 @@ runtime.t = function (typeName) {
|
|
74
74
|
}
|
75
75
|
};
|
76
76
|
|
77
|
-
registry.
|
77
|
+
registry._Q_ = function (typeName, id) {
|
78
78
|
var template = registered[typeName];
|
79
79
|
var instance = createComponent(typeName, id);
|
80
80
|
|
@@ -108,7 +108,7 @@ function hasLifecycleChanged(oldProto, newProto) {
|
|
108
108
|
}
|
109
109
|
|
110
110
|
function batchUpdate() {
|
111
|
-
updateManager.
|
111
|
+
updateManager._p_(function () {
|
112
112
|
var pending = queue;
|
113
113
|
queue = undefined;
|
114
114
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
"use strict";var helpers = require("./helpers");
|
2
|
-
var insertBefore = helpers.
|
2
|
+
var insertBefore = helpers.aH_;
|
3
3
|
|
4
4
|
var fragmentPrototype = {
|
5
5
|
nodeType: 12,
|
@@ -91,5 +91,5 @@ function beginFragmentNode(startNode, parentNode) {
|
|
91
91
|
return fragment;
|
92
92
|
}
|
93
93
|
|
94
|
-
exports.
|
94
|
+
exports.ap_ = createFragmentNode;
|
95
95
|
exports.c__ = beginFragmentNode;
|
@@ -35,8 +35,8 @@ function removeChild(node) {
|
|
35
35
|
node.parentNode.removeChild(node);
|
36
36
|
}
|
37
37
|
|
38
|
-
exports.
|
39
|
-
exports.
|
38
|
+
exports.aH_ = insertBefore;
|
39
|
+
exports.aI_ = insertAfter;
|
40
40
|
exports.bT_ = nextSibling;
|
41
|
-
exports.
|
42
|
-
exports.
|
41
|
+
exports._s_ = firstChild;
|
42
|
+
exports.aJ_ = removeChild;
|
@@ -2,11 +2,11 @@
|
|
2
2
|
var specialElHandlers = require("./specialElHandlers");
|
3
3
|
var KeySequence = require("../../components/KeySequence");
|
4
4
|
var componentsUtil = require("../../components/util");
|
5
|
-
var existingComponentLookup = componentsUtil.
|
6
|
-
var destroyNodeRecursive = componentsUtil.
|
5
|
+
var existingComponentLookup = componentsUtil.D_;
|
6
|
+
var destroyNodeRecursive = componentsUtil.E_;
|
7
7
|
var addComponentRootToKeyedElements =
|
8
|
-
componentsUtil.
|
9
|
-
var normalizeComponentKey = componentsUtil.
|
8
|
+
componentsUtil.aq_;
|
9
|
+
var normalizeComponentKey = componentsUtil.aF_;
|
10
10
|
var VElement = require("../vdom").bb_;
|
11
11
|
var virtualizeElement = VElement.bO_;
|
12
12
|
var morphAttrs = VElement.bP_;
|
@@ -14,17 +14,17 @@ var eventDelegation = require("../../components/event-delegation");
|
|
14
14
|
var fragment = require("./fragment");
|
15
15
|
var helpers = require("./helpers");
|
16
16
|
var domData = require("../../components/dom-data");
|
17
|
-
var keysByDOMNode = domData.
|
18
|
-
var componentByDOMNode = domData.
|
19
|
-
var vElementByDOMNode = domData.
|
20
|
-
var detachedByDOMNode = domData.
|
17
|
+
var keysByDOMNode = domData.ah_;
|
18
|
+
var componentByDOMNode = domData.F_;
|
19
|
+
var vElementByDOMNode = domData.af_;
|
20
|
+
var detachedByDOMNode = domData.ag_;
|
21
21
|
|
22
|
-
var insertBefore = helpers.
|
23
|
-
var insertAfter = helpers.
|
22
|
+
var insertBefore = helpers.aH_;
|
23
|
+
var insertAfter = helpers.aI_;
|
24
24
|
var nextSibling = helpers.bT_;
|
25
|
-
var firstChild = helpers.
|
26
|
-
var removeChild = helpers.
|
27
|
-
var createFragmentNode = fragment.
|
25
|
+
var firstChild = helpers._s_;
|
26
|
+
var removeChild = helpers.aJ_;
|
27
|
+
var createFragmentNode = fragment.ap_;
|
28
28
|
var beginFragmentNode = fragment.c__;
|
29
29
|
|
30
30
|
var ELEMENT_NODE = 1;
|
@@ -52,7 +52,7 @@ function caseInsensitiveCompare(a, b) {
|
|
52
52
|
|
53
53
|
function onNodeAdded(node, componentsContext) {
|
54
54
|
if (node.nodeType === ELEMENT_NODE) {
|
55
|
-
eventDelegation.
|
55
|
+
eventDelegation.ac_(node, componentsContext);
|
56
56
|
}
|
57
57
|
}
|
58
58
|
|
@@ -105,7 +105,7 @@ function morphdom(fromNode, toNode, host, componentsContext) {
|
|
105
105
|
ownerComponent,
|
106
106
|
parentComponent)
|
107
107
|
{
|
108
|
-
var rootNode = component.
|
108
|
+
var rootNode = component.L_ = insertBefore(
|
109
109
|
createFragmentNode(),
|
110
110
|
referenceNode,
|
111
111
|
referenceNodeParentEl);
|
@@ -127,7 +127,7 @@ function morphdom(fromNode, toNode, host, componentsContext) {
|
|
127
127
|
}
|
128
128
|
|
129
129
|
function morphComponent(component, vComponent) {
|
130
|
-
morphChildren(component.
|
130
|
+
morphChildren(component.L_, vComponent, component);
|
131
131
|
}
|
132
132
|
|
133
133
|
var detachedNodes = [];
|
@@ -148,7 +148,7 @@ function morphdom(fromNode, toNode, host, componentsContext) {
|
|
148
148
|
|
149
149
|
function morphChildren(fromNode, toNode, parentComponent) {
|
150
150
|
var curFromNodeChild = firstChild(fromNode);
|
151
|
-
var curToNodeChild = toNode.
|
151
|
+
var curToNodeChild = toNode._s_;
|
152
152
|
|
153
153
|
var curToNodeKey;
|
154
154
|
var curFromNodeKey;
|
@@ -171,7 +171,7 @@ function morphdom(fromNode, toNode, host, componentsContext) {
|
|
171
171
|
curFromNodeChild = nextSibling(curFromNodeChild);
|
172
172
|
}
|
173
173
|
|
174
|
-
var ownerComponent = curToNodeChild.
|
174
|
+
var ownerComponent = curToNodeChild.aC_ || parentComponent;
|
175
175
|
var referenceComponent;
|
176
176
|
|
177
177
|
if (curToNodeType === COMPONENT_NODE) {
|
@@ -182,7 +182,7 @@ function morphdom(fromNode, toNode, host, componentsContext) {
|
|
182
182
|
{
|
183
183
|
if (isHydrate === true) {
|
184
184
|
var rootNode = beginFragmentNode(curFromNodeChild, fromNode);
|
185
|
-
component.
|
185
|
+
component.L_ = rootNode;
|
186
186
|
componentByDOMNode.set(rootNode, component);
|
187
187
|
|
188
188
|
if (ownerComponent && curToNodeKey) {
|
@@ -215,17 +215,17 @@ function morphdom(fromNode, toNode, host, componentsContext) {
|
|
215
215
|
|
216
216
|
}
|
217
217
|
} else {
|
218
|
-
if (matchingFromComponent.
|
218
|
+
if (matchingFromComponent.L_ !== curFromNodeChild) {
|
219
219
|
if (
|
220
220
|
curFromNodeChild && (
|
221
221
|
fromComponent = componentByDOMNode.get(curFromNodeChild)) &&
|
222
|
-
globalComponentsContext.
|
222
|
+
globalComponentsContext._V_[
|
223
223
|
fromComponent.id] ===
|
224
224
|
undefined)
|
225
225
|
{
|
226
226
|
// The component associated with the current real DOM node was not rendered
|
227
227
|
// so we should just remove it out of the real DOM by destroying it
|
228
|
-
curFromNodeChild = nextSibling(fromComponent.
|
228
|
+
curFromNodeChild = nextSibling(fromComponent.L_);
|
229
229
|
destroyComponent(fromComponent);
|
230
230
|
continue;
|
231
231
|
}
|
@@ -233,7 +233,7 @@ function morphdom(fromNode, toNode, host, componentsContext) {
|
|
233
233
|
// We need to move the existing component into
|
234
234
|
// the correct location
|
235
235
|
insertBefore(
|
236
|
-
matchingFromComponent.
|
236
|
+
matchingFromComponent.L_,
|
237
237
|
curFromNodeChild,
|
238
238
|
fromNode);
|
239
239
|
|
@@ -267,7 +267,7 @@ function morphdom(fromNode, toNode, host, componentsContext) {
|
|
267
267
|
// up elements
|
268
268
|
curToNodeKey = (
|
269
269
|
keySequences[referenceComponent.id] || (
|
270
|
-
keySequences[referenceComponent.id] = new KeySequence())).
|
270
|
+
keySequences[referenceComponent.id] = new KeySequence()))._M_(
|
271
271
|
curToNodeKey);
|
272
272
|
|
273
273
|
if (curFromNodeChild) {
|
@@ -502,7 +502,7 @@ function morphdom(fromNode, toNode, host, componentsContext) {
|
|
502
502
|
curFromNodeChild = fromNextSibling;
|
503
503
|
|
504
504
|
if (
|
505
|
-
!globalComponentsContext.
|
505
|
+
!globalComponentsContext._V_[fromComponent.id])
|
506
506
|
{
|
507
507
|
destroyComponent(fromComponent);
|
508
508
|
}
|
@@ -626,7 +626,7 @@ function morphdom(fromNode, toNode, host, componentsContext) {
|
|
626
626
|
if (fromComponent = componentByDOMNode.get(curFromNodeChild)) {
|
627
627
|
curFromNodeChild = fromNextSibling;
|
628
628
|
if (
|
629
|
-
!globalComponentsContext.
|
629
|
+
!globalComponentsContext._V_[fromComponent.id])
|
630
630
|
{
|
631
631
|
destroyComponent(fromComponent);
|
632
632
|
}
|
@@ -642,7 +642,7 @@ function morphdom(fromNode, toNode, host, componentsContext) {
|
|
642
642
|
referenceComponent = parentComponent;
|
643
643
|
} else {
|
644
644
|
referenceComponent =
|
645
|
-
curVFromNodeChild && curVFromNodeChild.
|
645
|
+
curVFromNodeChild && curVFromNodeChild.aC_;
|
646
646
|
}
|
647
647
|
|
648
648
|
detachNode(curFromNodeChild, fromNode, referenceComponent);
|
@@ -698,7 +698,7 @@ function morphdom(fromNode, toNode, host, componentsContext) {
|
|
698
698
|
detachedFromComponent !== true && detachedFromComponent);
|
699
699
|
|
700
700
|
|
701
|
-
if (eventDelegation.
|
701
|
+
if (eventDelegation._a_(node) != false) {
|
702
702
|
removeChild(node);
|
703
703
|
}
|
704
704
|
}
|
@@ -243,9 +243,8 @@ $ const searchResultsPromise = searchService.performSearch(keywords);
|
|
243
243
|
Can’t decide if you want to do server-side rendering or client-side rendering?
|
244
244
|
Why are we even talking about this in 2017? It doesn’t matter. Seriously, just
|
245
245
|
do both. Marko makes this a no-brainer since you can render a Marko template
|
246
|
-
directly to a stream (oh, and Marko will
|
247
|
-
components
|
248
|
-
server when the page loads in the browser):
|
246
|
+
directly to a stream (oh, and Marko will automatically mount UI
|
247
|
+
components rendered on the server when the page loads in the browser):
|
249
248
|
|
250
249
|
```js
|
251
250
|
require("@marko/compiler/register"); // require .marko files!
|
@@ -289,4 +288,4 @@ Coming soon: auto correction and autonomous coding
|
|
289
288
|
|
290
289
|
---
|
291
290
|
|
292
|
-
_Cover image
|
291
|
+
[_Cover image from Wikipedia_](https://commons.wikimedia.org/wiki/File:Amanhecer_no_Hercules_--.jpg)
|
package/docs/class-components.md
CHANGED
@@ -28,7 +28,7 @@ Marko makes it easy to keep your component’s class and styles next to the HTML
|
|
28
28
|
|
29
29
|
## Server-side rendering
|
30
30
|
|
31
|
-
A UI component can be rendered on the server or in the browser, but stateful component instances will be automatically mounted to the DOM in the browser for both. If a UI component tree is rendered on the server, then Marko will recreate the UI component tree in the browser with no extra code required. For more details, please see [
|
31
|
+
A UI component can be rendered on the server or in the browser, but stateful component instances will be automatically mounted to the DOM in the browser for both. If a UI component tree is rendered on the server, then Marko will recreate the UI component tree in the browser with no extra code required. For more details, please see [Rendering](/docs/rendering/).
|
32
32
|
|
33
33
|
## Single-file components
|
34
34
|
|
@@ -107,7 +107,7 @@ counter/
|
|
107
107
|
In your `component.js` file, export the component’s class:
|
108
108
|
|
109
109
|
```js
|
110
|
-
|
110
|
+
export default class {
|
111
111
|
onCreate() {
|
112
112
|
this.state = {
|
113
113
|
count: 0
|
@@ -116,7 +116,7 @@ module.exports = class {
|
|
116
116
|
increment() {
|
117
117
|
this.state.count++;
|
118
118
|
}
|
119
|
-
}
|
119
|
+
}
|
120
120
|
```
|
121
121
|
|
122
122
|
In your `index.marko` file, you can reference methods from that class with `on-*` attributes:
|
@@ -141,7 +141,7 @@ And in your `style.css`, define the styles:
|
|
141
141
|
If you target browsers that does not support classes, a plain object of methods can be exported:
|
142
142
|
|
143
143
|
```js
|
144
|
-
|
144
|
+
export default {
|
145
145
|
onCreate: function () {
|
146
146
|
this.state = {
|
147
147
|
count: 0
|
@@ -214,7 +214,7 @@ class {
|
|
214
214
|
`component-browser.js`
|
215
215
|
|
216
216
|
```js
|
217
|
-
|
217
|
+
export default {
|
218
218
|
shout() {
|
219
219
|
alert(`My favorite number is ${this.number}!`);
|
220
220
|
}
|
@@ -5,21 +5,19 @@ project for a working example.
|
|
5
5
|
|
6
6
|
## Usage
|
7
7
|
|
8
|
-
When using Marko with [Cloudflare Workers](https://workers.cloudflare.com/)
|
8
|
+
When using Marko with [Cloudflare Workers](https://workers.cloudflare.com/), make sure that Marko is loaded with a `worker` [export condition](https://nodejs.org/api/packages.html#conditional-exports). Most bundlers support defining export conditions.
|
9
9
|
|
10
|
-
After that point
|
11
|
-
|
12
|
-
You can then simply respond with the returned stream.
|
10
|
+
After that point, imported `.marko` files will export a `.stream` method that returns a worker compatible [`ReadableStream`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream). You can then respond with that returned stream:
|
13
11
|
|
14
12
|
```js
|
15
|
-
import
|
13
|
+
import Template from "./index.marko";
|
16
14
|
|
17
15
|
addEventListener("fetch", event => {
|
18
16
|
event.respondWith(handleRequest(event.request));
|
19
17
|
});
|
20
18
|
|
21
19
|
async function handleRequest(request) {
|
22
|
-
return new Response(
|
20
|
+
return new Response(Template.stream(), {
|
23
21
|
headers: {
|
24
22
|
status: 200,
|
25
23
|
headers: { "content-type": "text/html;charset=UTF-8" }
|
package/docs/compiler.md
CHANGED
@@ -89,6 +89,17 @@ Default: false
|
|
89
89
|
|
90
90
|
Set to true to have the compiler provide the `ast` in it's output.
|
91
91
|
|
92
|
+
#### `stripTypes`
|
93
|
+
|
94
|
+
Type: `boolean|undefined`<br>
|
95
|
+
Default: undefined
|
96
|
+
|
97
|
+
Remove all typescript types from the output when `true`.
|
98
|
+
If the value is `undefined`, the default, the compiler will remove types if
|
99
|
+
the `output` option is not `source` or `migrate`.
|
100
|
+
|
101
|
+
For example to run migrations _and_ strip types you can set both `output: "migrate"` and `stripTypes: true`.
|
102
|
+
|
92
103
|
#### `runtimeId`
|
93
104
|
|
94
105
|
Type: `string`<br>
|
@@ -128,7 +139,7 @@ Whether source maps should be output with the compiled templates.
|
|
128
139
|
#### `meta`
|
129
140
|
|
130
141
|
Type: `boolean`<br>
|
131
|
-
Default: `false
|
142
|
+
Default: `false`
|
132
143
|
|
133
144
|
_Deprecated_. This option inlines the metadata in the output Javascript code. Metadata should be accessed instead from the `CompileResult`.
|
134
145
|
|
@@ -294,7 +305,7 @@ The hook will also receive a `types` object that matches the [@babel/types](http
|
|
294
305
|
Here is an example hook:
|
295
306
|
|
296
307
|
```js
|
297
|
-
|
308
|
+
export default (tag, types) => {
|
298
309
|
if (types.isStringLiteral(tag.node.name)) {
|
299
310
|
console.log(`Found a tag called ${tag.node.name.value}`);
|
300
311
|
tag.remove();
|
package/docs/core-tags.md
CHANGED
@@ -265,9 +265,17 @@ Optional attributes for `<await>`:
|
|
265
265
|
| ---------------: | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
266
266
|
| `timeout` | integer | An optional timeout. If reached, rejects the promise with a `TimeoutError`. |
|
267
267
|
| `name` | string | Improves debugging and ensures ordering with the `show-after` attribute. |
|
268
|
-
| `show-after` | string | Another `<await>` tag’s `name`.
|
268
|
+
| `show-after` | string | Another `<await>` tag’s `name`. Use with `client-reorder` to ensure that the current `<await>` will always render alongside or after the named `<await>`. |
|
269
269
|
| `client-reorder` | boolean | If true, anything after this `<await>` will be server-rendered before the Promise completes, then the fulfilled Promise’s result will be updated with client-side JavaScript. |
|
270
270
|
|
271
|
+
Regardless of these attributes, the promise is executed as eagerly as possible. The attributes control how to coordinate rendering with the rest of the page:
|
272
|
+
|
273
|
+
- `client-reorder` prevents `<await>` blocks from delaying the HTTP stream, at the expense of making their rendering rely on client-side JS. Useful for making non-critical page sections not block HTML streaming of important content.
|
274
|
+
|
275
|
+
- Using `show-after` with `client-reorder` ensures that the current `<await>` block will always render simultaneously with or after the named `<await>`. Useful for cutting down on [layout shift](https://web.dev/debug-layout-shifts/). `<@placeholder>`s can help fine-tune the user experience while loading.
|
276
|
+
|
277
|
+
- `timeout` is useful for limiting non-critical content from slowing down the rest of the page too much.
|
278
|
+
|
271
279
|
> **Pro Tip**: When using `timeout`, you can distinguish between `TimeoutError`s and promise rejections by checking the error’s `name`:
|
272
280
|
>
|
273
281
|
> ```marko
|
package/docs/express.md
CHANGED
@@ -30,14 +30,14 @@ By using `res.marko` you'll automatically have access to `req`, `res`, `app`, `a
|
|
30
30
|
```javascript
|
31
31
|
import express from "express";
|
32
32
|
import markoPlugin from "@marko/express";
|
33
|
-
import
|
33
|
+
import Template from "./template.marko";
|
34
34
|
|
35
35
|
const app = express();
|
36
36
|
|
37
37
|
app.use(markoPlugin()); //enable res.marko(template, data)
|
38
38
|
|
39
39
|
app.get("/", function (req, res) {
|
40
|
-
res.marko(
|
40
|
+
res.marko(Template, {
|
41
41
|
name: "Frank",
|
42
42
|
count: 30,
|
43
43
|
colors: ["red", "green", "blue"]
|
package/docs/http.md
CHANGED
@@ -7,13 +7,13 @@ project for a working example.
|
|
7
7
|
|
8
8
|
```js
|
9
9
|
import http from "http";
|
10
|
-
import
|
10
|
+
import Template from "./index.marko";
|
11
11
|
|
12
12
|
const port = 8080;
|
13
13
|
const server = http.createServer();
|
14
14
|
|
15
15
|
server.on("request", (req, res) => {
|
16
|
-
|
16
|
+
Template.render(
|
17
17
|
{
|
18
18
|
name: "Frank",
|
19
19
|
count: 30,
|
package/docs/koa.md
CHANGED
@@ -13,13 +13,13 @@ npm install koa marko --save
|
|
13
13
|
|
14
14
|
```javascript
|
15
15
|
import Koa from "koa";
|
16
|
-
import
|
16
|
+
import Template from "./index.marko";
|
17
17
|
|
18
18
|
const app = new Koa();
|
19
19
|
|
20
20
|
app.use((ctx, next) => {
|
21
21
|
ctx.type = "html";
|
22
|
-
ctx.body =
|
22
|
+
ctx.body = Template.stream({
|
23
23
|
name: "Frank",
|
24
24
|
count: 30,
|
25
25
|
colors: ["red", "green", "blue"]
|
package/docs/marko-5-upgrade.md
CHANGED
@@ -52,14 +52,13 @@ or
|
|
52
52
|
yarn upgrade marko@^5
|
53
53
|
```
|
54
54
|
|
55
|
-
> **Note**: Marko 5 has changed to using ES Modules. This means if you are using CJS modules to `require` a Marko template you will need to use the default property exported.
|
55
|
+
> **Note**: Marko 5 has changed to using ES Modules. This means if you are using CJS modules to `require` a Marko template you will need to use the `.default` property exported.
|
56
56
|
>
|
57
57
|
> ```js
|
58
58
|
> const template = require("./template.marko");
|
59
|
-
>
|
60
|
-
> // Should become
|
59
|
+
> // …should become:
|
61
60
|
> const template = require("./template.marko").default;
|
62
61
|
>
|
63
|
-
> // If
|
62
|
+
> // If already using ES Modules, things remain the same:
|
64
63
|
> import template from "./template.marko";
|
65
64
|
> ```
|
package/docs/marko-vs-react.md
CHANGED
@@ -617,20 +617,20 @@ style.less {
|
|
617
617
|
|
618
618
|
### API
|
619
619
|
|
620
|
-
Marko compiles
|
621
|
-
|
620
|
+
Marko compiles components to JavaScript modules that export their rendering APIs,
|
621
|
+
as shown below:
|
622
622
|
|
623
623
|
```js
|
624
|
-
|
625
|
-
|
626
|
-
.appendTo(document.body);
|
624
|
+
import Greeting from "./components/greeting.marko";
|
625
|
+
Greeting.renderSync({ name: "Frank" }).appendTo(document.body);
|
627
626
|
```
|
628
627
|
|
629
|
-
The same UI component can
|
628
|
+
The same UI component can render to streams, such as a writable HTTP
|
630
629
|
response stream:
|
631
630
|
|
632
631
|
```js
|
633
|
-
|
632
|
+
import Greeting from "./components/greeting.marko";
|
633
|
+
Greeting.render({ name: "John" }, res);
|
634
634
|
```
|
635
635
|
|
636
636
|
> The users of a Marko UI component do not need to know that the component was
|
package/docs/redux.md
CHANGED
@@ -17,7 +17,7 @@ The partial code below shows how a Marko UI component can connect to a Redux sto
|
|
17
17
|
### `counter.marko`
|
18
18
|
|
19
19
|
```marko
|
20
|
-
import store from './store';
|
20
|
+
import store from './store.js';
|
21
21
|
|
22
22
|
class {
|
23
23
|
onMount () {
|
@@ -40,13 +40,13 @@ class {
|
|
40
40
|
### `reducer.js`
|
41
41
|
|
42
42
|
```js
|
43
|
-
|
43
|
+
export default function (state, action) {
|
44
44
|
state = state || { value: 0 };
|
45
45
|
|
46
46
|
// Additional reducer logic here…
|
47
47
|
|
48
48
|
return state;
|
49
|
-
}
|
49
|
+
}
|
50
50
|
```
|
51
51
|
|
52
52
|
### `store.js`
|
@@ -54,8 +54,8 @@ module.exports = function (state, action) {
|
|
54
54
|
In `counter.marko`, the imported store module exports a Redux store created with the following code:
|
55
55
|
|
56
56
|
```js
|
57
|
-
|
58
|
-
|
57
|
+
import redux from "redux";
|
58
|
+
import counter from "./reducer.js";
|
59
59
|
|
60
|
-
|
60
|
+
export default redux.createStore(counter);
|
61
61
|
```
|