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.
Files changed (638) hide show
  1. package/dist/common/attr-tag.d.ts +8 -0
  2. package/dist/common/compat-meta.d.ts +2 -0
  3. package/dist/common/for.d.ts +5 -0
  4. package/dist/common/helpers.d.ts +7 -0
  5. package/dist/common/meta.d.ts +2 -0
  6. package/dist/common/types.d.ts +105 -0
  7. package/dist/debug/dom.js +2112 -0
  8. package/dist/debug/dom.mjs +2089 -0
  9. package/dist/debug/html.js +2740 -0
  10. package/dist/debug/html.mjs +2663 -0
  11. package/dist/dom/abort-signal.d.ts +3 -0
  12. package/dist/dom/compat.d.ts +20 -0
  13. package/dist/dom/control-flow.d.ts +14 -0
  14. package/dist/dom/controllable.d.ts +12 -0
  15. package/dist/dom/dom.d.ts +19 -0
  16. package/dist/dom/event.d.ts +4 -0
  17. package/dist/dom/parse-html.d.ts +5 -0
  18. package/dist/dom/queue.d.ts +10 -0
  19. package/dist/dom/reconcile.d.ts +2 -0
  20. package/dist/dom/renderer.d.ts +21 -0
  21. package/dist/dom/resolve-cursor-position.d.ts +1 -0
  22. package/dist/dom/resume.d.ts +9 -0
  23. package/dist/dom/schedule.d.ts +2 -0
  24. package/dist/dom/scope.d.ts +7 -0
  25. package/dist/dom/signals.d.ts +39 -0
  26. package/dist/dom/template.d.ts +3 -0
  27. package/dist/dom/walker.d.ts +4 -0
  28. package/dist/dom.d.ts +15 -0
  29. package/dist/dom.js +1370 -0
  30. package/dist/dom.mjs +1350 -0
  31. package/dist/html/attrs.d.ts +14 -0
  32. package/dist/html/compat.d.ts +14 -0
  33. package/dist/html/content.d.ts +5 -0
  34. package/dist/html/dynamic-tag.d.ts +12 -0
  35. package/dist/html/for.d.ts +4 -0
  36. package/dist/html/inlined-runtimes.d.ts +2 -0
  37. package/dist/html/serializer.d.ts +14 -0
  38. package/dist/html/template.d.ts +3 -0
  39. package/dist/html/writer.d.ts +114 -0
  40. package/dist/html.d.ts +9 -0
  41. package/dist/html.js +1818 -0
  42. package/dist/html.mjs +1744 -0
  43. package/dist/translator/core/attrs.d.ts +3 -0
  44. package/dist/translator/core/client.d.ts +14 -0
  45. package/dist/translator/core/const.d.ts +3 -0
  46. package/dist/translator/core/debug.d.ts +3 -0
  47. package/dist/translator/core/define.d.ts +3 -0
  48. package/dist/translator/core/effect.d.ts +3 -0
  49. package/dist/translator/core/export.d.ts +3 -0
  50. package/dist/translator/core/for.d.ts +67 -0
  51. package/dist/translator/core/html-comment.d.ts +12 -0
  52. package/dist/translator/core/html-script.d.ts +9 -0
  53. package/dist/translator/core/html-style.d.ts +9 -0
  54. package/dist/translator/core/id.d.ts +3 -0
  55. package/dist/translator/core/if.d.ts +53 -0
  56. package/dist/translator/core/import.d.ts +3 -0
  57. package/dist/translator/core/index.d.ts +152 -0
  58. package/dist/translator/core/let.d.ts +8 -0
  59. package/dist/translator/core/lifecycle.d.ts +10 -0
  60. package/dist/translator/core/log.d.ts +3 -0
  61. package/dist/translator/core/return.d.ts +6 -0
  62. package/dist/translator/core/script.d.ts +3 -0
  63. package/dist/translator/core/server.d.ts +14 -0
  64. package/dist/translator/core/static.d.ts +14 -0
  65. package/dist/translator/core/style.d.ts +3 -0
  66. package/dist/translator/index.d.ts +201 -0
  67. package/dist/translator/index.js +9143 -489
  68. package/dist/translator/util/assert.d.ts +3 -0
  69. package/dist/translator/util/binding-has-downstream-expressions.d.ts +2 -0
  70. package/dist/translator/util/entry-builder.d.ts +19 -0
  71. package/dist/translator/util/evaluate.d.ts +11 -0
  72. package/dist/translator/util/for-each-identifier.d.ts +2 -0
  73. package/dist/translator/util/get-defined-binding-expression.d.ts +3 -0
  74. package/dist/translator/util/get-known-attr-values.d.ts +2 -0
  75. package/dist/translator/util/get-parent-tag.d.ts +2 -0
  76. package/dist/translator/util/get-root.d.ts +7 -0
  77. package/dist/translator/util/get-tag-name.d.ts +2 -0
  78. package/dist/translator/util/is-core-tag.d.ts +10 -0
  79. package/dist/translator/util/is-stateful.d.ts +3 -0
  80. package/dist/translator/util/is-static.d.ts +2 -0
  81. package/dist/translator/util/marko-config.d.ts +4 -0
  82. package/dist/translator/util/nested-attribute-tags.d.ts +17 -0
  83. package/dist/translator/util/normalize-string-expression.d.ts +3 -0
  84. package/dist/translator/util/optional.d.ts +20 -0
  85. package/dist/translator/util/plugin-hooks.d.ts +4 -0
  86. package/dist/translator/util/references.d.ts +84 -0
  87. package/dist/translator/util/runtime-info.d.ts +5 -0
  88. package/dist/translator/util/runtime.d.ts +15 -0
  89. package/dist/translator/util/scope-read.d.ts +6 -0
  90. package/dist/translator/util/sections.d.ts +51 -0
  91. package/dist/translator/util/signals.d.ts +61 -0
  92. package/dist/translator/util/simplify-fn.d.ts +5 -0
  93. package/dist/translator/util/state.d.ts +3 -0
  94. package/dist/translator/util/tag-name-type.d.ts +16 -0
  95. package/dist/translator/util/to-first-expression-or-block.d.ts +3 -0
  96. package/dist/translator/util/to-first-statement-or-block.d.ts +2 -0
  97. package/dist/translator/util/to-property-name.d.ts +7 -0
  98. package/dist/translator/util/translate-attrs.d.ts +12 -0
  99. package/dist/translator/util/translate-var.d.ts +2 -0
  100. package/dist/translator/util/traverse.d.ts +9 -0
  101. package/dist/translator/util/visitors.d.ts +11 -0
  102. package/dist/translator/util/walks.d.ts +15 -0
  103. package/dist/translator/util/with-previous-location.d.ts +2 -0
  104. package/dist/translator/util/writer.d.ts +13 -0
  105. package/dist/translator/visitors/cdata.d.ts +7 -0
  106. package/dist/translator/visitors/comment.d.ts +7 -0
  107. package/dist/translator/visitors/declaration.d.ts +7 -0
  108. package/dist/translator/visitors/document-type.d.ts +7 -0
  109. package/dist/translator/visitors/function.d.ts +19 -0
  110. package/dist/translator/visitors/import-declaration.d.ts +8 -0
  111. package/dist/translator/visitors/placeholder.d.ts +22 -0
  112. package/dist/translator/visitors/program/dom.d.ts +7 -0
  113. package/dist/translator/visitors/program/html.d.ts +8 -0
  114. package/dist/translator/visitors/program/index.d.ts +39 -0
  115. package/dist/translator/visitors/referenced-identifier.d.ts +7 -0
  116. package/dist/translator/visitors/scriptlet.d.ts +8 -0
  117. package/dist/translator/visitors/tag/attribute-tag.d.ts +11 -0
  118. package/dist/translator/visitors/tag/custom-tag.d.ts +19 -0
  119. package/dist/translator/visitors/tag/dynamic-tag.d.ts +18 -0
  120. package/dist/translator/visitors/tag/index.d.ts +15 -0
  121. package/dist/translator/visitors/tag/native-tag.d.ts +25 -0
  122. package/dist/translator/visitors/text.d.ts +7 -0
  123. package/package.json +33 -74
  124. package/README.md +0 -161
  125. package/bin/markoc +0 -2
  126. package/bin/markoc.js +0 -441
  127. package/browser-refresh.js +0 -5
  128. package/compiler-browser.marko +0 -15
  129. package/compiler.js +0 -7
  130. package/components-browser.marko +0 -15
  131. package/components.js +0 -7
  132. package/dist/build.json +0 -3
  133. package/dist/compiler/config.js +0 -45
  134. package/dist/compiler/index.js +0 -164
  135. package/dist/compiler/modules.js +0 -5
  136. package/dist/core-tags/components/init-components-tag.js +0 -54
  137. package/dist/core-tags/components/preferred-script-location-tag.js +0 -25
  138. package/dist/core-tags/components/preserve-tag.js +0 -1
  139. package/dist/core-tags/core/__flush_here_and_after__.js +0 -44
  140. package/dist/core-tags/core/await/AsyncValue.js +0 -121
  141. package/dist/core-tags/core/await/client-reorder-runtime.js +0 -51
  142. package/dist/core-tags/core/await/index.d.marko +0 -10
  143. package/dist/core-tags/core/await/renderer.js +0 -249
  144. package/dist/core-tags/core/await/reorderer-renderer.js +0 -156
  145. package/dist/index.js +0 -4
  146. package/dist/node-require/browser-refresh.js +0 -18
  147. package/dist/node-require/hot-reload.js +0 -45
  148. package/dist/node-require/index.js +0 -103
  149. package/dist/node_modules/@internal/components-beginComponent/index-browser.js +0 -23
  150. package/dist/node_modules/@internal/components-beginComponent/index.js +0 -84
  151. package/dist/node_modules/@internal/components-beginComponent/package.json +0 -11
  152. package/dist/node_modules/@internal/components-define-widget-legacy/index-browser.js +0 -335
  153. package/dist/node_modules/@internal/components-define-widget-legacy/index.js +0 -18
  154. package/dist/node_modules/@internal/components-define-widget-legacy/package.json +0 -11
  155. package/dist/node_modules/@internal/components-endComponent/index-browser.js +0 -5
  156. package/dist/node_modules/@internal/components-endComponent/index.js +0 -11
  157. package/dist/node_modules/@internal/components-endComponent/package.json +0 -11
  158. package/dist/node_modules/@internal/components-entry/index-browser.js +0 -11
  159. package/dist/node_modules/@internal/components-entry/index.js +0 -301
  160. package/dist/node_modules/@internal/components-entry/package.json +0 -11
  161. package/dist/node_modules/@internal/components-entry-legacy/index-browser.js +0 -76
  162. package/dist/node_modules/@internal/components-entry-legacy/index.js +0 -16
  163. package/dist/node_modules/@internal/components-entry-legacy/package.json +0 -11
  164. package/dist/node_modules/@internal/components-registry/index-browser.js +0 -586
  165. package/dist/node_modules/@internal/components-registry/index.js +0 -44
  166. package/dist/node_modules/@internal/components-registry/package.json +0 -11
  167. package/dist/node_modules/@internal/components-util/index-browser.js +0 -152
  168. package/dist/node_modules/@internal/components-util/index.js +0 -75
  169. package/dist/node_modules/@internal/components-util/package.json +0 -11
  170. package/dist/node_modules/@internal/create-readable/index-browser.js +0 -30
  171. package/dist/node_modules/@internal/create-readable/index.js +0 -57
  172. package/dist/node_modules/@internal/create-readable/package.json +0 -11
  173. package/dist/node_modules/@internal/loader/fallback-node.js +0 -89
  174. package/dist/node_modules/@internal/loader/index-browser.js +0 -2
  175. package/dist/node_modules/@internal/loader/index.js +0 -23
  176. package/dist/node_modules/@internal/loader/package.json +0 -10
  177. package/dist/node_modules/@internal/preserve-tag/index-browser.js +0 -46
  178. package/dist/node_modules/@internal/preserve-tag/index.js +0 -34
  179. package/dist/node_modules/@internal/preserve-tag/package.json +0 -11
  180. package/dist/node_modules/@internal/require/index-browser.js +0 -15
  181. package/dist/node_modules/@internal/require/index-legacy-browser.js +0 -20
  182. package/dist/node_modules/@internal/require/index-webpack.js +0 -16
  183. package/dist/node_modules/@internal/require/index.js +0 -15
  184. package/dist/node_modules/@internal/require/package.json +0 -11
  185. package/dist/node_modules/@internal/set-immediate/index-browser.js +0 -19
  186. package/dist/node_modules/@internal/set-immediate/index-worker.js +0 -31
  187. package/dist/node_modules/@internal/set-immediate/index.js +0 -3
  188. package/dist/node_modules/@internal/set-immediate/package.json +0 -11
  189. package/dist/node_modules/@internal/set-immediate/queueMicrotask.js +0 -8
  190. package/dist/runtime/RenderResult.js +0 -112
  191. package/dist/runtime/components/Component.js +0 -663
  192. package/dist/runtime/components/ComponentDef.js +0 -169
  193. package/dist/runtime/components/ComponentsContext.js +0 -59
  194. package/dist/runtime/components/GlobalComponentsContext.js +0 -10
  195. package/dist/runtime/components/KeySequence.js +0 -16
  196. package/dist/runtime/components/ServerComponent.js +0 -73
  197. package/dist/runtime/components/State.js +0 -101
  198. package/dist/runtime/components/attach-detach.js +0 -60
  199. package/dist/runtime/components/defineComponent.js +0 -60
  200. package/dist/runtime/components/dom-data.js +0 -8
  201. package/dist/runtime/components/event-delegation.js +0 -144
  202. package/dist/runtime/components/index.js +0 -1
  203. package/dist/runtime/components/legacy/browser.json +0 -9
  204. package/dist/runtime/components/legacy/defineComponent-legacy.js +0 -27
  205. package/dist/runtime/components/legacy/defineRenderer-legacy.js +0 -171
  206. package/dist/runtime/components/legacy/defineWidget-legacy.js +0 -1
  207. package/dist/runtime/components/legacy/dependencies/html.js +0 -3
  208. package/dist/runtime/components/legacy/dependencies/index.js +0 -177
  209. package/dist/runtime/components/legacy/dependencies/vdom.js +0 -3
  210. package/dist/runtime/components/legacy/index.js +0 -1
  211. package/dist/runtime/components/legacy/jquery.js +0 -52
  212. package/dist/runtime/components/legacy/ready.js +0 -152
  213. package/dist/runtime/components/legacy/renderer-legacy.js +0 -231
  214. package/dist/runtime/components/registry.js +0 -1
  215. package/dist/runtime/components/renderer.js +0 -236
  216. package/dist/runtime/components/update-manager.js +0 -94
  217. package/dist/runtime/createOut.js +0 -13
  218. package/dist/runtime/dom-insert.js +0 -77
  219. package/dist/runtime/events.js +0 -2
  220. package/dist/runtime/helpers/_change-case.js +0 -45
  221. package/dist/runtime/helpers/assign.js +0 -21
  222. package/dist/runtime/helpers/attr-tag.js +0 -43
  223. package/dist/runtime/helpers/class-value.js +0 -30
  224. package/dist/runtime/helpers/dynamic-tag.js +0 -181
  225. package/dist/runtime/helpers/empty-component.js +0 -1
  226. package/dist/runtime/helpers/merge.js +0 -13
  227. package/dist/runtime/helpers/of-fallback.js +0 -4
  228. package/dist/runtime/helpers/render-tag.js +0 -20
  229. package/dist/runtime/helpers/serialize-noop.js +0 -5
  230. package/dist/runtime/helpers/style-value.js +0 -45
  231. package/dist/runtime/helpers/tags-compat/dom-debug.js +0 -1
  232. package/dist/runtime/helpers/tags-compat/dom-debug.mjs +0 -4
  233. package/dist/runtime/helpers/tags-compat/dom.js +0 -1
  234. package/dist/runtime/helpers/tags-compat/dom.mjs +0 -4
  235. package/dist/runtime/helpers/tags-compat/html-debug.js +0 -3
  236. package/dist/runtime/helpers/tags-compat/html-debug.mjs +0 -4
  237. package/dist/runtime/helpers/tags-compat/html.js +0 -3
  238. package/dist/runtime/helpers/tags-compat/html.mjs +0 -4
  239. package/dist/runtime/helpers/tags-compat/runtime-dom.js +0 -239
  240. package/dist/runtime/helpers/tags-compat/runtime-html.js +0 -136
  241. package/dist/runtime/helpers/to-string.js +0 -5
  242. package/dist/runtime/html/AsyncStream.js +0 -805
  243. package/dist/runtime/html/BufferedWriter.js +0 -52
  244. package/dist/runtime/html/StringWriter.js +0 -73
  245. package/dist/runtime/html/helpers/_dynamic-attr.js +0 -35
  246. package/dist/runtime/html/helpers/attr.js +0 -80
  247. package/dist/runtime/html/helpers/attrs.js +0 -26
  248. package/dist/runtime/html/helpers/class-attr.js +0 -8
  249. package/dist/runtime/html/helpers/data-marko.js +0 -36
  250. package/dist/runtime/html/helpers/escape-quotes.js +0 -35
  251. package/dist/runtime/html/helpers/escape-script-placeholder.js +0 -24
  252. package/dist/runtime/html/helpers/escape-style-placeholder.js +0 -22
  253. package/dist/runtime/html/helpers/escape-xml.js +0 -21
  254. package/dist/runtime/html/helpers/merge-attrs.js +0 -55
  255. package/dist/runtime/html/helpers/props-script.js +0 -32
  256. package/dist/runtime/html/helpers/style-attr.js +0 -8
  257. package/dist/runtime/html/hot-reload.js +0 -26
  258. package/dist/runtime/html/index.js +0 -33
  259. package/dist/runtime/html/marko-namespace.js +0 -3
  260. package/dist/runtime/renderable.js +0 -194
  261. package/dist/runtime/vdom/AsyncVDOMBuilder.js +0 -456
  262. package/dist/runtime/vdom/VComment.js +0 -24
  263. package/dist/runtime/vdom/VComponent.js +0 -17
  264. package/dist/runtime/vdom/VDocumentFragment.js +0 -34
  265. package/dist/runtime/vdom/VElement.js +0 -375
  266. package/dist/runtime/vdom/VFragment.js +0 -26
  267. package/dist/runtime/vdom/VNode.js +0 -100
  268. package/dist/runtime/vdom/VText.js +0 -25
  269. package/dist/runtime/vdom/helpers/attrs.js +0 -62
  270. package/dist/runtime/vdom/helpers/const-element.js +0 -25
  271. package/dist/runtime/vdom/helpers/merge-attrs.js +0 -16
  272. package/dist/runtime/vdom/hot-reload.js +0 -115
  273. package/dist/runtime/vdom/index.js +0 -30
  274. package/dist/runtime/vdom/is-text-only.js +0 -10
  275. package/dist/runtime/vdom/marko-namespace.js +0 -3
  276. package/dist/runtime/vdom/morphdom/fragment.js +0 -95
  277. package/dist/runtime/vdom/morphdom/helpers.js +0 -42
  278. package/dist/runtime/vdom/morphdom/index.js +0 -741
  279. package/dist/runtime/vdom/parse-html.js +0 -18
  280. package/dist/runtime/vdom/vdom.js +0 -88
  281. package/dist/taglib/index.js +0 -51
  282. package/dist/translator/cdata/index.js +0 -15
  283. package/dist/translator/cdata/index[html].js +0 -15
  284. package/dist/translator/cdata/index[vdom].js +0 -12
  285. package/dist/translator/class.js +0 -65
  286. package/dist/translator/comment/index.js +0 -15
  287. package/dist/translator/comment/index[html].js +0 -17
  288. package/dist/translator/comment/index[vdom].js +0 -3
  289. package/dist/translator/declaration/index.js +0 -15
  290. package/dist/translator/declaration/index[html].js +0 -12
  291. package/dist/translator/declaration/index[vdom].js +0 -3
  292. package/dist/translator/document-type/index.js +0 -15
  293. package/dist/translator/document-type/index[html].js +0 -12
  294. package/dist/translator/document-type/index[vdom].js +0 -3
  295. package/dist/translator/placeholder/index.js +0 -15
  296. package/dist/translator/placeholder/index[html].js +0 -93
  297. package/dist/translator/placeholder/index[vdom].js +0 -22
  298. package/dist/translator/scriptlet.js +0 -4
  299. package/dist/translator/tag/attribute/directives/class.js +0 -42
  300. package/dist/translator/tag/attribute/directives/index.js +0 -15
  301. package/dist/translator/tag/attribute/directives/no-update-body-if.js +0 -15
  302. package/dist/translator/tag/attribute/directives/no-update-body.js +0 -10
  303. package/dist/translator/tag/attribute/directives/no-update-if.js +0 -12
  304. package/dist/translator/tag/attribute/directives/no-update.js +0 -48
  305. package/dist/translator/tag/attribute/directives/style.js +0 -42
  306. package/dist/translator/tag/attribute/index.js +0 -150
  307. package/dist/translator/tag/attribute/modifiers/index.js +0 -7
  308. package/dist/translator/tag/attribute/modifiers/no-update.js +0 -14
  309. package/dist/translator/tag/attribute/modifiers/scoped.js +0 -23
  310. package/dist/translator/tag/attribute-tag.js +0 -149
  311. package/dist/translator/tag/custom-tag.js +0 -146
  312. package/dist/translator/tag/dynamic-tag.js +0 -74
  313. package/dist/translator/tag/index.js +0 -287
  314. package/dist/translator/tag/macro-tag.js +0 -7
  315. package/dist/translator/tag/native-tag.js +0 -27
  316. package/dist/translator/tag/native-tag[html]/attributes.js +0 -151
  317. package/dist/translator/tag/native-tag[html]/index.js +0 -221
  318. package/dist/translator/tag/native-tag[vdom]/attributes.js +0 -105
  319. package/dist/translator/tag/native-tag[vdom]/index.js +0 -189
  320. package/dist/translator/tag/util.js +0 -246
  321. package/dist/translator/taglib/core/conditional/translate-else-if.js +0 -20
  322. package/dist/translator/taglib/core/conditional/translate-else.js +0 -20
  323. package/dist/translator/taglib/core/conditional/translate-if.js +0 -8
  324. package/dist/translator/taglib/core/conditional/util.js +0 -41
  325. package/dist/translator/taglib/core/index.js +0 -474
  326. package/dist/translator/taglib/core/macro/parse.js +0 -17
  327. package/dist/translator/taglib/core/macro/translate.js +0 -48
  328. package/dist/translator/taglib/core/parse-class.js +0 -79
  329. package/dist/translator/taglib/core/parse-export.js +0 -14
  330. package/dist/translator/taglib/core/parse-import.js +0 -14
  331. package/dist/translator/taglib/core/parse-module-code.js +0 -18
  332. package/dist/translator/taglib/core/parse-static.js +0 -18
  333. package/dist/translator/taglib/core/transform-style.js +0 -66
  334. package/dist/translator/taglib/core/translate-await.js +0 -41
  335. package/dist/translator/taglib/core/translate-body.js +0 -17
  336. package/dist/translator/taglib/core/translate-for.js +0 -156
  337. package/dist/translator/taglib/core/translate-html-comment.js +0 -52
  338. package/dist/translator/taglib/core/translate-include-content.js +0 -53
  339. package/dist/translator/taglib/core/translate-server-only.js +0 -5
  340. package/dist/translator/taglib/core/translate-while.js +0 -32
  341. package/dist/translator/taglib/index.js +0 -6
  342. package/dist/translator/taglib/migrate/all-templates.js +0 -46
  343. package/dist/translator/taglib/migrate/index.js +0 -5
  344. package/dist/translator/text/index.js +0 -10
  345. package/dist/translator/text/index[html].js +0 -12
  346. package/dist/translator/text/index[vdom].js +0 -20
  347. package/dist/translator/util/add-dependencies.js +0 -329
  348. package/dist/translator/util/escape-regexp.js +0 -4
  349. package/dist/translator/util/get-component-files.js +0 -86
  350. package/dist/translator/util/html-out-write.js +0 -15
  351. package/dist/translator/util/key-manager.js +0 -176
  352. package/dist/translator/util/optimize-html-writes.js +0 -52
  353. package/dist/translator/util/optimize-vdom-create.js +0 -164
  354. package/dist/translator/util/plugin-hooks.js +0 -22
  355. package/dist/translator/util/runtime-flags.js +0 -3
  356. package/dist/translator/util/vdom-out-write.js +0 -10
  357. package/dist/translator/util/with-previous-location.js +0 -6
  358. package/docs/10-awesome-marko-features.md +0 -291
  359. package/docs/body-content.md +0 -355
  360. package/docs/class-components.md +0 -1001
  361. package/docs/cloudflare-workers.md +0 -32
  362. package/docs/compiler-hooks.png +0 -0
  363. package/docs/compiler.md +0 -473
  364. package/docs/component-diagram.afdesign +0 -0
  365. package/docs/component-diagram.svg +0 -87
  366. package/docs/concise.md +0 -141
  367. package/docs/conditionals-and-lists.md +0 -72
  368. package/docs/core-tags.md +0 -325
  369. package/docs/custom-tags.md +0 -201
  370. package/docs/editor-plugins.md +0 -45
  371. package/docs/events.md +0 -131
  372. package/docs/express.md +0 -66
  373. package/docs/fastify.md +0 -65
  374. package/docs/getting-started.md +0 -95
  375. package/docs/http.md +0 -34
  376. package/docs/icons/js.svg +0 -4
  377. package/docs/icons/marko.svg +0 -1
  378. package/docs/icons/ts.svg +0 -1
  379. package/docs/installing.md +0 -51
  380. package/docs/koa.md +0 -35
  381. package/docs/lasso.md +0 -196
  382. package/docs/marko-5-upgrade.md +0 -59
  383. package/docs/marko-json.md +0 -248
  384. package/docs/marko-vs-react.md +0 -854
  385. package/docs/redux.md +0 -61
  386. package/docs/rendering.md +0 -268
  387. package/docs/rollup.md +0 -352
  388. package/docs/state.md +0 -105
  389. package/docs/structure.json +0 -49
  390. package/docs/styles.md +0 -29
  391. package/docs/syntax.md +0 -601
  392. package/docs/troubleshooting-streaming.md +0 -68
  393. package/docs/typescript.md +0 -406
  394. package/docs/vite.md +0 -86
  395. package/docs/webpack.md +0 -205
  396. package/docs/why-is-marko-fast.md +0 -239
  397. package/env.js +0 -7
  398. package/helpers/README.md +0 -3
  399. package/helpers/empty.js +0 -4
  400. package/helpers/notEmpty.js +0 -11
  401. package/index-browser.marko +0 -15
  402. package/index.d.ts +0 -375
  403. package/index.js +0 -7
  404. package/legacy-components-browser.marko +0 -15
  405. package/legacy-components.js +0 -7
  406. package/node-require.js +0 -8
  407. package/src/build.json +0 -3
  408. package/src/compiler/config.js +0 -45
  409. package/src/compiler/index.js +0 -164
  410. package/src/compiler/modules.js +0 -5
  411. package/src/core-tags/.eslintrc +0 -5
  412. package/src/core-tags/components/init-components-tag.js +0 -54
  413. package/src/core-tags/components/preferred-script-location-tag.js +0 -25
  414. package/src/core-tags/components/preserve-tag.js +0 -1
  415. package/src/core-tags/core/__flush_here_and_after__.js +0 -44
  416. package/src/core-tags/core/await/AsyncValue.js +0 -121
  417. package/src/core-tags/core/await/client-reorder-runtime.js +0 -51
  418. package/src/core-tags/core/await/index.d.marko +0 -10
  419. package/src/core-tags/core/await/renderer.js +0 -249
  420. package/src/core-tags/core/await/reorderer-renderer.js +0 -156
  421. package/src/index.js +0 -4
  422. package/src/node-require/browser-refresh.js +0 -18
  423. package/src/node-require/hot-reload.js +0 -45
  424. package/src/node-require/index.js +0 -103
  425. package/src/node_modules/@internal/components-beginComponent/index-browser.js +0 -23
  426. package/src/node_modules/@internal/components-beginComponent/index.js +0 -84
  427. package/src/node_modules/@internal/components-beginComponent/package.json +0 -11
  428. package/src/node_modules/@internal/components-define-widget-legacy/index-browser.js +0 -335
  429. package/src/node_modules/@internal/components-define-widget-legacy/index.js +0 -18
  430. package/src/node_modules/@internal/components-define-widget-legacy/package.json +0 -11
  431. package/src/node_modules/@internal/components-endComponent/index-browser.js +0 -5
  432. package/src/node_modules/@internal/components-endComponent/index.js +0 -11
  433. package/src/node_modules/@internal/components-endComponent/package.json +0 -11
  434. package/src/node_modules/@internal/components-entry/index-browser.js +0 -11
  435. package/src/node_modules/@internal/components-entry/index.js +0 -301
  436. package/src/node_modules/@internal/components-entry/package.json +0 -11
  437. package/src/node_modules/@internal/components-entry-legacy/index-browser.js +0 -76
  438. package/src/node_modules/@internal/components-entry-legacy/index.js +0 -16
  439. package/src/node_modules/@internal/components-entry-legacy/package.json +0 -11
  440. package/src/node_modules/@internal/components-registry/index-browser.js +0 -586
  441. package/src/node_modules/@internal/components-registry/index.js +0 -44
  442. package/src/node_modules/@internal/components-registry/package.json +0 -11
  443. package/src/node_modules/@internal/components-util/index-browser.js +0 -152
  444. package/src/node_modules/@internal/components-util/index.js +0 -75
  445. package/src/node_modules/@internal/components-util/package.json +0 -11
  446. package/src/node_modules/@internal/create-readable/index-browser.js +0 -30
  447. package/src/node_modules/@internal/create-readable/index.js +0 -57
  448. package/src/node_modules/@internal/create-readable/package.json +0 -11
  449. package/src/node_modules/@internal/loader/fallback-node.js +0 -89
  450. package/src/node_modules/@internal/loader/index-browser.js +0 -2
  451. package/src/node_modules/@internal/loader/index.js +0 -23
  452. package/src/node_modules/@internal/loader/package.json +0 -10
  453. package/src/node_modules/@internal/preserve-tag/index-browser.js +0 -46
  454. package/src/node_modules/@internal/preserve-tag/index.js +0 -34
  455. package/src/node_modules/@internal/preserve-tag/package.json +0 -11
  456. package/src/node_modules/@internal/require/index-browser.js +0 -15
  457. package/src/node_modules/@internal/require/index-legacy-browser.js +0 -20
  458. package/src/node_modules/@internal/require/index-webpack.js +0 -16
  459. package/src/node_modules/@internal/require/index.js +0 -15
  460. package/src/node_modules/@internal/require/package.json +0 -11
  461. package/src/node_modules/@internal/set-immediate/index-browser.js +0 -19
  462. package/src/node_modules/@internal/set-immediate/index-worker.js +0 -31
  463. package/src/node_modules/@internal/set-immediate/index.js +0 -3
  464. package/src/node_modules/@internal/set-immediate/package.json +0 -11
  465. package/src/node_modules/@internal/set-immediate/queueMicrotask.js +0 -8
  466. package/src/runtime/.eslintrc +0 -5
  467. package/src/runtime/RenderResult.js +0 -112
  468. package/src/runtime/components/Component.js +0 -663
  469. package/src/runtime/components/ComponentDef.js +0 -169
  470. package/src/runtime/components/ComponentsContext.js +0 -59
  471. package/src/runtime/components/GlobalComponentsContext.js +0 -10
  472. package/src/runtime/components/KeySequence.js +0 -16
  473. package/src/runtime/components/ServerComponent.js +0 -73
  474. package/src/runtime/components/State.js +0 -101
  475. package/src/runtime/components/attach-detach.js +0 -60
  476. package/src/runtime/components/defineComponent.js +0 -60
  477. package/src/runtime/components/dom-data.js +0 -8
  478. package/src/runtime/components/event-delegation.js +0 -144
  479. package/src/runtime/components/index.js +0 -1
  480. package/src/runtime/components/legacy/browser.json +0 -9
  481. package/src/runtime/components/legacy/defineComponent-legacy.js +0 -27
  482. package/src/runtime/components/legacy/defineRenderer-legacy.js +0 -171
  483. package/src/runtime/components/legacy/defineWidget-legacy.js +0 -1
  484. package/src/runtime/components/legacy/dependencies/html.js +0 -3
  485. package/src/runtime/components/legacy/dependencies/index.js +0 -177
  486. package/src/runtime/components/legacy/dependencies/vdom.js +0 -3
  487. package/src/runtime/components/legacy/index.js +0 -1
  488. package/src/runtime/components/legacy/jquery.js +0 -52
  489. package/src/runtime/components/legacy/ready.js +0 -152
  490. package/src/runtime/components/legacy/renderer-legacy.js +0 -231
  491. package/src/runtime/components/registry.js +0 -1
  492. package/src/runtime/components/renderer.js +0 -236
  493. package/src/runtime/components/update-manager.js +0 -94
  494. package/src/runtime/createOut.js +0 -13
  495. package/src/runtime/dom-insert.js +0 -77
  496. package/src/runtime/events.js +0 -2
  497. package/src/runtime/helpers/_change-case.js +0 -45
  498. package/src/runtime/helpers/assign.js +0 -21
  499. package/src/runtime/helpers/attr-tag.js +0 -43
  500. package/src/runtime/helpers/class-value.js +0 -30
  501. package/src/runtime/helpers/dynamic-tag.js +0 -181
  502. package/src/runtime/helpers/empty-component.js +0 -1
  503. package/src/runtime/helpers/merge.js +0 -13
  504. package/src/runtime/helpers/of-fallback.js +0 -4
  505. package/src/runtime/helpers/render-tag.js +0 -20
  506. package/src/runtime/helpers/serialize-noop.js +0 -5
  507. package/src/runtime/helpers/style-value.js +0 -45
  508. package/src/runtime/helpers/tags-compat/dom-debug.js +0 -1
  509. package/src/runtime/helpers/tags-compat/dom-debug.mjs +0 -4
  510. package/src/runtime/helpers/tags-compat/dom.js +0 -1
  511. package/src/runtime/helpers/tags-compat/dom.mjs +0 -4
  512. package/src/runtime/helpers/tags-compat/html-debug.js +0 -3
  513. package/src/runtime/helpers/tags-compat/html-debug.mjs +0 -4
  514. package/src/runtime/helpers/tags-compat/html.js +0 -3
  515. package/src/runtime/helpers/tags-compat/html.mjs +0 -4
  516. package/src/runtime/helpers/tags-compat/runtime-dom.js +0 -239
  517. package/src/runtime/helpers/tags-compat/runtime-html.js +0 -136
  518. package/src/runtime/helpers/to-string.js +0 -5
  519. package/src/runtime/html/AsyncStream.js +0 -805
  520. package/src/runtime/html/BufferedWriter.js +0 -52
  521. package/src/runtime/html/StringWriter.js +0 -73
  522. package/src/runtime/html/helpers/_dynamic-attr.js +0 -35
  523. package/src/runtime/html/helpers/attr.js +0 -80
  524. package/src/runtime/html/helpers/attrs.js +0 -26
  525. package/src/runtime/html/helpers/class-attr.js +0 -8
  526. package/src/runtime/html/helpers/data-marko.js +0 -36
  527. package/src/runtime/html/helpers/escape-quotes.js +0 -35
  528. package/src/runtime/html/helpers/escape-script-placeholder.js +0 -24
  529. package/src/runtime/html/helpers/escape-style-placeholder.js +0 -22
  530. package/src/runtime/html/helpers/escape-xml.js +0 -21
  531. package/src/runtime/html/helpers/merge-attrs.js +0 -55
  532. package/src/runtime/html/helpers/props-script.js +0 -32
  533. package/src/runtime/html/helpers/style-attr.js +0 -8
  534. package/src/runtime/html/hot-reload.js +0 -26
  535. package/src/runtime/html/index.js +0 -33
  536. package/src/runtime/html/marko-namespace.js +0 -3
  537. package/src/runtime/renderable.js +0 -194
  538. package/src/runtime/vdom/AsyncVDOMBuilder.js +0 -456
  539. package/src/runtime/vdom/VComment.js +0 -24
  540. package/src/runtime/vdom/VComponent.js +0 -17
  541. package/src/runtime/vdom/VDocumentFragment.js +0 -34
  542. package/src/runtime/vdom/VElement.js +0 -375
  543. package/src/runtime/vdom/VFragment.js +0 -26
  544. package/src/runtime/vdom/VNode.js +0 -100
  545. package/src/runtime/vdom/VText.js +0 -25
  546. package/src/runtime/vdom/helpers/attrs.js +0 -62
  547. package/src/runtime/vdom/helpers/const-element.js +0 -25
  548. package/src/runtime/vdom/helpers/merge-attrs.js +0 -16
  549. package/src/runtime/vdom/hot-reload.js +0 -115
  550. package/src/runtime/vdom/index.js +0 -30
  551. package/src/runtime/vdom/is-text-only.js +0 -10
  552. package/src/runtime/vdom/marko-namespace.js +0 -3
  553. package/src/runtime/vdom/morphdom/fragment.js +0 -95
  554. package/src/runtime/vdom/morphdom/helpers.js +0 -42
  555. package/src/runtime/vdom/morphdom/index.js +0 -741
  556. package/src/runtime/vdom/parse-html.js +0 -18
  557. package/src/runtime/vdom/vdom.js +0 -88
  558. package/src/taglib/index.js +0 -51
  559. package/src/translator/cdata/index.js +0 -15
  560. package/src/translator/cdata/index[html].js +0 -15
  561. package/src/translator/cdata/index[vdom].js +0 -12
  562. package/src/translator/class.js +0 -65
  563. package/src/translator/comment/index.js +0 -15
  564. package/src/translator/comment/index[html].js +0 -17
  565. package/src/translator/comment/index[vdom].js +0 -3
  566. package/src/translator/declaration/index.js +0 -15
  567. package/src/translator/declaration/index[html].js +0 -12
  568. package/src/translator/declaration/index[vdom].js +0 -3
  569. package/src/translator/document-type/index.js +0 -15
  570. package/src/translator/document-type/index[html].js +0 -12
  571. package/src/translator/document-type/index[vdom].js +0 -3
  572. package/src/translator/index.js +0 -551
  573. package/src/translator/placeholder/index.js +0 -15
  574. package/src/translator/placeholder/index[html].js +0 -93
  575. package/src/translator/placeholder/index[vdom].js +0 -22
  576. package/src/translator/scriptlet.js +0 -4
  577. package/src/translator/tag/attribute/directives/class.js +0 -42
  578. package/src/translator/tag/attribute/directives/index.js +0 -15
  579. package/src/translator/tag/attribute/directives/no-update-body-if.js +0 -15
  580. package/src/translator/tag/attribute/directives/no-update-body.js +0 -10
  581. package/src/translator/tag/attribute/directives/no-update-if.js +0 -12
  582. package/src/translator/tag/attribute/directives/no-update.js +0 -48
  583. package/src/translator/tag/attribute/directives/style.js +0 -42
  584. package/src/translator/tag/attribute/index.js +0 -150
  585. package/src/translator/tag/attribute/modifiers/index.js +0 -7
  586. package/src/translator/tag/attribute/modifiers/no-update.js +0 -14
  587. package/src/translator/tag/attribute/modifiers/scoped.js +0 -23
  588. package/src/translator/tag/attribute-tag.js +0 -149
  589. package/src/translator/tag/custom-tag.js +0 -146
  590. package/src/translator/tag/dynamic-tag.js +0 -74
  591. package/src/translator/tag/index.js +0 -287
  592. package/src/translator/tag/macro-tag.js +0 -7
  593. package/src/translator/tag/native-tag.js +0 -27
  594. package/src/translator/tag/native-tag[html]/attributes.js +0 -151
  595. package/src/translator/tag/native-tag[html]/index.js +0 -221
  596. package/src/translator/tag/native-tag[vdom]/attributes.js +0 -105
  597. package/src/translator/tag/native-tag[vdom]/index.js +0 -189
  598. package/src/translator/tag/util.js +0 -246
  599. package/src/translator/taglib/core/conditional/translate-else-if.js +0 -20
  600. package/src/translator/taglib/core/conditional/translate-else.js +0 -20
  601. package/src/translator/taglib/core/conditional/translate-if.js +0 -8
  602. package/src/translator/taglib/core/conditional/util.js +0 -41
  603. package/src/translator/taglib/core/index.js +0 -474
  604. package/src/translator/taglib/core/macro/parse.js +0 -17
  605. package/src/translator/taglib/core/macro/translate.js +0 -48
  606. package/src/translator/taglib/core/parse-class.js +0 -79
  607. package/src/translator/taglib/core/parse-export.js +0 -14
  608. package/src/translator/taglib/core/parse-import.js +0 -14
  609. package/src/translator/taglib/core/parse-module-code.js +0 -18
  610. package/src/translator/taglib/core/parse-static.js +0 -18
  611. package/src/translator/taglib/core/transform-style.js +0 -66
  612. package/src/translator/taglib/core/translate-await.js +0 -41
  613. package/src/translator/taglib/core/translate-body.js +0 -17
  614. package/src/translator/taglib/core/translate-for.js +0 -156
  615. package/src/translator/taglib/core/translate-html-comment.js +0 -52
  616. package/src/translator/taglib/core/translate-include-content.js +0 -53
  617. package/src/translator/taglib/core/translate-server-only.js +0 -5
  618. package/src/translator/taglib/core/translate-while.js +0 -32
  619. package/src/translator/taglib/index.js +0 -7
  620. package/src/translator/taglib/migrate/all-templates.js +0 -46
  621. package/src/translator/taglib/migrate/index.js +0 -5
  622. package/src/translator/text/index.js +0 -10
  623. package/src/translator/text/index[html].js +0 -12
  624. package/src/translator/text/index[vdom].js +0 -20
  625. package/src/translator/util/add-dependencies.js +0 -329
  626. package/src/translator/util/escape-regexp.js +0 -4
  627. package/src/translator/util/get-component-files.js +0 -86
  628. package/src/translator/util/html-out-write.js +0 -15
  629. package/src/translator/util/key-manager.js +0 -176
  630. package/src/translator/util/optimize-html-writes.js +0 -52
  631. package/src/translator/util/optimize-vdom-create.js +0 -164
  632. package/src/translator/util/plugin-hooks.js +0 -22
  633. package/src/translator/util/runtime-flags.js +0 -3
  634. package/src/translator/util/vdom-out-write.js +0 -10
  635. package/src/translator/util/with-previous-location.js +0 -6
  636. package/tags-html.d.ts +0 -3855
  637. package/translator/index.d.ts +0 -7
  638. package/translator/package.json +0 -5
@@ -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).