WebReflection / hyperHTML

A Fast & Light Virtual DOM Alternative
ISC License
3.07k stars 112 forks source link

Unmodified content rerendered when code is compiled with TypeScript to ES5 #270

Closed wlinna closed 6 years ago

wlinna commented 6 years ago

In short, hyperHTM doesn't work with TypeScript, because when code is compiled with TypeScript to ES5, unmodified content is rerendered. With Babel that doesn't happen.

I created a pen to demonstrate this issue:

https://codepen.io/anon/pen/oPoWXX?editors=0011

To see the issue, select TypeScript as a preprocessor (if it isn't already), start the video, and then press the button. The problem doesn't occur when using Babel as a preprocessor.

While I know this is a TypeScript problem (and you won't like seeing this issue here), I reported it here for two reasons:

I know that you attempted to workaround the issue, but I don't know if it is present in hyperHTML v2, or if it ever covered this issue (completely).

It might be worth mentioning in the documentation, that using TypeScript with ES5 output is problematic, even if the problem is on the TypeScript side.

*I read https://github.com/Microsoft/TypeScript/issues/17956, https://github.com/WebReflection/hyperHTML/pull/101, https://github.com/Microsoft/TypeScript/pull/18300 and some of your blog-posts

WebReflection commented 6 years ago

This is your issue in a nutshell: TypeScript does not transpile ES6 string literals in a standard way.

Literally nothing I can do with this, and lit-html has the same exact issue.

Please talk to TypeScript chaps or ask CodePen if they are embedding an updated version of TypeScript.

var invokes = [];
function test(template) {
  invokes.push(template); 
}

function update(value) {
  test`some ${value}!`;
}

update(1);
update(2);

document.body.textContent = invokes[0] === invokes[1];

That should be true but it's false in TypeScript.

WebReflection commented 6 years ago

FYI I've fixed with yet another workaround TypeScript shenanigans hoping they will stop breaking standards behavior.

As soon as unpkg/hyperhtml returns version 2.13.1 your code pen should work just fine even in TypeScript.

wlinna commented 6 years ago

Thank you very much. You were quicker than I anticipated, and you even came up with a workaround. The pen works correctly now.

I'm going to bring this up at TypeScript's issue tracker in the near future.