<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Nozomu Ikuta</title>
    <description>The latest articles on DEV Community by Nozomu Ikuta (@nozomuikuta).</description>
    <link>https://dev.to/nozomuikuta</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F113610%2F9683a692-a055-4e7c-ae17-7c54adc4b39a.png</url>
      <title>DEV Community: Nozomu Ikuta</title>
      <link>https://dev.to/nozomuikuta</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nozomuikuta"/>
    <language>en</language>
    <item>
      <title>Vue RFCs: Changs on Global APIs and related things</title>
      <dc:creator>Nozomu Ikuta</dc:creator>
      <pubDate>Sun, 26 Jan 2020 14:53:58 +0000</pubDate>
      <link>https://dev.to/nozomuikuta/vue-rfcs-changs-on-global-apis-and-related-things-347j</link>
      <guid>https://dev.to/nozomuikuta/vue-rfcs-changs-on-global-apis-and-related-things-347j</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;I summarized what changes will come in Vue 3, especially about global API related things.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Self-contained apps&lt;/li&gt;
&lt;li&gt;Tree-shaking support&lt;/li&gt;
&lt;li&gt;APIs that are no longer supported&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Self-contained apps
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Problem
&lt;/h3&gt;

&lt;p&gt;With Vue 2, all Vue applications in a page are affected by some global APIs at the same time. This is because their behavior derives from only one root constructor, &lt;code&gt;Vue()&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// In Page A...&lt;/span&gt;

&lt;span class="nx"&gt;Vue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ignoredElements&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="cm"&gt;/* ... */&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nx"&gt;Vue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="cm"&gt;/* ... */&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;Vue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mixin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="cm"&gt;/* ... */&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;Vue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;component&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="cm"&gt;/* ... */&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;Vue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;directive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="cm"&gt;/* ... */&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// will affect all the apps&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;appA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Vue&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;appB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Vue&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;appC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Vue&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;p&gt;As of Vue 3, Vue applications come to be created via &lt;code&gt;createApp()&lt;/code&gt; function, and the apps are self-contained and have no influence on each other.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Vue.use() is no longer available&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;appA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createApp&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;appB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createApp&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;appC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createApp&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Each app has "global" API to change its own behavior only&lt;/span&gt;
&lt;span class="nx"&gt;appA&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;appA&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ignoredElements&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="cm"&gt;/* ... */&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nx"&gt;appA&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="cm"&gt;/* ... */&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;appA&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mixin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="cm"&gt;/* ... */&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;appA&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;component&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="cm"&gt;/* ... */&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;appA&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;directive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="cm"&gt;/* ... */&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// And `new Vue().$mount()` is replaced by app's `mount()` method.&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want to know more detail, see &lt;a href="https://github.com/vuejs/rfcs/blob/master/active-rfcs/0009-global-api-change.md"&gt;RFC0009&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tree-shaking support
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Problem
&lt;/h3&gt;

&lt;p&gt;While some global APIs change Vue's behavior as above, other don't do that but just provide utilities.&lt;/p&gt;

