Skip to content

Commit 3623b48

Browse files
committed
perf: optimize template literal printing in html mode
1 parent e7eb9c3 commit 3623b48

File tree

13 files changed

+59
-15
lines changed

13 files changed

+59
-15
lines changed

.changeset/long-adults-knock.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
"@marko/translator-default": patch
3+
"@marko/compiler": patch
4+
"marko": patch
5+
---
6+
7+
Optimize template literal printing in html output.

packages/translator-default/src/tag/attribute/directives/class.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export default {
1919
} else {
2020
value.parentPath.remove();
2121
}
22-
} else {
22+
} else if (!value.isTemplateLiteral()) {
2323
value.replaceWith(
2424
withPreviousLocation(
2525
t.callExpression(

packages/translator-default/src/tag/attribute/directives/style.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export default {
1919
} else {
2020
value.parentPath.remove();
2121
}
22-
} else {
22+
} else if (!value.isTemplateLiteral()) {
2323
value.replaceWith(
2424
withPreviousLocation(
2525
t.callExpression(

packages/translator-default/src/tag/native-tag[html]/attributes.js

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1-
import { importDefault, normalizeTemplateString } from "@marko/babel-utils";
1+
import {
2+
importDefault,
3+
importNamed,
4+
normalizeTemplateString,
5+
} from "@marko/babel-utils";
26
import { types as t } from "@marko/compiler";
37
import attrHelper from "marko/src/runtime/html/helpers/attr";
8+
import { d as escapeDoubleQuotes } from "marko/src/runtime/html/helpers/escape-quotes";
49

510
import { evaluateAttr } from "../util";
611

@@ -94,6 +99,32 @@ export default function (path, attrs) {
9499
}
95100

96101
curString += attrHelper(name, computed);
102+
} else if (value.type === "TemplateLiteral") {
103+
curString += " " + name + '="';
104+
105+
for (let i = 0; i < value.expressions.length; i++) {
106+
const quasi = value.quasis[i];
107+
const expression = value.expressions[i];
108+
curString += escapeDoubleQuotes(quasi.value.cooked);
109+
quasis.push(curString);
110+
curString = "";
111+
expressions.push(
112+
t.callExpression(
113+
importNamed(
114+
file,
115+
"marko/src/runtime/html/helpers/escape-quotes.js",
116+
"d",
117+
"marko_escape_double_quotes",
118+
),
119+
[expression],
120+
),
121+
);
122+
}
123+
124+
curString +=
125+
escapeDoubleQuotes(
126+
value.quasis[value.expressions.length].value.cooked,
127+
) + '"';
97128
} else {
98129
quasis.push(curString);
99130
curString = "";

packages/translator-default/test/fixtures/attr-escape/snapshots/cjs-expected.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@ exports.default = void 0;
55
var _index = require("marko/src/runtime/html/index.js");
66
var _classValue = _interopRequireDefault(require("marko/src/runtime/helpers/class-value.js"));
77
var _attr = _interopRequireDefault(require("marko/src/runtime/html/helpers/attr.js"));
8+
var _escapeQuotes = require("marko/src/runtime/html/helpers/escape-quotes.js");
89
var _renderer = _interopRequireDefault(require("marko/src/runtime/components/renderer.js"));
910
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
1011
const _marko_componentType = "packages/translator-default/test/fixtures/attr-escape/template.marko",
1112
_marko_template = (0, _index.t)(_marko_componentType);
1213
var _default = exports.default = _marko_template;
1314
const _marko_component = {};
1415
_marko_template._ = (0, _renderer.default)(function (input, out, _componentDef, _component, state, $global) {
15-
out.w(`<div${(0, _attr.default)("class", (0, _classValue.default)(input.className))}${(0, _attr.default)("foo", 'a' + input.foo + 'b')}${(0, _attr.default)("bar", `a ${input.foo} b`)}></div>`);
16+
out.w(`<div${(0, _attr.default)("class", (0, _classValue.default)(input.className))}${(0, _attr.default)("foo", 'a' + input.foo + 'b')} bar="a ${(0, _escapeQuotes.d)(input.foo)} b"></div>`);
1617
}, {
1718
t: _marko_componentType,
1819
i: true,

packages/translator-default/test/fixtures/attr-escape/snapshots/html-expected.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@ const _marko_componentType = "packages/translator-default/test/fixtures/attr-esc
44
export default _marko_template;
55
import _marko_class_merge from "marko/src/runtime/helpers/class-value.js";
66
import _marko_attr from "marko/src/runtime/html/helpers/attr.js";
7+
import { d as _marko_escape_double_quotes } from "marko/src/runtime/html/helpers/escape-quotes.js";
78
import _marko_renderer from "marko/src/runtime/components/renderer.js";
89
const _marko_component = {};
910
_marko_template._ = _marko_renderer(function (input, out, _componentDef, _component, state, $global) {
10-
out.w(`<div${_marko_attr("class", _marko_class_merge(input.className))}${_marko_attr("foo", 'a' + input.foo + 'b')}${_marko_attr("bar", `a ${input.foo} b`)}></div>`);
11+
out.w(`<div${_marko_attr("class", _marko_class_merge(input.className))}${_marko_attr("foo", 'a' + input.foo + 'b')} bar="a ${_marko_escape_double_quotes(input.foo)} b"></div>`);
1112
}, {
1213
t: _marko_componentType,
1314
i: true,

packages/translator-default/test/fixtures/attr-escape/snapshots/htmlProduction-expected.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@ const _marko_componentType = "WJodxLLd",
44
export default _marko_template;
55
import _marko_class_merge from "marko/dist/runtime/helpers/class-value.js";
66
import _marko_attr from "marko/dist/runtime/html/helpers/attr.js";
7+
import { d as _marko_escape_double_quotes } from "marko/dist/runtime/html/helpers/escape-quotes.js";
78
import _marko_renderer from "marko/dist/runtime/components/renderer.js";
89
const _marko_component = {};
910
_marko_template._ = _marko_renderer(function (input, out, _componentDef, _component, state, $global) {
10-
out.w(`<div${_marko_attr("class", _marko_class_merge(input.className))}${_marko_attr("foo", 'a' + input.foo + 'b')}${_marko_attr("bar", `a ${input.foo} b`)}></div>`);
11+
out.w(`<div${_marko_attr("class", _marko_class_merge(input.className))}${_marko_attr("foo", 'a' + input.foo + 'b')} bar="a ${_marko_escape_double_quotes(input.foo)} b"></div>`);
1112
}, {
1213
t: _marko_componentType,
1314
i: true

packages/translator-default/test/fixtures/attr-template-literal-escape/snapshots/cjs-expected.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@
33
exports.__esModule = true;
44
exports.default = void 0;
55
var _index = require("marko/src/runtime/html/index.js");
6-
var _attr = _interopRequireDefault(require("marko/src/runtime/html/helpers/attr.js"));
6+
var _escapeQuotes = require("marko/src/runtime/html/helpers/escape-quotes.js");
77
var _renderer = _interopRequireDefault(require("marko/src/runtime/components/renderer.js"));
88
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
99
const _marko_componentType = "packages/translator-default/test/fixtures/attr-template-literal-escape/template.marko",
1010
_marko_template = (0, _index.t)(_marko_componentType);
1111
var _default = exports.default = _marko_template;
1212
const _marko_component = {};
1313
_marko_template._ = (0, _renderer.default)(function (input, out, _componentDef, _component, state, $global) {
14-
out.w(`<div${(0, _attr.default)("foo", `Hello ${input.name}`)}></div>`);
14+
out.w(`<div foo="Hello ${(0, _escapeQuotes.d)(input.name)}"></div>`);
1515
}, {
1616
t: _marko_componentType,
1717
i: true,

packages/translator-default/test/fixtures/attr-template-literal-escape/snapshots/html-expected.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ import { t as _t } from "marko/src/runtime/html/index.js";
22
const _marko_componentType = "packages/translator-default/test/fixtures/attr-template-literal-escape/template.marko",
33
_marko_template = _t(_marko_componentType);
44
export default _marko_template;
5-
import _marko_attr from "marko/src/runtime/html/helpers/attr.js";
5+
import { d as _marko_escape_double_quotes } from "marko/src/runtime/html/helpers/escape-quotes.js";
66
import _marko_renderer from "marko/src/runtime/components/renderer.js";
77
const _marko_component = {};
88
_marko_template._ = _marko_renderer(function (input, out, _componentDef, _component, state, $global) {
9-
out.w(`<div${_marko_attr("foo", `Hello ${input.name}`)}></div>`);
9+
out.w(`<div foo="Hello ${_marko_escape_double_quotes(input.name)}"></div>`);
1010
}, {
1111
t: _marko_componentType,
1212
i: true,

packages/translator-default/test/fixtures/attr-template-literal-escape/snapshots/htmlProduction-expected.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ import { t as _t } from "marko/dist/runtime/html/index.js";
22
const _marko_componentType = "jF_vuKKj",
33
_marko_template = _t(_marko_componentType);
44
export default _marko_template;
5-
import _marko_attr from "marko/dist/runtime/html/helpers/attr.js";
5+
import { d as _marko_escape_double_quotes } from "marko/dist/runtime/html/helpers/escape-quotes.js";
66
import _marko_renderer from "marko/dist/runtime/components/renderer.js";
77
const _marko_component = {};
88
_marko_template._ = _marko_renderer(function (input, out, _componentDef, _component, state, $global) {
9-
out.w(`<div${_marko_attr("foo", `Hello ${input.name}`)}></div>`);
9+
out.w(`<div foo="Hello ${_marko_escape_double_quotes(input.name)}"></div>`);
1010
}, {
1111
t: _marko_componentType,
1212
i: true

0 commit comments

Comments
 (0)