marko 5.37.0 → 6.0.0-3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/common/attr-tag.d.ts +8 -0
- package/dist/common/compat-meta.d.ts +2 -0
- package/dist/common/for.d.ts +5 -0
- package/dist/common/helpers.d.ts +7 -0
- package/dist/common/meta.d.ts +2 -0
- package/dist/common/types.d.ts +105 -0
- package/dist/debug/dom.js +2112 -0
- package/dist/debug/dom.mjs +2089 -0
- package/dist/debug/html.js +2740 -0
- package/dist/debug/html.mjs +2663 -0
- package/dist/dom/abort-signal.d.ts +3 -0
- package/dist/dom/compat.d.ts +20 -0
- package/dist/dom/control-flow.d.ts +14 -0
- package/dist/dom/controllable.d.ts +12 -0
- package/dist/dom/dom.d.ts +19 -0
- package/dist/dom/event.d.ts +4 -0
- package/dist/dom/parse-html.d.ts +5 -0
- package/dist/dom/queue.d.ts +10 -0
- package/dist/dom/reconcile.d.ts +2 -0
- package/dist/dom/renderer.d.ts +21 -0
- package/dist/dom/resolve-cursor-position.d.ts +1 -0
- package/dist/dom/resume.d.ts +9 -0
- package/dist/dom/schedule.d.ts +2 -0
- package/dist/dom/scope.d.ts +7 -0
- package/dist/dom/signals.d.ts +39 -0
- package/dist/dom/template.d.ts +3 -0
- package/dist/dom/walker.d.ts +4 -0
- package/dist/dom.d.ts +15 -0
- package/dist/dom.js +1370 -0
- package/dist/dom.mjs +1350 -0
- package/dist/html/attrs.d.ts +14 -0
- package/dist/html/compat.d.ts +14 -0
- package/dist/html/content.d.ts +5 -0
- package/dist/html/dynamic-tag.d.ts +12 -0
- package/dist/html/for.d.ts +4 -0
- package/dist/html/inlined-runtimes.d.ts +2 -0
- package/dist/html/serializer.d.ts +14 -0
- package/dist/html/template.d.ts +3 -0
- package/dist/html/writer.d.ts +114 -0
- package/dist/html.d.ts +9 -0
- package/dist/html.js +1818 -0
- package/dist/html.mjs +1744 -0
- package/dist/translator/core/attrs.d.ts +3 -0
- package/dist/translator/core/client.d.ts +14 -0
- package/dist/translator/core/const.d.ts +3 -0
- package/dist/translator/core/debug.d.ts +3 -0
- package/dist/translator/core/define.d.ts +3 -0
- package/dist/translator/core/effect.d.ts +3 -0
- package/dist/translator/core/export.d.ts +3 -0
- package/dist/translator/core/for.d.ts +67 -0
- package/dist/translator/core/html-comment.d.ts +12 -0
- package/dist/translator/core/html-script.d.ts +9 -0
- package/dist/translator/core/html-style.d.ts +9 -0
- package/dist/translator/core/id.d.ts +3 -0
- package/dist/translator/core/if.d.ts +53 -0
- package/dist/translator/core/import.d.ts +3 -0
- package/dist/translator/core/index.d.ts +152 -0
- package/dist/translator/core/let.d.ts +8 -0
- package/dist/translator/core/lifecycle.d.ts +10 -0
- package/dist/translator/core/log.d.ts +3 -0
- package/dist/translator/core/return.d.ts +6 -0
- package/dist/translator/core/script.d.ts +3 -0
- package/dist/translator/core/server.d.ts +14 -0
- package/dist/translator/core/static.d.ts +14 -0
- package/dist/translator/core/style.d.ts +3 -0
- package/dist/translator/index.d.ts +201 -0
- package/dist/translator/index.js +9143 -489
- package/dist/translator/util/assert.d.ts +3 -0
- package/dist/translator/util/binding-has-downstream-expressions.d.ts +2 -0
- package/dist/translator/util/entry-builder.d.ts +19 -0
- package/dist/translator/util/evaluate.d.ts +11 -0
- package/dist/translator/util/for-each-identifier.d.ts +2 -0
- package/dist/translator/util/get-defined-binding-expression.d.ts +3 -0
- package/dist/translator/util/get-known-attr-values.d.ts +2 -0
- package/dist/translator/util/get-parent-tag.d.ts +2 -0
- package/dist/translator/util/get-root.d.ts +7 -0
- package/dist/translator/util/get-tag-name.d.ts +2 -0
- package/dist/translator/util/is-core-tag.d.ts +10 -0
- package/dist/translator/util/is-stateful.d.ts +3 -0
- package/dist/translator/util/is-static.d.ts +2 -0
- package/dist/translator/util/marko-config.d.ts +4 -0
- package/dist/translator/util/nested-attribute-tags.d.ts +17 -0
- package/dist/translator/util/normalize-string-expression.d.ts +3 -0
- package/dist/translator/util/optional.d.ts +20 -0
- package/dist/translator/util/plugin-hooks.d.ts +4 -0
- package/dist/translator/util/references.d.ts +84 -0
- package/dist/translator/util/runtime-info.d.ts +5 -0
- package/dist/translator/util/runtime.d.ts +15 -0
- package/dist/translator/util/scope-read.d.ts +6 -0
- package/dist/translator/util/sections.d.ts +51 -0
- package/dist/translator/util/signals.d.ts +61 -0
- package/dist/translator/util/simplify-fn.d.ts +5 -0
- package/dist/translator/util/state.d.ts +3 -0
- package/dist/translator/util/tag-name-type.d.ts +16 -0
- package/dist/translator/util/to-first-expression-or-block.d.ts +3 -0
- package/dist/translator/util/to-first-statement-or-block.d.ts +2 -0
- package/dist/translator/util/to-property-name.d.ts +7 -0
- package/dist/translator/util/translate-attrs.d.ts +12 -0
- package/dist/translator/util/translate-var.d.ts +2 -0
- package/dist/translator/util/traverse.d.ts +9 -0
- package/dist/translator/util/visitors.d.ts +11 -0
- package/dist/translator/util/walks.d.ts +15 -0
- package/dist/translator/util/with-previous-location.d.ts +2 -0
- package/dist/translator/util/writer.d.ts +13 -0
- package/dist/translator/visitors/cdata.d.ts +7 -0
- package/dist/translator/visitors/comment.d.ts +7 -0
- package/dist/translator/visitors/declaration.d.ts +7 -0
- package/dist/translator/visitors/document-type.d.ts +7 -0
- package/dist/translator/visitors/function.d.ts +19 -0
- package/dist/translator/visitors/import-declaration.d.ts +8 -0
- package/dist/translator/visitors/placeholder.d.ts +22 -0
- package/dist/translator/visitors/program/dom.d.ts +7 -0
- package/dist/translator/visitors/program/html.d.ts +8 -0
- package/dist/translator/visitors/program/index.d.ts +39 -0
- package/dist/translator/visitors/referenced-identifier.d.ts +7 -0
- package/dist/translator/visitors/scriptlet.d.ts +8 -0
- package/dist/translator/visitors/tag/attribute-tag.d.ts +11 -0
- package/dist/translator/visitors/tag/custom-tag.d.ts +19 -0
- package/dist/translator/visitors/tag/dynamic-tag.d.ts +18 -0
- package/dist/translator/visitors/tag/index.d.ts +15 -0
- package/dist/translator/visitors/tag/native-tag.d.ts +25 -0
- package/dist/translator/visitors/text.d.ts +7 -0
- package/package.json +33 -74
- package/README.md +0 -161
- package/bin/markoc +0 -2
- package/bin/markoc.js +0 -441
- package/browser-refresh.js +0 -5
- package/compiler-browser.marko +0 -15
- package/compiler.js +0 -7
- package/components-browser.marko +0 -15
- package/components.js +0 -7
- package/dist/build.json +0 -3
- package/dist/compiler/config.js +0 -45
- package/dist/compiler/index.js +0 -164
- package/dist/compiler/modules.js +0 -5
- package/dist/core-tags/components/init-components-tag.js +0 -54
- package/dist/core-tags/components/preferred-script-location-tag.js +0 -25
- package/dist/core-tags/components/preserve-tag.js +0 -1
- package/dist/core-tags/core/__flush_here_and_after__.js +0 -44
- package/dist/core-tags/core/await/AsyncValue.js +0 -121
- package/dist/core-tags/core/await/client-reorder-runtime.js +0 -51
- package/dist/core-tags/core/await/index.d.marko +0 -10
- package/dist/core-tags/core/await/renderer.js +0 -249
- package/dist/core-tags/core/await/reorderer-renderer.js +0 -156
- package/dist/index.js +0 -4
- package/dist/node-require/browser-refresh.js +0 -18
- package/dist/node-require/hot-reload.js +0 -45
- package/dist/node-require/index.js +0 -103
- package/dist/node_modules/@internal/components-beginComponent/index-browser.js +0 -23
- package/dist/node_modules/@internal/components-beginComponent/index.js +0 -84
- package/dist/node_modules/@internal/components-beginComponent/package.json +0 -11
- package/dist/node_modules/@internal/components-define-widget-legacy/index-browser.js +0 -335
- package/dist/node_modules/@internal/components-define-widget-legacy/index.js +0 -18
- package/dist/node_modules/@internal/components-define-widget-legacy/package.json +0 -11
- package/dist/node_modules/@internal/components-endComponent/index-browser.js +0 -5
- package/dist/node_modules/@internal/components-endComponent/index.js +0 -11
- package/dist/node_modules/@internal/components-endComponent/package.json +0 -11
- package/dist/node_modules/@internal/components-entry/index-browser.js +0 -11
- package/dist/node_modules/@internal/components-entry/index.js +0 -301
- package/dist/node_modules/@internal/components-entry/package.json +0 -11
- package/dist/node_modules/@internal/components-entry-legacy/index-browser.js +0 -76
- package/dist/node_modules/@internal/components-entry-legacy/index.js +0 -16
- package/dist/node_modules/@internal/components-entry-legacy/package.json +0 -11
- package/dist/node_modules/@internal/components-registry/index-browser.js +0 -586
- package/dist/node_modules/@internal/components-registry/index.js +0 -44
- package/dist/node_modules/@internal/components-registry/package.json +0 -11
- package/dist/node_modules/@internal/components-util/index-browser.js +0 -152
- package/dist/node_modules/@internal/components-util/index.js +0 -75
- package/dist/node_modules/@internal/components-util/package.json +0 -11
- package/dist/node_modules/@internal/create-readable/index-browser.js +0 -30
- package/dist/node_modules/@internal/create-readable/index.js +0 -57
- package/dist/node_modules/@internal/create-readable/package.json +0 -11
- package/dist/node_modules/@internal/loader/fallback-node.js +0 -89
- package/dist/node_modules/@internal/loader/index-browser.js +0 -2
- package/dist/node_modules/@internal/loader/index.js +0 -23
- package/dist/node_modules/@internal/loader/package.json +0 -10
- package/dist/node_modules/@internal/preserve-tag/index-browser.js +0 -46
- package/dist/node_modules/@internal/preserve-tag/index.js +0 -34
- package/dist/node_modules/@internal/preserve-tag/package.json +0 -11
- package/dist/node_modules/@internal/require/index-browser.js +0 -15
- package/dist/node_modules/@internal/require/index-legacy-browser.js +0 -20
- package/dist/node_modules/@internal/require/index-webpack.js +0 -16
- package/dist/node_modules/@internal/require/index.js +0 -15
- package/dist/node_modules/@internal/require/package.json +0 -11
- package/dist/node_modules/@internal/set-immediate/index-browser.js +0 -19
- package/dist/node_modules/@internal/set-immediate/index-worker.js +0 -31
- package/dist/node_modules/@internal/set-immediate/index.js +0 -3
- package/dist/node_modules/@internal/set-immediate/package.json +0 -11
- package/dist/node_modules/@internal/set-immediate/queueMicrotask.js +0 -8
- package/dist/runtime/RenderResult.js +0 -112
- package/dist/runtime/components/Component.js +0 -663
- package/dist/runtime/components/ComponentDef.js +0 -169
- package/dist/runtime/components/ComponentsContext.js +0 -59
- package/dist/runtime/components/GlobalComponentsContext.js +0 -10
- package/dist/runtime/components/KeySequence.js +0 -16
- package/dist/runtime/components/ServerComponent.js +0 -73
- package/dist/runtime/components/State.js +0 -101
- package/dist/runtime/components/attach-detach.js +0 -60
- package/dist/runtime/components/defineComponent.js +0 -60
- package/dist/runtime/components/dom-data.js +0 -8
- package/dist/runtime/components/event-delegation.js +0 -144
- package/dist/runtime/components/index.js +0 -1
- package/dist/runtime/components/legacy/browser.json +0 -9
- package/dist/runtime/components/legacy/defineComponent-legacy.js +0 -27
- package/dist/runtime/components/legacy/defineRenderer-legacy.js +0 -171
- package/dist/runtime/components/legacy/defineWidget-legacy.js +0 -1
- package/dist/runtime/components/legacy/dependencies/html.js +0 -3
- package/dist/runtime/components/legacy/dependencies/index.js +0 -177
- package/dist/runtime/components/legacy/dependencies/vdom.js +0 -3
- package/dist/runtime/components/legacy/index.js +0 -1
- package/dist/runtime/components/legacy/jquery.js +0 -52
- package/dist/runtime/components/legacy/ready.js +0 -152
- package/dist/runtime/components/legacy/renderer-legacy.js +0 -231
- package/dist/runtime/components/registry.js +0 -1
- package/dist/runtime/components/renderer.js +0 -236
- package/dist/runtime/components/update-manager.js +0 -94
- package/dist/runtime/createOut.js +0 -13
- package/dist/runtime/dom-insert.js +0 -77
- package/dist/runtime/events.js +0 -2
- package/dist/runtime/helpers/_change-case.js +0 -45
- package/dist/runtime/helpers/assign.js +0 -21
- package/dist/runtime/helpers/attr-tag.js +0 -43
- package/dist/runtime/helpers/class-value.js +0 -30
- package/dist/runtime/helpers/dynamic-tag.js +0 -181
- package/dist/runtime/helpers/empty-component.js +0 -1
- package/dist/runtime/helpers/merge.js +0 -13
- package/dist/runtime/helpers/of-fallback.js +0 -4
- package/dist/runtime/helpers/render-tag.js +0 -20
- package/dist/runtime/helpers/serialize-noop.js +0 -5
- package/dist/runtime/helpers/style-value.js +0 -45
- package/dist/runtime/helpers/tags-compat/dom-debug.js +0 -1
- package/dist/runtime/helpers/tags-compat/dom-debug.mjs +0 -4
- package/dist/runtime/helpers/tags-compat/dom.js +0 -1
- package/dist/runtime/helpers/tags-compat/dom.mjs +0 -4
- package/dist/runtime/helpers/tags-compat/html-debug.js +0 -3
- package/dist/runtime/helpers/tags-compat/html-debug.mjs +0 -4
- package/dist/runtime/helpers/tags-compat/html.js +0 -3
- package/dist/runtime/helpers/tags-compat/html.mjs +0 -4
- package/dist/runtime/helpers/tags-compat/runtime-dom.js +0 -239
- package/dist/runtime/helpers/tags-compat/runtime-html.js +0 -136
- package/dist/runtime/helpers/to-string.js +0 -5
- package/dist/runtime/html/AsyncStream.js +0 -805
- package/dist/runtime/html/BufferedWriter.js +0 -52
- package/dist/runtime/html/StringWriter.js +0 -73
- package/dist/runtime/html/helpers/_dynamic-attr.js +0 -35
- package/dist/runtime/html/helpers/attr.js +0 -80
- package/dist/runtime/html/helpers/attrs.js +0 -26
- package/dist/runtime/html/helpers/class-attr.js +0 -8
- package/dist/runtime/html/helpers/data-marko.js +0 -36
- package/dist/runtime/html/helpers/escape-quotes.js +0 -35
- package/dist/runtime/html/helpers/escape-script-placeholder.js +0 -24
- package/dist/runtime/html/helpers/escape-style-placeholder.js +0 -22
- package/dist/runtime/html/helpers/escape-xml.js +0 -21
- package/dist/runtime/html/helpers/merge-attrs.js +0 -55
- package/dist/runtime/html/helpers/props-script.js +0 -32
- package/dist/runtime/html/helpers/style-attr.js +0 -8
- package/dist/runtime/html/hot-reload.js +0 -26
- package/dist/runtime/html/index.js +0 -33
- package/dist/runtime/html/marko-namespace.js +0 -3
- package/dist/runtime/renderable.js +0 -194
- package/dist/runtime/vdom/AsyncVDOMBuilder.js +0 -456
- package/dist/runtime/vdom/VComment.js +0 -24
- package/dist/runtime/vdom/VComponent.js +0 -17
- package/dist/runtime/vdom/VDocumentFragment.js +0 -34
- package/dist/runtime/vdom/VElement.js +0 -375
- package/dist/runtime/vdom/VFragment.js +0 -26
- package/dist/runtime/vdom/VNode.js +0 -100
- package/dist/runtime/vdom/VText.js +0 -25
- package/dist/runtime/vdom/helpers/attrs.js +0 -62
- package/dist/runtime/vdom/helpers/const-element.js +0 -25
- package/dist/runtime/vdom/helpers/merge-attrs.js +0 -16
- package/dist/runtime/vdom/hot-reload.js +0 -115
- package/dist/runtime/vdom/index.js +0 -30
- package/dist/runtime/vdom/is-text-only.js +0 -10
- package/dist/runtime/vdom/marko-namespace.js +0 -3
- package/dist/runtime/vdom/morphdom/fragment.js +0 -95
- package/dist/runtime/vdom/morphdom/helpers.js +0 -42
- package/dist/runtime/vdom/morphdom/index.js +0 -741
- package/dist/runtime/vdom/parse-html.js +0 -18
- package/dist/runtime/vdom/vdom.js +0 -88
- package/dist/taglib/index.js +0 -51
- package/dist/translator/cdata/index.js +0 -15
- package/dist/translator/cdata/index[html].js +0 -15
- package/dist/translator/cdata/index[vdom].js +0 -12
- package/dist/translator/class.js +0 -65
- package/dist/translator/comment/index.js +0 -15
- package/dist/translator/comment/index[html].js +0 -17
- package/dist/translator/comment/index[vdom].js +0 -3
- package/dist/translator/declaration/index.js +0 -15
- package/dist/translator/declaration/index[html].js +0 -12
- package/dist/translator/declaration/index[vdom].js +0 -3
- package/dist/translator/document-type/index.js +0 -15
- package/dist/translator/document-type/index[html].js +0 -12
- package/dist/translator/document-type/index[vdom].js +0 -3
- package/dist/translator/placeholder/index.js +0 -15
- package/dist/translator/placeholder/index[html].js +0 -93
- package/dist/translator/placeholder/index[vdom].js +0 -22
- package/dist/translator/scriptlet.js +0 -4
- package/dist/translator/tag/attribute/directives/class.js +0 -42
- package/dist/translator/tag/attribute/directives/index.js +0 -15
- package/dist/translator/tag/attribute/directives/no-update-body-if.js +0 -15
- package/dist/translator/tag/attribute/directives/no-update-body.js +0 -10
- package/dist/translator/tag/attribute/directives/no-update-if.js +0 -12
- package/dist/translator/tag/attribute/directives/no-update.js +0 -48
- package/dist/translator/tag/attribute/directives/style.js +0 -42
- package/dist/translator/tag/attribute/index.js +0 -150
- package/dist/translator/tag/attribute/modifiers/index.js +0 -7
- package/dist/translator/tag/attribute/modifiers/no-update.js +0 -14
- package/dist/translator/tag/attribute/modifiers/scoped.js +0 -23
- package/dist/translator/tag/attribute-tag.js +0 -149
- package/dist/translator/tag/custom-tag.js +0 -146
- package/dist/translator/tag/dynamic-tag.js +0 -74
- package/dist/translator/tag/index.js +0 -287
- package/dist/translator/tag/macro-tag.js +0 -7
- package/dist/translator/tag/native-tag.js +0 -27
- package/dist/translator/tag/native-tag[html]/attributes.js +0 -151
- package/dist/translator/tag/native-tag[html]/index.js +0 -221
- package/dist/translator/tag/native-tag[vdom]/attributes.js +0 -105
- package/dist/translator/tag/native-tag[vdom]/index.js +0 -189
- package/dist/translator/tag/util.js +0 -246
- package/dist/translator/taglib/core/conditional/translate-else-if.js +0 -20
- package/dist/translator/taglib/core/conditional/translate-else.js +0 -20
- package/dist/translator/taglib/core/conditional/translate-if.js +0 -8
- package/dist/translator/taglib/core/conditional/util.js +0 -41
- package/dist/translator/taglib/core/index.js +0 -474
- package/dist/translator/taglib/core/macro/parse.js +0 -17
- package/dist/translator/taglib/core/macro/translate.js +0 -48
- package/dist/translator/taglib/core/parse-class.js +0 -79
- package/dist/translator/taglib/core/parse-export.js +0 -14
- package/dist/translator/taglib/core/parse-import.js +0 -14
- package/dist/translator/taglib/core/parse-module-code.js +0 -18
- package/dist/translator/taglib/core/parse-static.js +0 -18
- package/dist/translator/taglib/core/transform-style.js +0 -66
- package/dist/translator/taglib/core/translate-await.js +0 -41
- package/dist/translator/taglib/core/translate-body.js +0 -17
- package/dist/translator/taglib/core/translate-for.js +0 -156
- package/dist/translator/taglib/core/translate-html-comment.js +0 -52
- package/dist/translator/taglib/core/translate-include-content.js +0 -53
- package/dist/translator/taglib/core/translate-server-only.js +0 -5
- package/dist/translator/taglib/core/translate-while.js +0 -32
- package/dist/translator/taglib/index.js +0 -6
- package/dist/translator/taglib/migrate/all-templates.js +0 -46
- package/dist/translator/taglib/migrate/index.js +0 -5
- package/dist/translator/text/index.js +0 -10
- package/dist/translator/text/index[html].js +0 -12
- package/dist/translator/text/index[vdom].js +0 -20
- package/dist/translator/util/add-dependencies.js +0 -329
- package/dist/translator/util/escape-regexp.js +0 -4
- package/dist/translator/util/get-component-files.js +0 -86
- package/dist/translator/util/html-out-write.js +0 -15
- package/dist/translator/util/key-manager.js +0 -176
- package/dist/translator/util/optimize-html-writes.js +0 -52
- package/dist/translator/util/optimize-vdom-create.js +0 -164
- package/dist/translator/util/plugin-hooks.js +0 -22
- package/dist/translator/util/runtime-flags.js +0 -3
- package/dist/translator/util/vdom-out-write.js +0 -10
- package/dist/translator/util/with-previous-location.js +0 -6
- package/docs/10-awesome-marko-features.md +0 -291
- package/docs/body-content.md +0 -355
- package/docs/class-components.md +0 -1001
- package/docs/cloudflare-workers.md +0 -32
- package/docs/compiler-hooks.png +0 -0
- package/docs/compiler.md +0 -473
- package/docs/component-diagram.afdesign +0 -0
- package/docs/component-diagram.svg +0 -87
- package/docs/concise.md +0 -141
- package/docs/conditionals-and-lists.md +0 -72
- package/docs/core-tags.md +0 -325
- package/docs/custom-tags.md +0 -201
- package/docs/editor-plugins.md +0 -45
- package/docs/events.md +0 -131
- package/docs/express.md +0 -66
- package/docs/fastify.md +0 -65
- package/docs/getting-started.md +0 -95
- package/docs/http.md +0 -34
- package/docs/icons/js.svg +0 -4
- package/docs/icons/marko.svg +0 -1
- package/docs/icons/ts.svg +0 -1
- package/docs/installing.md +0 -51
- package/docs/koa.md +0 -35
- package/docs/lasso.md +0 -196
- package/docs/marko-5-upgrade.md +0 -59
- package/docs/marko-json.md +0 -248
- package/docs/marko-vs-react.md +0 -854
- package/docs/redux.md +0 -61
- package/docs/rendering.md +0 -268
- package/docs/rollup.md +0 -352
- package/docs/state.md +0 -105
- package/docs/structure.json +0 -49
- package/docs/styles.md +0 -29
- package/docs/syntax.md +0 -601
- package/docs/troubleshooting-streaming.md +0 -68
- package/docs/typescript.md +0 -406
- package/docs/vite.md +0 -86
- package/docs/webpack.md +0 -205
- package/docs/why-is-marko-fast.md +0 -239
- package/env.js +0 -7
- package/helpers/README.md +0 -3
- package/helpers/empty.js +0 -4
- package/helpers/notEmpty.js +0 -11
- package/index-browser.marko +0 -15
- package/index.d.ts +0 -375
- package/index.js +0 -7
- package/legacy-components-browser.marko +0 -15
- package/legacy-components.js +0 -7
- package/node-require.js +0 -8
- package/src/build.json +0 -3
- package/src/compiler/config.js +0 -45
- package/src/compiler/index.js +0 -164
- package/src/compiler/modules.js +0 -5
- package/src/core-tags/.eslintrc +0 -5
- package/src/core-tags/components/init-components-tag.js +0 -54
- package/src/core-tags/components/preferred-script-location-tag.js +0 -25
- package/src/core-tags/components/preserve-tag.js +0 -1
- package/src/core-tags/core/__flush_here_and_after__.js +0 -44
- package/src/core-tags/core/await/AsyncValue.js +0 -121
- package/src/core-tags/core/await/client-reorder-runtime.js +0 -51
- package/src/core-tags/core/await/index.d.marko +0 -10
- package/src/core-tags/core/await/renderer.js +0 -249
- package/src/core-tags/core/await/reorderer-renderer.js +0 -156
- package/src/index.js +0 -4
- package/src/node-require/browser-refresh.js +0 -18
- package/src/node-require/hot-reload.js +0 -45
- package/src/node-require/index.js +0 -103
- package/src/node_modules/@internal/components-beginComponent/index-browser.js +0 -23
- package/src/node_modules/@internal/components-beginComponent/index.js +0 -84
- package/src/node_modules/@internal/components-beginComponent/package.json +0 -11
- package/src/node_modules/@internal/components-define-widget-legacy/index-browser.js +0 -335
- package/src/node_modules/@internal/components-define-widget-legacy/index.js +0 -18
- package/src/node_modules/@internal/components-define-widget-legacy/package.json +0 -11
- package/src/node_modules/@internal/components-endComponent/index-browser.js +0 -5
- package/src/node_modules/@internal/components-endComponent/index.js +0 -11
- package/src/node_modules/@internal/components-endComponent/package.json +0 -11
- package/src/node_modules/@internal/components-entry/index-browser.js +0 -11
- package/src/node_modules/@internal/components-entry/index.js +0 -301
- package/src/node_modules/@internal/components-entry/package.json +0 -11
- package/src/node_modules/@internal/components-entry-legacy/index-browser.js +0 -76
- package/src/node_modules/@internal/components-entry-legacy/index.js +0 -16
- package/src/node_modules/@internal/components-entry-legacy/package.json +0 -11
- package/src/node_modules/@internal/components-registry/index-browser.js +0 -586
- package/src/node_modules/@internal/components-registry/index.js +0 -44
- package/src/node_modules/@internal/components-registry/package.json +0 -11
- package/src/node_modules/@internal/components-util/index-browser.js +0 -152
- package/src/node_modules/@internal/components-util/index.js +0 -75
- package/src/node_modules/@internal/components-util/package.json +0 -11
- package/src/node_modules/@internal/create-readable/index-browser.js +0 -30
- package/src/node_modules/@internal/create-readable/index.js +0 -57
- package/src/node_modules/@internal/create-readable/package.json +0 -11
- package/src/node_modules/@internal/loader/fallback-node.js +0 -89
- package/src/node_modules/@internal/loader/index-browser.js +0 -2
- package/src/node_modules/@internal/loader/index.js +0 -23
- package/src/node_modules/@internal/loader/package.json +0 -10
- package/src/node_modules/@internal/preserve-tag/index-browser.js +0 -46
- package/src/node_modules/@internal/preserve-tag/index.js +0 -34
- package/src/node_modules/@internal/preserve-tag/package.json +0 -11
- package/src/node_modules/@internal/require/index-browser.js +0 -15
- package/src/node_modules/@internal/require/index-legacy-browser.js +0 -20
- package/src/node_modules/@internal/require/index-webpack.js +0 -16
- package/src/node_modules/@internal/require/index.js +0 -15
- package/src/node_modules/@internal/require/package.json +0 -11
- package/src/node_modules/@internal/set-immediate/index-browser.js +0 -19
- package/src/node_modules/@internal/set-immediate/index-worker.js +0 -31
- package/src/node_modules/@internal/set-immediate/index.js +0 -3
- package/src/node_modules/@internal/set-immediate/package.json +0 -11
- package/src/node_modules/@internal/set-immediate/queueMicrotask.js +0 -8
- package/src/runtime/.eslintrc +0 -5
- package/src/runtime/RenderResult.js +0 -112
- package/src/runtime/components/Component.js +0 -663
- package/src/runtime/components/ComponentDef.js +0 -169
- package/src/runtime/components/ComponentsContext.js +0 -59
- package/src/runtime/components/GlobalComponentsContext.js +0 -10
- package/src/runtime/components/KeySequence.js +0 -16
- package/src/runtime/components/ServerComponent.js +0 -73
- package/src/runtime/components/State.js +0 -101
- package/src/runtime/components/attach-detach.js +0 -60
- package/src/runtime/components/defineComponent.js +0 -60
- package/src/runtime/components/dom-data.js +0 -8
- package/src/runtime/components/event-delegation.js +0 -144
- package/src/runtime/components/index.js +0 -1
- package/src/runtime/components/legacy/browser.json +0 -9
- package/src/runtime/components/legacy/defineComponent-legacy.js +0 -27
- package/src/runtime/components/legacy/defineRenderer-legacy.js +0 -171
- package/src/runtime/components/legacy/defineWidget-legacy.js +0 -1
- package/src/runtime/components/legacy/dependencies/html.js +0 -3
- package/src/runtime/components/legacy/dependencies/index.js +0 -177
- package/src/runtime/components/legacy/dependencies/vdom.js +0 -3
- package/src/runtime/components/legacy/index.js +0 -1
- package/src/runtime/components/legacy/jquery.js +0 -52
- package/src/runtime/components/legacy/ready.js +0 -152
- package/src/runtime/components/legacy/renderer-legacy.js +0 -231
- package/src/runtime/components/registry.js +0 -1
- package/src/runtime/components/renderer.js +0 -236
- package/src/runtime/components/update-manager.js +0 -94
- package/src/runtime/createOut.js +0 -13
- package/src/runtime/dom-insert.js +0 -77
- package/src/runtime/events.js +0 -2
- package/src/runtime/helpers/_change-case.js +0 -45
- package/src/runtime/helpers/assign.js +0 -21
- package/src/runtime/helpers/attr-tag.js +0 -43
- package/src/runtime/helpers/class-value.js +0 -30
- package/src/runtime/helpers/dynamic-tag.js +0 -181
- package/src/runtime/helpers/empty-component.js +0 -1
- package/src/runtime/helpers/merge.js +0 -13
- package/src/runtime/helpers/of-fallback.js +0 -4
- package/src/runtime/helpers/render-tag.js +0 -20
- package/src/runtime/helpers/serialize-noop.js +0 -5
- package/src/runtime/helpers/style-value.js +0 -45
- package/src/runtime/helpers/tags-compat/dom-debug.js +0 -1
- package/src/runtime/helpers/tags-compat/dom-debug.mjs +0 -4
- package/src/runtime/helpers/tags-compat/dom.js +0 -1
- package/src/runtime/helpers/tags-compat/dom.mjs +0 -4
- package/src/runtime/helpers/tags-compat/html-debug.js +0 -3
- package/src/runtime/helpers/tags-compat/html-debug.mjs +0 -4
- package/src/runtime/helpers/tags-compat/html.js +0 -3
- package/src/runtime/helpers/tags-compat/html.mjs +0 -4
- package/src/runtime/helpers/tags-compat/runtime-dom.js +0 -239
- package/src/runtime/helpers/tags-compat/runtime-html.js +0 -136
- package/src/runtime/helpers/to-string.js +0 -5
- package/src/runtime/html/AsyncStream.js +0 -805
- package/src/runtime/html/BufferedWriter.js +0 -52
- package/src/runtime/html/StringWriter.js +0 -73
- package/src/runtime/html/helpers/_dynamic-attr.js +0 -35
- package/src/runtime/html/helpers/attr.js +0 -80
- package/src/runtime/html/helpers/attrs.js +0 -26
- package/src/runtime/html/helpers/class-attr.js +0 -8
- package/src/runtime/html/helpers/data-marko.js +0 -36
- package/src/runtime/html/helpers/escape-quotes.js +0 -35
- package/src/runtime/html/helpers/escape-script-placeholder.js +0 -24
- package/src/runtime/html/helpers/escape-style-placeholder.js +0 -22
- package/src/runtime/html/helpers/escape-xml.js +0 -21
- package/src/runtime/html/helpers/merge-attrs.js +0 -55
- package/src/runtime/html/helpers/props-script.js +0 -32
- package/src/runtime/html/helpers/style-attr.js +0 -8
- package/src/runtime/html/hot-reload.js +0 -26
- package/src/runtime/html/index.js +0 -33
- package/src/runtime/html/marko-namespace.js +0 -3
- package/src/runtime/renderable.js +0 -194
- package/src/runtime/vdom/AsyncVDOMBuilder.js +0 -456
- package/src/runtime/vdom/VComment.js +0 -24
- package/src/runtime/vdom/VComponent.js +0 -17
- package/src/runtime/vdom/VDocumentFragment.js +0 -34
- package/src/runtime/vdom/VElement.js +0 -375
- package/src/runtime/vdom/VFragment.js +0 -26
- package/src/runtime/vdom/VNode.js +0 -100
- package/src/runtime/vdom/VText.js +0 -25
- package/src/runtime/vdom/helpers/attrs.js +0 -62
- package/src/runtime/vdom/helpers/const-element.js +0 -25
- package/src/runtime/vdom/helpers/merge-attrs.js +0 -16
- package/src/runtime/vdom/hot-reload.js +0 -115
- package/src/runtime/vdom/index.js +0 -30
- package/src/runtime/vdom/is-text-only.js +0 -10
- package/src/runtime/vdom/marko-namespace.js +0 -3
- package/src/runtime/vdom/morphdom/fragment.js +0 -95
- package/src/runtime/vdom/morphdom/helpers.js +0 -42
- package/src/runtime/vdom/morphdom/index.js +0 -741
- package/src/runtime/vdom/parse-html.js +0 -18
- package/src/runtime/vdom/vdom.js +0 -88
- package/src/taglib/index.js +0 -51
- package/src/translator/cdata/index.js +0 -15
- package/src/translator/cdata/index[html].js +0 -15
- package/src/translator/cdata/index[vdom].js +0 -12
- package/src/translator/class.js +0 -65
- package/src/translator/comment/index.js +0 -15
- package/src/translator/comment/index[html].js +0 -17
- package/src/translator/comment/index[vdom].js +0 -3
- package/src/translator/declaration/index.js +0 -15
- package/src/translator/declaration/index[html].js +0 -12
- package/src/translator/declaration/index[vdom].js +0 -3
- package/src/translator/document-type/index.js +0 -15
- package/src/translator/document-type/index[html].js +0 -12
- package/src/translator/document-type/index[vdom].js +0 -3
- package/src/translator/index.js +0 -551
- package/src/translator/placeholder/index.js +0 -15
- package/src/translator/placeholder/index[html].js +0 -93
- package/src/translator/placeholder/index[vdom].js +0 -22
- package/src/translator/scriptlet.js +0 -4
- package/src/translator/tag/attribute/directives/class.js +0 -42
- package/src/translator/tag/attribute/directives/index.js +0 -15
- package/src/translator/tag/attribute/directives/no-update-body-if.js +0 -15
- package/src/translator/tag/attribute/directives/no-update-body.js +0 -10
- package/src/translator/tag/attribute/directives/no-update-if.js +0 -12
- package/src/translator/tag/attribute/directives/no-update.js +0 -48
- package/src/translator/tag/attribute/directives/style.js +0 -42
- package/src/translator/tag/attribute/index.js +0 -150
- package/src/translator/tag/attribute/modifiers/index.js +0 -7
- package/src/translator/tag/attribute/modifiers/no-update.js +0 -14
- package/src/translator/tag/attribute/modifiers/scoped.js +0 -23
- package/src/translator/tag/attribute-tag.js +0 -149
- package/src/translator/tag/custom-tag.js +0 -146
- package/src/translator/tag/dynamic-tag.js +0 -74
- package/src/translator/tag/index.js +0 -287
- package/src/translator/tag/macro-tag.js +0 -7
- package/src/translator/tag/native-tag.js +0 -27
- package/src/translator/tag/native-tag[html]/attributes.js +0 -151
- package/src/translator/tag/native-tag[html]/index.js +0 -221
- package/src/translator/tag/native-tag[vdom]/attributes.js +0 -105
- package/src/translator/tag/native-tag[vdom]/index.js +0 -189
- package/src/translator/tag/util.js +0 -246
- package/src/translator/taglib/core/conditional/translate-else-if.js +0 -20
- package/src/translator/taglib/core/conditional/translate-else.js +0 -20
- package/src/translator/taglib/core/conditional/translate-if.js +0 -8
- package/src/translator/taglib/core/conditional/util.js +0 -41
- package/src/translator/taglib/core/index.js +0 -474
- package/src/translator/taglib/core/macro/parse.js +0 -17
- package/src/translator/taglib/core/macro/translate.js +0 -48
- package/src/translator/taglib/core/parse-class.js +0 -79
- package/src/translator/taglib/core/parse-export.js +0 -14
- package/src/translator/taglib/core/parse-import.js +0 -14
- package/src/translator/taglib/core/parse-module-code.js +0 -18
- package/src/translator/taglib/core/parse-static.js +0 -18
- package/src/translator/taglib/core/transform-style.js +0 -66
- package/src/translator/taglib/core/translate-await.js +0 -41
- package/src/translator/taglib/core/translate-body.js +0 -17
- package/src/translator/taglib/core/translate-for.js +0 -156
- package/src/translator/taglib/core/translate-html-comment.js +0 -52
- package/src/translator/taglib/core/translate-include-content.js +0 -53
- package/src/translator/taglib/core/translate-server-only.js +0 -5
- package/src/translator/taglib/core/translate-while.js +0 -32
- package/src/translator/taglib/index.js +0 -7
- package/src/translator/taglib/migrate/all-templates.js +0 -46
- package/src/translator/taglib/migrate/index.js +0 -5
- package/src/translator/text/index.js +0 -10
- package/src/translator/text/index[html].js +0 -12
- package/src/translator/text/index[vdom].js +0 -20
- package/src/translator/util/add-dependencies.js +0 -329
- package/src/translator/util/escape-regexp.js +0 -4
- package/src/translator/util/get-component-files.js +0 -86
- package/src/translator/util/html-out-write.js +0 -15
- package/src/translator/util/key-manager.js +0 -176
- package/src/translator/util/optimize-html-writes.js +0 -52
- package/src/translator/util/optimize-vdom-create.js +0 -164
- package/src/translator/util/plugin-hooks.js +0 -22
- package/src/translator/util/runtime-flags.js +0 -3
- package/src/translator/util/vdom-out-write.js +0 -10
- package/src/translator/util/with-previous-location.js +0 -6
- package/tags-html.d.ts +0 -3855
- package/translator/index.d.ts +0 -7
- package/translator/package.json +0 -5
package/docs/marko-vs-react.md
DELETED
@@ -1,854 +0,0 @@
|
|
1
|
-
# Marko vs React: An In-depth Look
|
2
|
-
|
3
|
-
<a href="https://hackernoon.com/marko-vs-react-an-in-depth-look-767de0a5f9a6">
|
4
|
-
<img src="https://cdn-images-1.medium.com/max/2000/1*4BP6tPQtwImj6_QseeybwQ.png" alt="Marko logo" width="100%" />
|
5
|
-
</a><br />
|
6
|
-
|
7
|
-
> This article was published March 2017. Both frameworks have gone through several updates since. You can find the original ["Marko vs React: An In-depth Look" article here](https://hackernoon.com/marko-vs-react-an-in-depth-look-767de0a5f9a6)!
|
8
|
-
|
9
|
-
In this article we will take an in-depth look at the differences and
|
10
|
-
similarities between [Marko](https://markojs.com/) and React from the perspective
|
11
|
-
of the maintainers of Marko.
|
12
|
-
|
13
|
-
On the surface, Marko and React have a lot in common and both are trying to
|
14
|
-
solve very similar problems. Specifically, both Marko and React allow developers
|
15
|
-
to build web applications based on UI components and both free developers from
|
16
|
-
having to write code to manually update the DOM. While many of the features in
|
17
|
-
Marko were inspired by React, Marko and React offer very different usability and
|
18
|
-
performance characteristics. Marko was designed to avoid almost all boilerplate
|
19
|
-
and is more closely aligned with HTML. In almost all cases, a Marko UI component
|
20
|
-
will require less lines of code than its React JSX equivalent while maintaining
|
21
|
-
readability and allowing the same expressiveness as JSX. In addition, Marko is
|
22
|
-
highly optimized for use on the server and in the browser and has a much smaller
|
23
|
-
weight:
|
24
|
-
|
25
|
-
<img src="https://cdn-images-1.medium.com/max/1600/1*a9hL_pfNrRq1UU3Mxkf3Jg.png" alt="Marko logo" width="100%" /><br />
|
26
|
-
|
27
|
-
Because the Marko JavaScript library is much smaller than React, it will require
|
28
|
-
less time to load and parse and this will drastically improve page load times on
|
29
|
-
slow connections or on older devices. Based on [our
|
30
|
-
benchmarks](https://markojs.com/#benchmarks), Marko consistently outperforms
|
31
|
-
React by a significant margin on both the server and in the browser.
|
32
|
-
|
33
|
-
### Example
|
34
|
-
|
35
|
-
The following code highlights some of the differences between Marko and React
|
36
|
-
JSX using a somewhat contrived UI component as an example:
|
37
|
-
|
38
|
-
#### React JSX
|
39
|
-
|
40
|
-
```jsx
|
41
|
-
class Counter extends React.Component {
|
42
|
-
constructor(props) {
|
43
|
-
super(props);
|
44
|
-
|
45
|
-
this.state = { count: 0 };
|
46
|
-
}
|
47
|
-
|
48
|
-
increment(delta) {
|
49
|
-
this.setState({ count: this.state.count + delta });
|
50
|
-
}
|
51
|
-
|
52
|
-
render() {
|
53
|
-
const count = this.state.count;
|
54
|
-
let countClassName = "count";
|
55
|
-
|
56
|
-
if (count > 0) {
|
57
|
-
countClassName += " positive";
|
58
|
-
} else if (count < 0) {
|
59
|
-
countClassName += " negative";
|
60
|
-
}
|
61
|
-
|
62
|
-
return (
|
63
|
-
<div className="click-count">
|
64
|
-
<div className={countClassName}>{count}</div>
|
65
|
-
<button
|
66
|
-
onClick={() => {
|
67
|
-
this.increment(-1);
|
68
|
-
}}
|
69
|
-
>
|
70
|
-
-1
|
71
|
-
</button>
|
72
|
-
<button
|
73
|
-
onClick={() => {
|
74
|
-
this.increment(1);
|
75
|
-
}}
|
76
|
-
>
|
77
|
-
+1
|
78
|
-
</button>
|
79
|
-
</div>
|
80
|
-
);
|
81
|
-
}
|
82
|
-
}
|
83
|
-
```
|
84
|
-
|
85
|
-
<span class="figcaption_hack">[▶ Try Online](https://codepen.io/mlrawlings/pen/wJXOWR?editors=0010)</span>
|
86
|
-
|
87
|
-
#### Marko
|
88
|
-
|
89
|
-
```marko
|
90
|
-
class {
|
91
|
-
onCreate() {
|
92
|
-
this.state = { count: 0 };
|
93
|
-
}
|
94
|
-
increment(delta) {
|
95
|
-
this.state.count += delta;
|
96
|
-
}
|
97
|
-
}
|
98
|
-
|
99
|
-
$ var count = state.count;
|
100
|
-
|
101
|
-
<div.click-count>
|
102
|
-
<div.count class={
|
103
|
-
positive: count > 0,
|
104
|
-
negative: count < 0
|
105
|
-
}>
|
106
|
-
${count}
|
107
|
-
</div>
|
108
|
-
<button on-click('increment', -1)>
|
109
|
-
-1
|
110
|
-
</button>
|
111
|
-
<button on-click('increment', 1)>
|
112
|
-
+1
|
113
|
-
</button>
|
114
|
-
</div>
|
115
|
-
```
|
116
|
-
|
117
|
-
<span class="figcaption_hack">[▶ Try
|
118
|
-
Online](https://markojs.com/try-online/?gist=8fe46bc5866605aca0dfeec202604011)</span>
|
119
|
-
|
120
|
-
### Similarities
|
121
|
-
|
122
|
-
Marko and React have the following in common:
|
123
|
-
|
124
|
-
- UI component-based
|
125
|
-
- JavaScript and HTML markup can be intertwined
|
126
|
-
- No restrictions on JavaScript (use ES5 or ES2015+, your choice)
|
127
|
-
- Virtual DOM rendering in the browser
|
128
|
-
- DOM diffing/patching is used to reconcile views
|
129
|
-
- Both support keyed element matching
|
130
|
-
- UI components can have input properties
|
131
|
-
- UI components can have internal state
|
132
|
-
- Changes to state trigger an asynchronous update to the DOM
|
133
|
-
- Updates to the DOM are batched
|
134
|
-
- Compatible with central application state stores such as Redux and MobX
|
135
|
-
- UI components can be embedded using custom tags
|
136
|
-
- Declarative event binding (no `domEl.addEventListener()` needed)
|
137
|
-
- Support for all DOM events
|
138
|
-
- Event delegation utilized internally for DOM events that bubble
|
139
|
-
- IE9+ support
|
140
|
-
- Similar lifecycle events for UI components
|
141
|
-
- JSX and Marko both compile to JavaScript
|
142
|
-
|
143
|
-
### Differences
|
144
|
-
|
145
|
-
At a high level here are some differences:
|
146
|
-
|
147
|
-
#### Differences in rendering
|
148
|
-
|
149
|
-
- **Improved performance:** Marko renders to a virtual DOM in the browser and
|
150
|
-
directly to an HTML stream on the server (Marko supports multiple compilation
|
151
|
-
targets).
|
152
|
-
- **Improved performance:** Marko supports asynchronous rendering with [early
|
153
|
-
flushing of
|
154
|
-
HTML](https://tech.ebayinc.com/engineering/async-fragments-rediscovering-progressive-html-rendering-with-marko/)
|
155
|
-
for improvements in actual and perceived page load times.
|
156
|
-
- **Improved performance:** React requires an additional client-side re-render if
|
157
|
-
a page is initially rendered on the server while Marko does not.
|
158
|
-
- **Improved ease of use:** Marko automatically serializes UI component state and
|
159
|
-
input down to the browser so that the browser can pick up right where the server
|
160
|
-
left off.
|
161
|
-
- **Improved ease of use:** Marko is suitable for rendering an entire HTML page on
|
162
|
-
the server with support for tags such as `<doctype>` and `<html>`
|
163
|
-
|
164
|
-
#### Differences in syntax
|
165
|
-
|
166
|
-
- **Improved ease of use:** Marko uses the
|
167
|
-
[HTML-JS](https://markojs.com/docs/syntax/) syntax and the
|
168
|
-
[JSX](https://facebook.github.io/react/docs/jsx-in-depth.html) syntax is offered
|
169
|
-
for React.
|
170
|
-
- **Improved ease of use:** Marko supports both a concise syntax and a familiar
|
171
|
-
HTML syntax.
|
172
|
-
- **Improved ease of use:** JSX requires strict XML while Marko aligns with less
|
173
|
-
strict HTML that web developers are used to.
|
174
|
-
- **Improved ease of use:** With Marko, _all_ HTML attribute values are parsed as
|
175
|
-
JavaScript expressions.
|
176
|
-
- **Improved ease of use:** Marko supports simple directives for conditionals,
|
177
|
-
looping, etc.
|
178
|
-
- **JSX limitation:** JSX is “just JavaScript” but requires expressions that
|
179
|
-
preclude the usage of JavaScript statements such as in certain places.
|
180
|
-
|
181
|
-
#### Differences in compilation
|
182
|
-
|
183
|
-
- **Improved performance:** Marko supports multiple compilation outputs (Marko
|
184
|
-
VDOM and HTML streaming are currently supported).
|
185
|
-
- **Improved ease of use:** Marko compiles UI components to JavaScript modules
|
186
|
-
that export a rendering API.
|
187
|
-
- **Expanded capabilities:** Marko supports a robust API for controlling how
|
188
|
-
custom tags and custom attributes get compiled and it supports compile-time
|
189
|
-
transforms based on a friendly Abstract Syntax Tree (AST).
|
190
|
-
- **Improved performance:** JSX is just syntactic sugar that translates elements
|
191
|
-
to `createElement()` function calls while the Marko compiler has full control over how things are
|
192
|
-
compiled and optimized.
|
193
|
-
- **Improved ease of use:** React requires all UI components to be explicitly
|
194
|
-
imported before they can be used as custom tags while Marko supports both
|
195
|
-
explicit importing and implicit importing.
|
196
|
-
- **Improved performance:** Marko has a modular runtime and the compiler generates
|
197
|
-
code that only imports the parts of the Marko runtime that are needed for much
|
198
|
-
smaller builds.
|
199
|
-
- **Improved ease of use:** Marko supports optional compile-time checks to ensure
|
200
|
-
that only allowed attributes are passed to custom tags. (React `PropTypes` only provide
|
201
|
-
validation at render-time)
|
202
|
-
- **Improved ease of use:** Marko validates _all_ tag names at compile-time.
|
203
|
-
- **Improved ease of use:** Marko provides its own compiler that integrates with
|
204
|
-
Node.js and JavaScript module bundlers while React JSX requires babel and custom
|
205
|
-
babel transforms.
|
206
|
-
|
207
|
-
#### Differences in UI components
|
208
|
-
|
209
|
-
- **Reduced boilerplate:** No explicit extending of JavaScript classes in Marko
|
210
|
-
(in contrast to `class Counter extends React.Component` in React).
|
211
|
-
- **Improved ease of use:** Modifications to UI component state are synchronous
|
212
|
-
with Marko while [the rules for React are more
|
213
|
-
complicated](https://facebook.github.io/react/docs/state-and-lifecycle.html#state-updates-may-be-asynchronous).
|
214
|
-
- **Improved ease of use:** Marko watches UI component state objects to allow
|
215
|
-
state to be modified directly (e.g., `this.state.count++`).
|
216
|
-
- **Improved ease of use:** Marko supports single-file UI components combining
|
217
|
-
JavaScript behavior, CSS styling (with support for CSS preprocessors) and HTML
|
218
|
-
markup. (React requires using one of the many [CSS in JS
|
219
|
-
solutions](https://github.com/MicheleBertoli/css-in-js) if you want styles in
|
220
|
-
the same file as your component and there is no standard in the community)
|
221
|
-
- **Improved maintainability:** Marko supports a seamless transition from a
|
222
|
-
single-file UI component to a multi-file UI component.
|
223
|
-
- **Improved performance:** Marko assumes UI components are pure by default and
|
224
|
-
skips re-rendering when input properties and state are unchanged (React requires
|
225
|
-
extending
|
226
|
-
[React.PureComponent](https://facebook.github.io/react/docs/react-api.html#react.purecomponent)).
|
227
|
-
|
228
|
-
#### Differences in event systems
|
229
|
-
|
230
|
-
- **Reduced complexity:** React utilizes [synthetic
|
231
|
-
events](https://facebook.github.io/react/docs/events.html) while Marko utilizes
|
232
|
-
real DOM events.
|
233
|
-
- **Improved ease of use:** Custom events are emitted using the [EventEmitter
|
234
|
-
API](https://nodejs.org/api/events.html) in Marko (e.g., `this.emit('myCustomEvent', arg1, arg2)`).
|
235
|
-
- **Improved ease of use:** Marko has a consistent approach for listening to both
|
236
|
-
native DOM events and custom events.
|
237
|
-
- **Improved ease of use:** React requires passing around `Function` references for custom
|
238
|
-
events while Marko automatically delegates emitted custom events to event
|
239
|
-
handler methods on components.
|
240
|
-
- **Improved ease of use:** Marko provides a simple mechanism for binding
|
241
|
-
additional arguments to event handler methods and `this` will be the component
|
242
|
-
instance.
|
243
|
-
|
244
|
-
#### Differences in compatibility
|
245
|
-
|
246
|
-
- **Marko limitation:** Marko has no support for native mobile similar to React
|
247
|
-
Native (although with Marko VDOM rendering, this is possible).
|
248
|
-
- **Marko limitation:** Marko requires a JavaScript module bundler (such as
|
249
|
-
[Lasso](https://markojs.com/docs/lasso/),
|
250
|
-
[Webpack](https://markojs.com/docs/webpack/),
|
251
|
-
[Rollup](https://markojs.com/docs/rollup/)
|
252
|
-
since Marko UI components compile down to JavaScript modules. (we consider using
|
253
|
-
a JavaScript module bundler a best practice)
|
254
|
-
|
255
|
-
---
|
256
|
-
|
257
|
-
In the sections below we will take a closer look at some of the differences
|
258
|
-
between Marko and React.
|
259
|
-
|
260
|
-
### Syntax
|
261
|
-
|
262
|
-
Both Marko and React JSX allow HTML markup and JavaScript to be combined into a
|
263
|
-
single file and both support building web applications based on UI components.
|
264
|
-
Marko utilizes an [HTML-JS syntax](https://markojs.com/docs/syntax/) while most
|
265
|
-
React apps use the JSX syntax.
|
266
|
-
|
267
|
-
> React JSX makes JavaScript more like HTML and Marko makes HTML more like
|
268
|
-
> JavaScript.
|
269
|
-
|
270
|
-
In the end, both Marko and React allow JavaScript and HTML to be intertwined.
|
271
|
-
|
272
|
-
### Syntax: attributes
|
273
|
-
|
274
|
-
#### React JSX
|
275
|
-
|
276
|
-
In React JSX, all attribute values are parsed as string values unless `{}` is used.
|
277
|
-
|
278
|
-
```jsx
|
279
|
-
<MyComponent
|
280
|
-
name="Frank"
|
281
|
-
messageCount={30}
|
282
|
-
visible={true}
|
283
|
-
person={{ firstName: 'John', lastName: 'Doe' }}
|
284
|
-
colors={['red', 'green', 'blue']} />
|
285
|
-
|
286
|
-
<div id="content" className="foo">Hello</div>
|
287
|
-
```
|
288
|
-
|
289
|
-
#### Marko
|
290
|
-
|
291
|
-
With Marko, _all_ attribute values are parsed as JavaScript expressions. The
|
292
|
-
following Marko code is equivalent to the React JSX code above:
|
293
|
-
|
294
|
-
```marko
|
295
|
-
<my-component
|
296
|
-
name="Frank"
|
297
|
-
message-count=30
|
298
|
-
visible=true
|
299
|
-
person={ firstName: 'John', lastName: 'Doe' }
|
300
|
-
colors=['red', 'green', 'blue'] />
|
301
|
-
|
302
|
-
<div id="content" class="foo">Hello</div>
|
303
|
-
```
|
304
|
-
|
305
|
-
### Syntax: inline JavaScript
|
306
|
-
|
307
|
-
#### React JSX
|
308
|
-
|
309
|
-
React JSX starts with JavaScript and allows XML elements to be inlined as shown
|
310
|
-
below:
|
311
|
-
|
312
|
-
```jsx
|
313
|
-
import { formatDate } from "./util";
|
314
|
-
|
315
|
-
function formatName(person) {
|
316
|
-
return person.firstName + " " + person.lastName.charAt(0) + ".";
|
317
|
-
}
|
318
|
-
|
319
|
-
export default function HelloMessage(props) {
|
320
|
-
var person = props.person;
|
321
|
-
|
322
|
-
return (
|
323
|
-
<div>
|
324
|
-
Hello {formatName(person)}!
|
325
|
-
<span>You were born on {formatDate(person.birthday)}.</span>
|
326
|
-
</div>
|
327
|
-
);
|
328
|
-
}
|
329
|
-
```
|
330
|
-
|
331
|
-
#### Marko
|
332
|
-
|
333
|
-
Marko starts out in HTML, but it allows JavaScript to be inlined in a clean and
|
334
|
-
maintainable way. Unlike other template languages, Marko aims to allow the full
|
335
|
-
power of JavaScript. The following Marko code is equivalent to the React JSX
|
336
|
-
code above:
|
337
|
-
|
338
|
-
```marko
|
339
|
-
import { formatDate } from './util';
|
340
|
-
|
341
|
-
static function formatName(person) {
|
342
|
-
return person.firstName + ' ' + person.lastName.charAt(0) + '.';
|
343
|
-
}
|
344
|
-
|
345
|
-
$ var person = input.person;
|
346
|
-
|
347
|
-
<div>
|
348
|
-
Hello ${formatName(person)}!
|
349
|
-
<span>
|
350
|
-
You were born on ${formatDate(person.birthday)}.
|
351
|
-
</span>
|
352
|
-
</div>
|
353
|
-
```
|
354
|
-
|
355
|
-
Lines prefixed with `$` are directly added to the compiled JavaScript output inside
|
356
|
-
the compiled `render()` function (for JavaScript code that should run for every render).
|
357
|
-
Lines prefixed with `static` are directly added to the compiled JavaScript output
|
358
|
-
outside the `render()` function (for code that should only run _once_ when the template is
|
359
|
-
loaded).
|
360
|
-
|
361
|
-
### Syntax: HTML support
|
362
|
-
|
363
|
-
With Marko any valid HTML markup can be used inside a Marko template. This is
|
364
|
-
not the case with React. The following quote is from the [React
|
365
|
-
documentation](https://facebook.github.io/react/docs/introducing-jsx.html#specifying-children-with-jsx):
|
366
|
-
|
367
|
-
> **Caveat:**
|
368
|
-
|
369
|
-
> Since JSX is closer to JavaScript than HTML, React DOM uses `camelCase` property naming
|
370
|
-
> convention instead of HTML attribute names.
|
371
|
-
|
372
|
-
> For example, `class` becomes `className` in JSX, and `tabindex` becomes `tabIndex`.
|
373
|
-
|
374
|
-
As a result of this caveat for React, [tools for converting HTML to JSX
|
375
|
-
exist](https://magic.reactjs.net/htmltojsx.htm).
|
376
|
-
|
377
|
-
#### React JSX
|
378
|
-
|
379
|
-
```jsx
|
380
|
-
<div id="content" className="my-component">Hello</div>
|
381
|
-
|
382
|
-
<input type="text" name="firstName" value="John" />
|
383
|
-
```
|
384
|
-
|
385
|
-
#### Marko
|
386
|
-
|
387
|
-
```marko
|
388
|
-
<div id="content" class="my-component">Hello</div>
|
389
|
-
|
390
|
-
<input type="text" name="firstName" value="John">
|
391
|
-
```
|
392
|
-
|
393
|
-
### Syntax: conditionals
|
394
|
-
|
395
|
-
JSX is syntactic sugar on top of JavaScript, but it requires expressions, so
|
396
|
-
simple things like an `if/else/for` statement don’t work on their own within a JSX element. As
|
397
|
-
a result, you must either use a ternary expression, an immediately invoked
|
398
|
-
function expression, function call expression, or the experimental `do {}` expression
|
399
|
-
(stage 0 at the time of writing). This is not an issue for Marko, and tags
|
400
|
-
such as `if()` and `for` can be used anywhere as shown below:
|
401
|
-
|
402
|
-
#### React JSX
|
403
|
-
|
404
|
-
```jsx
|
405
|
-
function counterMessage(count) {
|
406
|
-
return (
|
407
|
-
<div className="counter-message">
|
408
|
-
(function() {
|
409
|
-
if (count < 0) {
|
410
|
-
return <div>Count is negative</div>
|
411
|
-
} else if (count === 0) {
|
412
|
-
return <div>Count is zero</div>
|
413
|
-
} else {
|
414
|
-
return <div>Count is positive</div>
|
415
|
-
}
|
416
|
-
}())
|
417
|
-
</div>
|
418
|
-
)
|
419
|
-
}
|
420
|
-
```
|
421
|
-
|
422
|
-
#### Marko
|
423
|
-
|
424
|
-
```marko
|
425
|
-
<div.counter-message>
|
426
|
-
<if(count < 0)>
|
427
|
-
<div>Count is negative</div>
|
428
|
-
</if>
|
429
|
-
<else if(count === 0)>
|
430
|
-
<div>Count is zero</div>
|
431
|
-
</else>
|
432
|
-
<else>
|
433
|
-
<div>Count is positive</div>
|
434
|
-
</else>
|
435
|
-
</div>
|
436
|
-
```
|
437
|
-
|
438
|
-
Marko also allows directives to be used as attributes for a more condensed
|
439
|
-
template:
|
440
|
-
|
441
|
-
```marko
|
442
|
-
<div.counter-message>
|
443
|
-
<div if(count < 0)>Count is negative</div>
|
444
|
-
<div if(count === 0)>Count is zero</div>
|
445
|
-
<div else>Count is positive</div>
|
446
|
-
</div>
|
447
|
-
```
|
448
|
-
|
449
|
-
### Syntax: looping
|
450
|
-
|
451
|
-
#### React JSX
|
452
|
-
|
453
|
-
```jsx
|
454
|
-
function renderColors(colors) {
|
455
|
-
return (
|
456
|
-
<ul>
|
457
|
-
{colors.map((color) => (
|
458
|
-
<li
|
459
|
-
className="color"
|
460
|
-
style={{
|
461
|
-
backgroundColor: color,
|
462
|
-
}}
|
463
|
-
>
|
464
|
-
{color}
|
465
|
-
</li>
|
466
|
-
))}
|
467
|
-
</ul>
|
468
|
-
);
|
469
|
-
}
|
470
|
-
```
|
471
|
-
|
472
|
-
#### Marko
|
473
|
-
|
474
|
-
```marko
|
475
|
-
<ul>
|
476
|
-
<for|color| of=colors>
|
477
|
-
<li.color style={ backgroundColor: color }>
|
478
|
-
${color}
|
479
|
-
</li>
|
480
|
-
</for>
|
481
|
-
</ul>
|
482
|
-
```
|
483
|
-
|
484
|
-
### Syntax: HTML shorthand
|
485
|
-
|
486
|
-
```marko
|
487
|
-
<div id="content"/>
|
488
|
-
<h1 class="subheader"/>
|
489
|
-
<h1 id="pageTitle" class="foo bar"/>
|
490
|
-
|
491
|
-
<!-- Shorthand equivalent: -->
|
492
|
-
<div#content/>
|
493
|
-
<h1.subheader/>
|
494
|
-
<h1#pageTitle.foo.bar/>
|
495
|
-
```
|
496
|
-
|
497
|
-
Marko supports a shorthand based on CSS selectors for less code.
|
498
|
-
|
499
|
-
React does not support these helpful shorthands.
|
500
|
-
|
501
|
-
### Syntax: concise
|
502
|
-
|
503
|
-
Marko supports a concise syntax that drops angled brackets and ending tags in
|
504
|
-
favor of indentation. Here’s how the Marko syntax options compare:
|
505
|
-
|
506
|
-
#### Marko HTML syntax
|
507
|
-
|
508
|
-
```marko
|
509
|
-
<ul>
|
510
|
-
<for|color| of=colors>
|
511
|
-
<li>${color}</li>
|
512
|
-
</for>
|
513
|
-
</ul>
|
514
|
-
```
|
515
|
-
|
516
|
-
#### Marko concise syntax
|
517
|
-
|
518
|
-
```marko
|
519
|
-
ul
|
520
|
-
for|color| of=colors
|
521
|
-
li -- ${color}
|
522
|
-
```
|
523
|
-
|
524
|
-
#### Marko mixed syntax
|
525
|
-
|
526
|
-
```marko
|
527
|
-
ul
|
528
|
-
for|color| of=colors
|
529
|
-
<li>${color}</li>
|
530
|
-
```
|
531
|
-
|
532
|
-
The HTML syntax and the concise syntax can be used together:
|
533
|
-
|
534
|
-
#### React JSX
|
535
|
-
|
536
|
-
React does not offer a concise syntax.
|
537
|
-
|
538
|
-
### Components
|
539
|
-
|
540
|
-
Marko starts with simple HTML and allows UI component logic to easily be layered
|
541
|
-
on top.
|
542
|
-
|
543
|
-
#### React JSX
|
544
|
-
|
545
|
-
A React UI component is typically implemented as a class that extends `ReactComponent`:
|
546
|
-
|
547
|
-
```jsx
|
548
|
-
class HelloMessage extends React.Component {
|
549
|
-
render() {
|
550
|
-
return <div>Hello {this.props.name.toUpperCase()}</div>;
|
551
|
-
}
|
552
|
-
}
|
553
|
-
```
|
554
|
-
|
555
|
-
React also supports a more concise functional component:
|
556
|
-
|
557
|
-
```jsx
|
558
|
-
function HelloMessage(props) {
|
559
|
-
return <div>Hello {props.name.toUpperCase()}</div>;
|
560
|
-
}
|
561
|
-
```
|
562
|
-
|
563
|
-
However, if state or lifecycle events are needed then a functional UI component
|
564
|
-
must be converted to a class component:
|
565
|
-
|
566
|
-
```jsx
|
567
|
-
class HelloMessage extends React.Component {
|
568
|
-
componentDidMount() {
|
569
|
-
// ...
|
570
|
-
}
|
571
|
-
render() {
|
572
|
-
return <div>Hello {this.props.name.toUpperCase()}</div>;
|
573
|
-
}
|
574
|
-
}
|
575
|
-
```
|
576
|
-
|
577
|
-
#### Marko
|
578
|
-
|
579
|
-
Here is the same component in Marko:
|
580
|
-
|
581
|
-
```marko
|
582
|
-
<div>Hello ${input.name.toUpperCase()}</div>
|
583
|
-
```
|
584
|
-
|
585
|
-
Behavior can easily be added to any Marko UI component:
|
586
|
-
|
587
|
-
```marko
|
588
|
-
class {
|
589
|
-
onMount() {
|
590
|
-
// ...
|
591
|
-
}
|
592
|
-
}
|
593
|
-
|
594
|
-
<div>Hello ${input.name.toUpperCase()}</div>
|
595
|
-
```
|
596
|
-
|
597
|
-
Marko also allows JavaScript behavior, CSS styling and HTML markup to be
|
598
|
-
embedded in the Marko template as a single file UI component:
|
599
|
-
|
600
|
-
```marko
|
601
|
-
class {
|
602
|
-
onMount() {
|
603
|
-
// ...
|
604
|
-
}
|
605
|
-
}
|
606
|
-
|
607
|
-
style.less {
|
608
|
-
.hello {
|
609
|
-
color: red;
|
610
|
-
}
|
611
|
-
}
|
612
|
-
|
613
|
-
<div.hello>
|
614
|
-
Hello ${input.name.toUpperCase()}
|
615
|
-
</div>
|
616
|
-
```
|
617
|
-
|
618
|
-
### API
|
619
|
-
|
620
|
-
Marko compiles components to JavaScript modules that export their rendering APIs,
|
621
|
-
as shown below:
|
622
|
-
|
623
|
-
```js
|
624
|
-
import Greeting from "./components/greeting.marko";
|
625
|
-
Greeting.renderSync({ name: "Frank" }).appendTo(document.body);
|
626
|
-
```
|
627
|
-
|
628
|
-
The same UI component can render to streams, such as a writable HTTP
|
629
|
-
response stream:
|
630
|
-
|
631
|
-
```js
|
632
|
-
import Greeting from "./components/greeting.marko";
|
633
|
-
Greeting.render({ name: "John" }, res);
|
634
|
-
```
|
635
|
-
|
636
|
-
> The users of a Marko UI component do not need to know that the component was
|
637
|
-
> implemented using Marko.
|
638
|
-
|
639
|
-
Contrast this with React as an example:
|
640
|
-
|
641
|
-
```jsx
|
642
|
-
import ReactDOM from "react-dom";
|
643
|
-
|
644
|
-
ReactDOM.render(
|
645
|
-
<HelloMessage name="John" />,
|
646
|
-
document.getElementById("container"),
|
647
|
-
);
|
648
|
-
```
|
649
|
-
|
650
|
-
On top of that, React requires that a different module be imported to render the
|
651
|
-
exact same UI component on the server:
|
652
|
-
|
653
|
-
```jsx
|
654
|
-
import ReactDOMServer from "react-dom/server";
|
655
|
-
|
656
|
-
var html = ReactDOMServer.renderToString(<HelloMessage name="John" />);
|
657
|
-
```
|
658
|
-
|
659
|
-
### Custom tags
|
660
|
-
|
661
|
-
#### React JSX
|
662
|
-
|
663
|
-
With React, all custom tags for UI components must be explicitly imported:
|
664
|
-
|
665
|
-
```jsx
|
666
|
-
import Hello from "./components/Hello";
|
667
|
-
import GoodBye from "./components/GoodBye";
|
668
|
-
|
669
|
-
export default function HelloGoodBye(props) {
|
670
|
-
return (
|
671
|
-
<div>
|
672
|
-
<Hello name={props.name} />
|
673
|
-
<GoodBye name={props.name} />
|
674
|
-
</div>
|
675
|
-
);
|
676
|
-
}
|
677
|
-
```
|
678
|
-
|
679
|
-
#### Marko
|
680
|
-
|
681
|
-
Marko supports a mechanism for [automatically discovering custom
|
682
|
-
tags](https://markojs.com/docs/custom-tags/#discovering-tags) for UI components
|
683
|
-
based on the project directory structure. Marko walks up the directory tree to
|
684
|
-
discover all directories and it will also automatically discover custom tags
|
685
|
-
exported by installed packages. This approach negates the need for explicitly
|
686
|
-
importing a custom tag to reduce the amount of code needed in a Marko template.
|
687
|
-
For example given the following directory structure:
|
688
|
-
|
689
|
-
```
|
690
|
-
.
|
691
|
-
├── components/
|
692
|
-
│ ├── hello.marko
|
693
|
-
│ └── good-bye.marko
|
694
|
-
└── index.marko
|
695
|
-
```
|
696
|
-
|
697
|
-
The `<hello>` tag and the `<good-bye>` tag nested below the `components/`
|
698
|
-
directory will automatically be made available to the `index.marko` at the root:
|
699
|
-
|
700
|
-
```marko
|
701
|
-
<div>
|
702
|
-
<hello name=input.name />
|
703
|
-
<good-bye name=input.name />
|
704
|
-
</div>
|
705
|
-
```
|
706
|
-
|
707
|
-
This approach also allows editors and IDEs to offer autocompletion for custom
|
708
|
-
tags.
|
709
|
-
|
710
|
-
### Async
|
711
|
-
|
712
|
-
Even after rendering has started, Marko allows parts of the view to be rendered
|
713
|
-
asynchronously using the [`<await>`](https://markojs.com/docs/core-tags#await)
|
714
|
-
tag as shown in the following Marko template:
|
715
|
-
|
716
|
-
```marko
|
717
|
-
import fsp from 'fs-promise';
|
718
|
-
|
719
|
-
$ var filePath = __dirname + '/hello.txt';
|
720
|
-
$ var readPromise = fsp.readFile(filePath, {encoding: 'utf8'});
|
721
|
-
|
722
|
-
<await(readPromise)>
|
723
|
-
<@then|helloText|>
|
724
|
-
<p>${helloText}</p>
|
725
|
-
</@then>
|
726
|
-
</await>
|
727
|
-
```
|
728
|
-
|
729
|
-
### Compiler
|
730
|
-
|
731
|
-
Marko compiles a template differently based on whether or not it will be used on
|
732
|
-
the server or in the browser. For example, given the following template:
|
733
|
-
|
734
|
-
```marko
|
735
|
-
<div>Hello ${input.name}!</div>
|
736
|
-
```
|
737
|
-
|
738
|
-
#### Compiled for the server:
|
739
|
-
|
740
|
-
```js
|
741
|
-
var marko_template = require("marko/html").t(__filename),
|
742
|
-
marko_helpers = require("marko/runtime/html/helpers"),
|
743
|
-
marko_escapeXml = marko_helpers.x;
|
744
|
-
|
745
|
-
function render(input, out) {
|
746
|
-
out.w("<div>Hello " + marko_escapeXml(input.name) + "!</div>");
|
747
|
-
}
|
748
|
-
```
|
749
|
-
|
750
|
-
#### Compiled for the browser:
|
751
|
-
|
752
|
-
```js
|
753
|
-
var marko_template = require("marko/vdom").t(__filename);
|
754
|
-
|
755
|
-
function render(input, out) {
|
756
|
-
out.e("DIV", null, 3).t("Hello ").t(input.name).t("!");
|
757
|
-
}
|
758
|
-
```
|
759
|
-
|
760
|
-
### Compile-time code transforms
|
761
|
-
|
762
|
-
The Marko compiler was built to support compile-time code generators for custom
|
763
|
-
tags and it also provides support for compile-time transforms. While Babel
|
764
|
-
allows code transformations of JavaScript, the Marko compiler provides support
|
765
|
-
for resolving custom tags declaratively and the Marko AST provides for very
|
766
|
-
powerful and simple transformations as shown in the following code for rendering
|
767
|
-
Markdown to HTML at _compile-time_:
|
768
|
-
|
769
|
-
**components/markdown/code-generator.js:**
|
770
|
-
|
771
|
-
```js
|
772
|
-
import marked from "marked";
|
773
|
-
import { removeIndentation } from "./util";
|
774
|
-
|
775
|
-
export default function generateCode(el, codegen) {
|
776
|
-
var bodyText = removeIndentation(el.bodyText);
|
777
|
-
var html = marked(bodyText);
|
778
|
-
var builder = codegen.builder;
|
779
|
-
return builder.html(builder.literal(html));
|
780
|
-
}
|
781
|
-
```
|
782
|
-
|
783
|
-
The `<markdown>` tag can then be used as shown below:
|
784
|
-
|
785
|
-
```marko
|
786
|
-
<markdown>
|
787
|
-
|
788
|
-
> This section demonstrates Markdown in Marko
|
789
|
-
|
790
|
-
# Marko is awesome!
|
791
|
-
|
792
|
-
- High performance
|
793
|
-
- Small
|
794
|
-
- Intuitive
|
795
|
-
|
796
|
-
</markdown>
|
797
|
-
```
|
798
|
-
|
799
|
-
In this example, after the template is compiled, the
|
800
|
-
[marked](https://github.com/chjj/marked) library is no longer needed at
|
801
|
-
render-time.
|
802
|
-
|
803
|
-
### Tools
|
804
|
-
|
805
|
-
Marko and React offer a variety of developer tools. The [Marko developer
|
806
|
-
tools](https://github.com/marko-js/marko-devtools) are constantly evolving, but
|
807
|
-
Marko currently provides tools for unit testing UI components, precompiling `.marko`
|
808
|
-
files and generating configuration-less apps (similar to
|
809
|
-
[create-react-app](https://github.com/facebookincubator/create-react-app)).
|
810
|
-
Currently, there are no Marko developer tools that integrate with the browser,
|
811
|
-
but this is something we would like to see in the future. We will go into more
|
812
|
-
detail on the Marko developer tools in a future post.
|
813
|
-
|
814
|
-
#### IDE and editor support
|
815
|
-
|
816
|
-
Marko offers syntax highlighting across all major IDEs and editors, as well as
|
817
|
-
on GitHub. Marko provides first-class support for the Atom editor with syntax
|
818
|
-
highlighting,
|
819
|
-
[Autocomplete](https://github.com/marko-js/atom-language-marko#autocomplete) for
|
820
|
-
both HTML and custom tags,
|
821
|
-
[Hyperclick](https://github.com/marko-js/atom-language-marko#hyperclick) to
|
822
|
-
quickly jump to referenced files and methods, and [Pretty
|
823
|
-
printing](https://github.com/marko-js/atom-language-marko#prettyprint) to keep
|
824
|
-
your code readable.
|
825
|
-
|
826
|
-
---
|
827
|
-
|
828
|
-
### Why Marko?
|
829
|
-
|
830
|
-
Here are just a few reasons you should consider using
|
831
|
-
[Marko](https://markojs.com/) over React:
|
832
|
-
|
833
|
-
- Marko requires much less boilerplate.
|
834
|
-
- Marko has much better performance based on our benchmarks.
|
835
|
-
- Marko offers a clean and powerful syntax that aligns with HTML while also
|
836
|
-
allowing the full power of JavaScript.
|
837
|
-
- Marko has much less complexity and a very small runtime.
|
838
|
-
- Marko has a much lower page weight for faster page loads.
|
839
|
-
- Marko has strong integrations with Node.js.
|
840
|
-
- Marko allows for extremely powerful IDE and editor plugins (see the [Marko
|
841
|
-
plugin for Atom](https://github.com/marko-js/atom-language-marko) as an
|
842
|
-
example).
|
843
|
-
- Marko has a powerful compiler that allows new features to be added without
|
844
|
-
introducing bloat.
|
845
|
-
- eBay relies heavily on Marko and it is being used to build ebay.com (including
|
846
|
-
the mobile web).
|
847
|
-
- Marko has a strong and growing community on
|
848
|
-
[GitHub](https://github.com/marko-js/marko) and in
|
849
|
-
[Discord](https://discord.gg/RFGxYGs).
|
850
|
-
|
851
|
-
Interested in learning more about Marko? If so, you can get additional
|
852
|
-
information on the [Marko website](https://markojs.com/). Join the conversation
|
853
|
-
and contribute on [GitHub](https://github.com/marko-js/marko) and follow us on
|
854
|
-
[Twitter](https://twitter.com/MarkoDevTeam).
|