&lt;p&gt;In Vue 2, all global APIs are registered on &lt;code&gt;Vue()&lt;/code&gt; constructor function so that they are always included in the bundle files, which results in larger size of bundle files.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;p&gt;In Vue 3, global APIs which don't change Vue's (or each app's) behavior are no longer registered on &lt;code&gt;Vue()&lt;/code&gt; constructor function. In other words, they are no longer automatically included in the bundle files. Instead, we can &lt;em&gt;import&lt;/em&gt; them only when we need.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Vue.nextTick()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Vue.observable()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Vue.version&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Vue.compile()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Vue.set()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Vue.delete()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;nextTick&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="nx"&gt;nextTick&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hello!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want to know more detail, see &lt;a href="https://github.com/vuejs/rfcs/blob/master/active-rfcs/0004-global-api-treeshaking.md"&gt;RFC0004&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  APIs that are no longer supported
&lt;/h2&gt;

&lt;p&gt;In this section, I will refer to APIs which are no longer supported.&lt;/p&gt;

&lt;p&gt;Firstly, &lt;code&gt;Vue.config.productionTip&lt;/code&gt; is no longer provided because in most cases there is alternative way to achieve the goal that this API is for. See &lt;a href="https://github.com/vuejs/rfcs/blob/master/active-rfcs/0009-global-api-change.md#remove-configproductiontip"&gt;this part of RFC0009&lt;/a&gt; for more detail.&lt;/p&gt;

&lt;p&gt;Secondly, &lt;code&gt;Vue.config.ignoredElements&lt;/code&gt; is replaced by &lt;code&gt;config.isCustomElement()&lt;/code&gt; function of each application. See &lt;a href="https://github.com/vuejs/rfcs/blob/master/active-rfcs/0009-global-api-change.md#configignoredelements---configiscustomelement"&gt;this part of RFC0009&lt;/a&gt; from more detail.&lt;/p&gt;

&lt;p&gt;Thirdly, &lt;code&gt;Vue.config.keyCodes&lt;/code&gt; is no longer available. In Vue 3, &lt;code&gt;KeyboardEvent.key&lt;/code&gt; is used as &lt;code&gt;v-on&lt;/code&gt; modifier. Actually, &lt;code&gt;KeyboardEvent.keyCode&lt;/code&gt; is deprecated and replaced by &lt;code&gt;KeyboardEvent.key&lt;/code&gt;. That is, this API is simply redundant. See &lt;a href="https://github.com/vuejs/rfcs/blob/master/active-rfcs/0014-drop-keycode-support.md"&gt;RFC0014&lt;/a&gt; from more detail.&lt;/p&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;In this post, it is explained that Vue 3's Global API changes. I will try to summarized other &lt;a href="https://github.com/vuejs/rfcs/tree/master/active-rfcs"&gt;active RFCs&lt;/a&gt; as well.&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>vue</category>
    </item>
    <item>
      <title>Change on study plan (2)</title>
      <dc:creator>Nozomu Ikuta</dc:creator>
      <pubDate>Thu, 16 Jan 2020 12:27:55 +0000</pubDate>
      <link>https://dev.to/nozomuikuta/change-on-study-plan-2-5bek</link>
      <guid>https://dev.to/nozomuikuta/change-on-study-plan-2-5bek</guid>
      <description>&lt;p&gt;Since first day of the year, I have been writing posts everyday.&lt;/p&gt;

&lt;p&gt;But, I found that every single day is not enough long to write posts that are informative to others.&lt;/p&gt;

&lt;p&gt;As far as I see articles posted on DEV Community, well-summarized and relatively longer post seems to “get popular”. Popularity and usefulness are not necessarily cause and effect, but I think they are correlated.&lt;/p&gt;

&lt;p&gt;I will try to make posts every Monday for the time being.&lt;/p&gt;

</description>
      <category>devjournal</category>
    </item>
    <item>
      <title>What I learned so far by writing 14 posts everyday</title>
      <dc:creator>Nozomu Ikuta</dc:creator>
      <pubDate>Wed, 15 Jan 2020 14:59:05 +0000</pubDate>
      <link>https://dev.to/nozomuikuta/what-i-learned-so-far-by-writing-14-posts-everyday-584k</link>
      <guid>https://dev.to/nozomuikuta/what-i-learned-so-far-by-writing-14-posts-everyday-584k</guid>
      <description>&lt;p&gt;What I learned so far by writing 14 posts everyday&lt;/p&gt;

&lt;h1&gt;
  
  
  Pros
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;To collect topics about which I write a post everyday, I became more eager to keep studying (someone says that now method became more important than its purpose. But, What I can get as a result is the most important 😄)&lt;/li&gt;
&lt;li&gt;To submit a post everyday, I came to be more careful with time management&lt;/li&gt;
&lt;li&gt;I'm feeling I became A little bit more familiar with English language&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Cons
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;So hard! (just because I work everyday, too!)&lt;/li&gt;
&lt;li&gt;Each post is likely to be shorter and less informative&lt;/li&gt;
&lt;li&gt;...It's 11:46 p.m. now...hurry up...&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  What I should do for better performance
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Acquire fluency in English so that I can write faster&lt;/li&gt;
&lt;li&gt;Learn how to summarize and visualized what I learn everyday&lt;/li&gt;
&lt;li&gt;Learn how to write posts informative to others &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As for third task, the reason is that I'm "taking a room" in this community site. Even if they are so open-minded, here is not my personal space. In addition, I want to give back something to others as anonymous people on the web did for me when I was a newbie.)&lt;/p&gt;

</description>
      <category>motivation</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>Study Log: Reading Vue's RFCs (3)</title>
      <dc:creator>Nozomu Ikuta</dc:creator>
      <pubDate>Tue, 14 Jan 2020 11:12:56 +0000</pubDate>
      <link>https://dev.to/nozomuikuta/study-log-reading-vue-s-rfcs-3-lii</link>
      <guid>https://dev.to/nozomuikuta/study-log-reading-vue-s-rfcs-3-lii</guid>
      <description>&lt;p&gt;I've read all the &lt;a href="https://github.com/vuejs/rfcs/tree/master/active-rfcs"&gt;Vue's active RFCs&lt;/a&gt; and related documents.&lt;/p&gt;

&lt;p&gt;I categorized them into some groups according to the topics and am going to share it at internal study meeting in my company.&lt;/p&gt;

&lt;p&gt;Besides the meeting, I, by myself, will study RFCs in more depth so that I can summarized them in the way the article can be more informative to Dev community.&lt;/p&gt;




&lt;p&gt;I decided to continue to keep posting, and also tweet my posts with hash tag.&lt;/p&gt;

&lt;p&gt;I believing in openness of this community, but I do appreciate if you tell me the more valuable way I can contribute to the community.&lt;/p&gt;

</description>
      <category>motivation</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>Study Log: Reading Vue's RFCs (2)</title>
      <dc:creator>Nozomu Ikuta</dc:creator>
      <pubDate>Mon, 13 Jan 2020 14:53:30 +0000</pubDate>
      <link>https://dev.to/nozomuikuta/study-log-reading-vue-s-rfcs-2-3j1a</link>
      <guid>https://dev.to/nozomuikuta/study-log-reading-vue-s-rfcs-2-3j1a</guid>
      <description>&lt;p&gt;Continued from &lt;a href="https://dev.to/nozomuikuta/study-log-reading-vue-s-rfcs-793"&gt;the last post&lt;/a&gt;, I've reading &lt;a href="https://github.com/vuejs/rfcs/tree/master/active-rfcs"&gt;active RFCs of Vue.js&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now, I'm reading the last one, composition API, which I skipped at first because it is long.&lt;/p&gt;

&lt;p&gt;I would like to visualize what I learned about RFCs. That's because the reason I write posts every day is not only keep my motivation to learn things but improving skills of writing about them in English. I hope trying new ways would be helpful for that purpose.&lt;/p&gt;




&lt;p&gt;By the way, I'm feeling that most of posts I've wrote so far are not informative to other people in this community. They are just "memo" about my study. Should it be Twitter that I write down daily thoughts?&lt;br&gt;
I'm not sure to what extent the contents can be written freely.&lt;/p&gt;

&lt;p&gt;In addition, I'm tweeting every time I write a post with #DevCommunity hash tag. Should it be only when I think the post is informative to others in the community that I add this tag?&lt;/p&gt;




&lt;p&gt;I decided to not attach &lt;code&gt;2020&lt;/code&gt; tag to posts of my devjournal since it's included in the title of the series. This change is applied to the past posts as well.&lt;/p&gt;

</description>
      <category>motivation</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>Study Log: Reading Vue's RFCs</title>
      <dc:creator>Nozomu Ikuta</dc:creator>
      <pubDate>Sun, 12 Jan 2020 14:41:51 +0000</pubDate>
      <link>https://dev.to/nozomuikuta/study-log-reading-vue-s-rfcs-793</link>
      <guid>https://dev.to/nozomuikuta/study-log-reading-vue-s-rfcs-793</guid>
      <description>&lt;p&gt;In &lt;a href="https://dev.to/nozomuikuta/change-on-study-plan-5b8o"&gt;the last post&lt;/a&gt; of "My Dev Journal of 2020" series, I decided to research and summarize &lt;a href="https://github.com/vuejs/rfcs"&gt;RFCs of Vue.js&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I've read 9 of 18 &lt;a href="https://github.com/vuejs/rfcs/tree/master/active-rfcs"&gt;active RFCs&lt;/a&gt; and am reading 10th, which is about &lt;a href="https://github.com/vuejs/rfcs/blob/master/active-rfcs/0011-v-model-api-change.md"&gt;new design of &lt;code&gt;v-model&lt;/code&gt; API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I would be able to finish reading all RFCs in tomorrow.&lt;/p&gt;

</description>
      <category>motivation</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>Change on study plan</title>
      <dc:creator>Nozomu Ikuta</dc:creator>
      <pubDate>Sat, 11 Jan 2020 14:59:16 +0000</pubDate>
      <link>https://dev.to/nozomuikuta/change-on-study-plan-5b8o</link>
      <guid>https://dev.to/nozomuikuta/change-on-study-plan-5b8o</guid>
      <description>&lt;p&gt;I've been writing &lt;a href="https://dev.to/nozomuikuta/day-1-introduction-4log"&gt;a series&lt;/a&gt; since few days ago.&lt;/p&gt;

&lt;p&gt;But, through next week, I have to research &lt;a href="https://github.com/vuejs/vue-next"&gt;new features of the next version of Vue.js&lt;/a&gt;, which are not yet well-documented.&lt;/p&gt;

&lt;p&gt;I will share them with DEV community when it's done.&lt;/p&gt;

&lt;p&gt;This post has been written just for devjournal of my own.&lt;/p&gt;

</description>
      <category>motivation</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>How can I read source code and summarize them more efficiently?</title>
      <dc:creator>Nozomu Ikuta</dc:creator>
      <pubDate>Fri, 10 Jan 2020 07:33:02 +0000</pubDate>
      <link>https://dev.to/nozomuikuta/how-can-i-read-source-code-and-summarize-them-more-efficiently-ak5</link>
      <guid>https://dev.to/nozomuikuta/how-can-i-read-source-code-and-summarize-them-more-efficiently-ak5</guid>
      <description>&lt;p&gt;How can I read OSS source code and summarize them more efficiently?&lt;/p&gt;

&lt;p&gt;I've been writing a series whose name is "&lt;a href="https://dev.to/nozomuikuta/day-1-introduction-4log"&gt;How lit-html works&lt;/a&gt;" since days ago, which is one of &lt;a href="https://dev.to/nozomuikuta/study-plan-for-2020-2if8"&gt;my goals for 2020&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Writing posts everyday was harder than I expected. But it is also exciting and making me motivated. &lt;/p&gt;

&lt;p&gt;Now I'm thinking that the way I'm doing is not efficient. That is, reading parts of source code everyday and write a post about them. In this way, I can't understand a part accurately at that time I read the part, because I don't know whole picture in advance.&lt;/p&gt;

&lt;p&gt;I would like to hear your ideas or way to read source code, especially OSS.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>Exploring How lit-html Works: render Function</title>
      <dc:creator>Nozomu Ikuta</dc:creator>
      <pubDate>Thu, 09 Jan 2020 09:37:47 +0000</pubDate>
      <link>https://dev.to/nozomuikuta/exploring-how-lit-html-works-render-function-1l71</link>
      <guid>https://dev.to/nozomuikuta/exploring-how-lit-html-works-render-function-1l71</guid>
      <description>&lt;p&gt;In this series, How lit-html works, I will explore (not explain) internal implementation of &lt;a href="https://lit-html.polymer-project.org/"&gt;lit-html&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In the last 4 posts, we saw what &lt;code&gt;TemplateResult&lt;/code&gt; and &lt;code&gt;SVGTemplateResult&lt;/code&gt; looks like.&lt;/p&gt;

&lt;p&gt;From now on, I will explore the &lt;code&gt;render&lt;/code&gt; function.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;code&gt;render&lt;/code&gt; function
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;render&lt;/code&gt; function is defined beside a variable whose name is &lt;code&gt;parts&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;WeakMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;NodePart&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;render&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Element&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nx"&gt;DocumentFragment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nb"&gt;Partial&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;RenderOptions&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;part&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;removeNodes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstChild&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nx"&gt;part&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;NodePart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                  &lt;span class="nx"&gt;templateFactory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;appendInto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This function receives two arguments. First one is an instance of &lt;code&gt;TemplateResult&lt;/code&gt; or &lt;code&gt;SVGTemplateResult&lt;/code&gt;. Second is the &lt;code&gt;container&lt;/code&gt;, which is a DOM parent inside which the content is rendered.&lt;/p&gt;

&lt;h2&gt;
  
  
  Searching Cache
&lt;/h2&gt;

&lt;p&gt;Firstly, &lt;code&gt;render&lt;/code&gt; function checks if an instance of &lt;code&gt;NodePart&lt;/code&gt; class is stored in &lt;code&gt;parts&lt;/code&gt; with the &lt;code&gt;container&lt;/code&gt; as a key.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a New &lt;code&gt;NodePart&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;If a cached NodePart instance is not found, then all the direct children of the container are removed by &lt;code&gt;removeNodes&lt;/code&gt; function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;removeNodes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Node&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Node&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nextSibling&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;removeChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The algorithm is quite similar to &lt;code&gt;reparentNodes&lt;/code&gt; function that I saw in &lt;a href="https://dev.to/nozomuikuta/draft-exploring-how-lit-html-works-templateresult-and-svgtemplateresult-constructors-4-3p1i"&gt;the last post&lt;/a&gt;. Only difference is how the functions manipulate DOM tree.&lt;/p&gt;

&lt;p&gt;After cleaning up the &lt;code&gt;container&lt;/code&gt;, a new NodePart instance is registered into the &lt;code&gt;parts&lt;/code&gt; and is associated with with the &lt;code&gt;container&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rendering
&lt;/h2&gt;

&lt;p&gt;Finally, &lt;code&gt;render&lt;/code&gt; function lets the NodePart instance call three methods of it, but I will explore this part in later posts. Instead, I will recap what WeakMap is, because it's worth using in other development as well.&lt;/p&gt;

&lt;h1&gt;
  
  
  WeakMap
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap"&gt;MDN&lt;/a&gt; says  that the WeakMap object is a collection of key/value pairs and the keys must be objects.&lt;/p&gt;

&lt;p&gt;The word "weak" here means that the reference from weak map to the key object doesn't prevent the object from being garbage collected.&lt;/p&gt;

&lt;p&gt;Thus, it is really convenient to store data in a WeakMap as a cache. We don't have to check, every time we do something or periodically the data of the object, whether the data is no longer used.&lt;/p&gt;

&lt;p&gt;Just for information, there are also &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map"&gt;Map&lt;/a&gt;, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set"&gt;Set&lt;/a&gt;, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet"&gt;WeakSet&lt;/a&gt;, each of which has suitable situation.&lt;/p&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;So far, I learned the following points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;render&lt;/code&gt; function caches NodePart.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;render&lt;/code&gt; function creates a new NodePart if no corresponding cache is found.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;render&lt;/code&gt; function delegates actual rendering process to the NodePart instance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From the next post, I will dive into the NodePart class.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>webcomponents</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>Exploring How lit-html Works: TemplateResult and SVGTemplateResult constructors (4)</title>
      <dc:creator>Nozomu Ikuta</dc:creator>
      <pubDate>Wed, 08 Jan 2020 10:23:04 +0000</pubDate>
      <link>https://dev.to/nozomuikuta/draft-exploring-how-lit-html-works-templateresult-and-svgtemplateresult-constructors-4-3p1i</link>
      <guid>https://dev.to/nozomuikuta/draft-exploring-how-lit-html-works-templateresult-and-svgtemplateresult-constructors-4-3p1i</guid>
      <description>&lt;p&gt;In this series, How lit-html works, I will explore (not explain) internal implementation of &lt;a href="https://lit-html.polymer-project.org/"&gt;lit-html&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://dev.to/nozomuikuta/exploring-how-lit-html-works-templateresult-and-svgtemplateresult-constructors-3-2c9n"&gt;the previous post&lt;/a&gt;, we saw how &lt;code&gt;getHTML()&lt;/code&gt; method of &lt;code&gt;TemplateResult&lt;/code&gt; class handles attribute expressions and it cannot always parse comment-like string as expected.&lt;/p&gt;

&lt;p&gt;In this post, I will explore the &lt;code&gt;reparentNodes&lt;/code&gt; function, which is also one that I skipped in &lt;a href="https://dev.to/nozomuikuta/exploring-how-lit-html-works-templateresult-and-svgtemplateresult-constructors-g5h"&gt;the past post&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Recap of &lt;code&gt;getTemplateElement()&lt;/code&gt; method of &lt;code&gt;SVGTemplateResult&lt;/code&gt; class
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;getTemplateElement&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nx"&gt;HTMLTemplateElement&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getTemplateElement&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;svgElement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstChild&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;removeChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;svgElement&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;reparentNodes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;svgElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstChild&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;getTemplateElement()&lt;/code&gt; method removes the redundant &lt;code&gt;svg&lt;/code&gt; element from the content of HTML template element, which is originally added by &lt;code&gt;getHTML()&lt;/code&gt; method.&lt;/p&gt;

&lt;p&gt;If I passed this string to &lt;code&gt;svg&lt;/code&gt; tag function, the string returned by &lt;code&gt;getHTML()&lt;/code&gt; method is like that below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;templateResult&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;svg&lt;/span&gt;&lt;span class="s2"&gt;`
  &amp;lt;svg id="my-svg"&amp;gt;
    &amp;lt;circle cx="100" cy="100" r="100"/&amp;gt;
  &amp;lt;/svg&amp;gt;
  &amp;lt;svg id="my-another-svg"&amp;gt;
    &amp;lt;circle cx="100" cy="100" r="100"/&amp;gt;
  &amp;lt;/svg&amp;gt;
`&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;templateResult&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getHTML&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="c1"&gt;// =&amp;gt; &lt;/span&gt;
&lt;span class="c1"&gt;// &amp;lt;svg&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;//  &amp;lt;svg id="my-svg"&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;//    &amp;lt;circle cx="100" cy="100" r="100"/&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;//  &amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;//  &amp;lt;svg id="my-another-svg"&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;//    &amp;lt;circle cx="100" cy="100" r="100"/&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;//  &amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, the root &lt;code&gt;svg&lt;/code&gt; element added by &lt;code&gt;getHTML()&lt;/code&gt; method is removed from the content of the HTML template element.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;svgElement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstChild&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;removeChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;svgElement&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// =&amp;gt; shown like below and #document-fragment is empty...&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;lt;template&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;//   #document-fragment&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;lt;/template&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After this process is the place where &lt;code&gt;reparentNodes&lt;/code&gt; function comes into play.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;code&gt;reparentNodes&lt;/code&gt; function
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;reparentNodes&lt;/code&gt; is called with the &lt;code&gt;content&lt;/code&gt; as &lt;code&gt;container&lt;/code&gt; and first child of the extra &lt;code&gt;svg&lt;/code&gt; element, in other words, &lt;code&gt;svg&lt;/code&gt; element whose id is &lt;code&gt;my-svg&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;reparentNodes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Node&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Node&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="nx"&gt;before&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Node&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nextSibling&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;insertBefore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;before&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In first while loop, since &lt;code&gt;start&lt;/code&gt; (&lt;code&gt;svg&lt;/code&gt; element whose id is &lt;code&gt;my-svg&lt;/code&gt;) is not the same as &lt;code&gt;end&lt;/code&gt; (&lt;code&gt;null&lt;/code&gt;), the element is inserted to the &lt;code&gt;container&lt;/code&gt; as the last child.&lt;/p&gt;

&lt;p&gt;In second while loop, since &lt;code&gt;start&lt;/code&gt; (&lt;code&gt;svg&lt;/code&gt; element whose id is &lt;code&gt;my-another-svg&lt;/code&gt;) is also not the same as &lt;code&gt;end&lt;/code&gt; (&lt;code&gt;null&lt;/code&gt;), the element is inserted to the &lt;code&gt;container&lt;/code&gt; as the last child.&lt;/p&gt;

&lt;p&gt;In third while loop, since &lt;code&gt;start&lt;/code&gt; (&lt;code&gt;nextSibling&lt;/code&gt; of the &lt;code&gt;svg&lt;/code&gt; element whose id is &lt;code&gt;my-another-svg&lt;/code&gt;) is the same as &lt;code&gt;end&lt;/code&gt; (&lt;code&gt;null&lt;/code&gt;), the loop breaks.&lt;/p&gt;

&lt;p&gt;The reasons all the elements are inserted as the last child is that, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Node/insertBefore"&gt;as written in MDN&lt;/a&gt;, &lt;code&gt;Node.insertBefore(newNode, referenceNode)&lt;/code&gt; method inserts &lt;code&gt;newNode&lt;/code&gt; as the last child to the Node, if &lt;code&gt;referenceNode&lt;/code&gt; node is &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So, it is guaranteed that the order of elements of which the original string is consist of doesn't change.&lt;/p&gt;

&lt;p&gt;Finally, the HTML template element is again consisted of the original elements without the redundant &lt;code&gt;svg&lt;/code&gt; element.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;template&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// =&amp;gt; shown like below...&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;lt;template&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;//   #document-fragment&lt;/span&gt;
&lt;span class="c1"&gt;//    &amp;lt;svg id="my-svg"&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;//      &amp;lt;circle cx="100" cy="100" r="100"/&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;//    &amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;//    &amp;lt;svg id="my-another-svg"&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;//      &amp;lt;circle cx="100" cy="100" r="100"/&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;//    &amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;lt;/template&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;code&gt;reparentNodes&lt;/code&gt; function is used in other places in lit-html so I will encounter it again later.&lt;/p&gt;

&lt;p&gt;In addition, lit-html is exporting &lt;code&gt;reparentNodes&lt;/code&gt; function so that you can use this function as utility if you want (e.g. extending lit-html).&lt;/p&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;So far, I learned the following points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;(Again) &lt;code&gt;getHTML()&lt;/code&gt; method of &lt;code&gt;SVGTemplateResult&lt;/code&gt; class adds a extra &lt;code&gt;svg&lt;/code&gt; element to the original template so that it can be parsed in the correct namespace.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;getTemplateElement()&lt;/code&gt; method returns template element, with only the extra &lt;code&gt;svg&lt;/code&gt; element removed.&lt;/li&gt;
&lt;li&gt;Part of this unwrapping operation is done by &lt;code&gt;reparentNodes&lt;/code&gt; function, which is exported, and is available to developers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, I've explored all the methods of &lt;code&gt;TemplateResult&lt;/code&gt; and &lt;code&gt;SVGTemplateResult&lt;/code&gt; class.&lt;/p&gt;

&lt;p&gt;From the next post, I will dive into the &lt;code&gt;render&lt;/code&gt; function, which is another essential part of lit-html, to know how the library renders the content of HTML template element to the real DOM tree.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>webcomponents</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>Exploring How lit-html Works: TemplateResult and SVGTemplateResult constructors (3)</title>
      <dc:creator>Nozomu Ikuta</dc:creator>
      <pubDate>Tue, 07 Jan 2020 13:53:15 +0000</pubDate>
      <link>https://dev.to/nozomuikuta/exploring-how-lit-html-works-templateresult-and-svgtemplateresult-constructors-3-2c9n</link>
      <guid>https://dev.to/nozomuikuta/exploring-how-lit-html-works-templateresult-and-svgtemplateresult-constructors-3-2c9n</guid>
      <description>&lt;p&gt;In this series, How lit-html works, I will explore (not explain) internal implementation of &lt;a href="https://lit-html.polymer-project.org/"&gt;lit-html&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://dev.to/nozomuikuta/exploring-how-lit-html-works-templateresult-and-svgtemplateresult-constructors-2-5bbc"&gt;the previous post&lt;/a&gt;, we saw how how lit-html uses Trusted Types API to convert template strings to trusted HTML string.&lt;/p&gt;

&lt;p&gt;In this post, I will dive into &lt;code&gt;getHTML()&lt;/code&gt; method of &lt;code&gt;TemplateResult&lt;/code&gt; more deeply.&lt;/p&gt;

&lt;h1&gt;
  
  
  Handling Comment-Like Expressions in the Template Literals
&lt;/h1&gt;

&lt;p&gt;In &lt;a href="https://dev.to/nozomuikuta/exploring-how-lit-html-works-templateresult-and-svgtemplateresult-constructors-g5h"&gt;the past post&lt;/a&gt;, I said that if-statements and related lines in &lt;code&gt;getHTML()&lt;/code&gt; method of &lt;code&gt;TemplateResult&lt;/code&gt; class are to handle comment-like strings.&lt;/p&gt;

&lt;p&gt;Let's look into this point.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;getHTML&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;strings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;isCommentBinding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;strings&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;commentOpen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lastIndexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;!--&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;isCommentBinding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;commentOpen&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;isCommentBinding&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
        &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;indexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;--&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;commentOpen&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;attributeMatch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;lastAttributeNameRegex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;attributeMatch&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;html&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isCommentBinding&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;commentMarker&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;nodeMarker&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;html&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;substr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;attributeMatch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;attributeMatch&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
          &lt;span class="nx"&gt;attributeMatch&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;boundAttributeSuffix&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;attributeMatch&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
          &lt;span class="nx"&gt;marker&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;html&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;strings&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;getHTML()&lt;/code&gt; method does conditional string concatenation based on the result of regular expression matching.&lt;/p&gt;

&lt;p&gt;The definition of the regular expression (&lt;code&gt;lastAttributeNameRegex&lt;/code&gt;) is like below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lastAttributeNameRegex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;([&lt;/span&gt;&lt;span class="sr"&gt; &lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;09&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;0a&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;0c&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;0d&lt;/span&gt;&lt;span class="se"&gt;])([^\0&lt;/span&gt;&lt;span class="sr"&gt;-&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;1F&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;7F-&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;9F "'&amp;gt;=&lt;/span&gt;&lt;span class="se"&gt;/]&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;)([&lt;/span&gt;&lt;span class="sr"&gt; &lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;09&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;0a&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;0c&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;0d&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;*=&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt; &lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;09&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;0a&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;0c&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;0d&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;(?:[^&lt;/span&gt;&lt;span class="sr"&gt; &lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;09&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;0a&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;0c&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;0d"'`&amp;lt;&amp;gt;=&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;*|"&lt;/span&gt;&lt;span class="se"&gt;[^&lt;/span&gt;&lt;span class="sr"&gt;"&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;*|'&lt;/span&gt;&lt;span class="se"&gt;[^&lt;/span&gt;&lt;span class="sr"&gt;'&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;))&lt;/span&gt;&lt;span class="sr"&gt;$/&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since &lt;a href="https://github.com/Polymer/lit-html/blob/f69936e1b80d3ac0c34cd599f611846cdfc9d898/src/lib/template.ts#L242-L270"&gt;comment in the code explains this regular expression well&lt;/a&gt;, you can check it to understand what the regular expression represents.&lt;/p&gt;

&lt;p&gt;In short, the following patterns are all valid attribute expressions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; attr=value

    attr    =    value

    attr    =    
value

 attr="value"

 attr    =   'value'

 attr="value &amp;gt;&amp;gt;&amp;gt;

 attr='value `&amp;lt;&amp;gt;=&amp;gt;&amp;gt;&amp;gt;'

 attr='&amp;lt;!--
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It will be difficult for most people to distinguish which part of the regular expression corresponds to which part of the actual string. To make it easier, I will show the matched parts with &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Groups_and_Ranges"&gt;Named capture groups&lt;/a&gt;, which is a new feature of ES2018.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;div attr="&amp;lt;!--`&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;regex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;(?&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;spaceBeforeName&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt; &lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;09&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;0a&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;0c&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;0d&lt;/span&gt;&lt;span class="se"&gt;])(?&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;name&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;[^\0&lt;/span&gt;&lt;span class="sr"&gt;-&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;1F&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;7F-&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;9F "'&amp;gt;=&lt;/span&gt;&lt;span class="se"&gt;/]&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;)(?&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;equalSignAndValue&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt; &lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;09&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;0a&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;0c&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;0d&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;*=&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt; &lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;09&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;0a&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;0c&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;0d&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;(?:[^&lt;/span&gt;&lt;span class="sr"&gt; &lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;09&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;0a&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;0c&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;0d"'`&amp;lt;&amp;gt;=&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;*|"&lt;/span&gt;&lt;span class="se"&gt;[^&lt;/span&gt;&lt;span class="sr"&gt;"&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;*|'&lt;/span&gt;&lt;span class="se"&gt;[^&lt;/span&gt;&lt;span class="sr"&gt;'&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;))&lt;/span&gt;&lt;span class="sr"&gt;$/g&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;regex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// =&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;// [ &lt;/span&gt;
&lt;span class="c1"&gt;//    ' attr="&amp;lt;!--',&lt;/span&gt;
&lt;span class="c1"&gt;//    ' ',&lt;/span&gt;
&lt;span class="c1"&gt;//    'attr',&lt;/span&gt;
&lt;span class="c1"&gt;//    '="&amp;lt;!--',&lt;/span&gt;
&lt;span class="c1"&gt;//    index: 4,&lt;/span&gt;
&lt;span class="c1"&gt;//    input: '&amp;lt;div attr="&amp;lt;!--',&lt;/span&gt;
&lt;span class="c1"&gt;//    groups: { &lt;/span&gt;
&lt;span class="c1"&gt;//      spaceBeforeName: ' ',&lt;/span&gt;
&lt;span class="c1"&gt;//      name: 'attr', &lt;/span&gt;
&lt;span class="c1"&gt;//      equalSignAndValue: '="&amp;lt;!--'&lt;/span&gt;
&lt;span class="c1"&gt;//    }&lt;/span&gt;
&lt;span class="c1"&gt;// ]&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now they became easier to distinguish, I think.&lt;/p&gt;

&lt;p&gt;If the string matches the pattern, then lit-html combines the expressions with all the space characters before equal sign removed and .&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;html&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;substr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;attributeMatch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;attributeMatch&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
          &lt;span class="nx"&gt;attributeMatch&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;boundAttributeSuffix&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;attributeMatch&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
          &lt;span class="nx"&gt;marker&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// is actually...&lt;/span&gt;

&lt;span class="nx"&gt;html&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;div&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;attr&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;="&amp;lt;!--&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;{{lit-3958644673182541}}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="c1"&gt;// and is finally...&lt;/span&gt;

&lt;span class="nx"&gt;html&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;div attr="&amp;lt;!--{{lit-3958644673182541}}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What's Wrong
&lt;/h2&gt;

&lt;p&gt;Now It is the problem that all the part after &lt;code&gt;attr="&amp;lt;!--{{lit-3958644673182541}}&lt;/code&gt; could be parsed as comment.&lt;/p&gt;

&lt;p&gt;When this is &lt;code&gt;getTemplateElement()&lt;/code&gt; is called, the &lt;code&gt;content&lt;/code&gt; of the HTML template element becomes empty because there seems no elements which have both of opening and closing tags.&lt;/p&gt;

&lt;p&gt;This kind of string will finally throw an error when &lt;code&gt;render&lt;/code&gt; function of the library is called (Of course I will explore this function later).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;value&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;templateResult&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="s2"&gt;`&amp;lt;div attr="&amp;lt;!--&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;Error!&amp;lt;/div&amp;gt;`&lt;/span&gt;

&lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;templateResult&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// =&amp;gt; Uncaught TypeError: Failed to set the 'currentNode' property on 'TreeWalker': The provided value is not of type 'Node'.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;So far, I learned the following points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lit-html sometimes can't create a HTML string 100% accurately.&lt;/li&gt;
&lt;li&gt;It is always good to wrap attribute values with quotations to avoid the cases.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the next post, I will explore the &lt;code&gt;reparentNodes&lt;/code&gt; function which is used by &lt;code&gt;getTemplateElement()&lt;/code&gt; of &lt;code&gt;SVGTemplateResult&lt;/code&gt; class. &lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>webcomponents</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>Exploring How lit-html Works: TemplateResult and SVGTemplateResult constructors (2)</title>
      <dc:creator>Nozomu Ikuta</dc:creator>
      <pubDate>Mon, 06 Jan 2020 14:58:37 +0000</pubDate>
      <link>https://dev.to/nozomuikuta/exploring-how-lit-html-works-templateresult-and-svgtemplateresult-constructors-2-5bbc</link>
      <guid>https://dev.to/nozomuikuta/exploring-how-lit-html-works-templateresult-and-svgtemplateresult-constructors-2-5bbc</guid>
      <description>&lt;p&gt;In this series, How lit-html works, I will explore (not explain) internal implementation of &lt;a href="https://lit-html.polymer-project.org/"&gt;lit-html&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://dev.to/nozomuikuta/exploring-how-lit-html-works-templateresult-and-svgtemplateresult-constructors-g5h"&gt;the previous post&lt;/a&gt;, we saw what &lt;code&gt;TemplateResult&lt;/code&gt; and &lt;code&gt;SVGTemplateResult&lt;/code&gt; look like, but  I skipped some points.&lt;/p&gt;

&lt;p&gt;In this post, I will explore Trusted Types API.&lt;/p&gt;




&lt;p&gt;By the way, before writing this post, I found &lt;a href="https://github.com/Polymer/lit-html/wiki/How-it-Works"&gt;the official documentation that explains how lit-html works&lt;/a&gt;, which would be helpful if you want to grasp overview quickly.&lt;/p&gt;

&lt;p&gt;But, I will keep reading code to expand my knowledge. This is why I put &lt;a href="https://dev.to/t/devjournal"&gt;#devjournal&lt;/a&gt; tag on the posts of this series.&lt;/p&gt;




&lt;h1&gt;
  
  
  Trusted Types API
&lt;/h1&gt;

&lt;p&gt;Trusted Types is an experimental API that makes it secure that DOM API, which by default can be sink of cross-site scripting (XSS).&lt;/p&gt;

&lt;p&gt;It is obviously dangerous to allow users to assign a string to &lt;code&gt;innerHTML&lt;/code&gt; property because they can let any valid HTML, even &lt;code&gt;script&lt;/code&gt; element, be executed. Developers would say they don't do such a thing, but the more complicated the code gets, it becomes the more difficult to find the sinks.&lt;/p&gt;

&lt;p&gt;Here is the place where Trusted Types API comes into play. With this API, all the insecure DOM API come to throws an error when a value is assigned, unless the value is created by &lt;code&gt;createHTML&lt;/code&gt; method of a policy object.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;elemenet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Some malicious Code&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="c1"&gt;// Throw an error&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In other words, it can be considered trustworthy that all the HTML string created by &lt;code&gt;policy.createHTML()&lt;/code&gt;, unless the policy object is global or available to anyone.&lt;/p&gt;

&lt;p&gt;lit-html convert HTML strings into ones that are treated as trusted by &lt;code&gt;convertConstantTemplateStringToTrustedHTML()&lt;/code&gt; function, with policy whose name is 'lit-html'.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Pick&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TrustedTypePolicy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;createHTML&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;|&lt;/span&gt;&lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;convertConstantTemplateStringToTrustedHTML&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nx"&gt;TrustedHTML&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;w&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trustedTypes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trustedTypes&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TrustedTypes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;TrustedTypePolicyFactory&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;trustedTypes&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;policy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;trustedTypes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createPolicy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;lit-html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;createHTML&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;policy&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createHTML&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/trusted-types"&gt;Available policy name can be restricted via Content-Security-Policy (CSP) HTTP directive&lt;/a&gt; so the attackers cannot create policy by themselves.&lt;/p&gt;

&lt;p&gt;This is how lit-html makes itself a secure HTML templating library.&lt;/p&gt;

&lt;p&gt;But, as I said in the previous post, Trusted Types API is available only when polyfill or browser  run with flag for now. So &lt;code&gt;convertConstantTemplateStringToTrustedHTML()&lt;/code&gt; function does nothing in most cases.&lt;/p&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;So far, I learned the following points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All DOM API is by default insecure and sink of cross-site scripting&lt;/li&gt;
&lt;li&gt;Trusted Types API is proposed to solve this issue, but is still experimental.&lt;/li&gt;
&lt;li&gt;lit-html leverages Trusted Types API to make itself secure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For further information about Trusted Types API, &lt;a href="https://developers.google.com/web/updates/2019/02/trusted-types"&gt;Google's blog post&lt;/a&gt; will be helpful.&lt;/p&gt;

&lt;p&gt;In the next post, I will look into &lt;code&gt;getHTML()&lt;/code&gt; method of the &lt;code&gt;TemplateResult&lt;/code&gt; class in more depth.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>webcomponents</category>
      <category>devjournal</category>
    </item>
  </channel>
</rss>
