<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>import maps on Barney Parker</title><link>https://barneyparker.com/tags/import-maps/</link><description>Recent content in import maps on Barney Parker</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><copyright>This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.</copyright><lastBuildDate>Tue, 12 Dec 2023 09:48:43 +0000</lastBuildDate><atom:link href="https://barneyparker.com/tags/import-maps/index.xml" rel="self" type="application/rss+xml"/><item><title>React Build-less MVP</title><link>https://barneyparker.com/posts/react-build-less-mvp/</link><pubDate>Tue, 12 Dec 2023 09:48:43 +0000</pubDate><guid>https://barneyparker.com/posts/react-build-less-mvp/</guid><description>&lt;h1 id="going-build-less">Going Build-less&lt;/h1>
&lt;p>I don&amp;rsquo;t do a huge amount of front end work, but from time to time I do need to put together a small front-end.&lt;/p>
&lt;p>Front-end work is some of the most complicated tech work there is. Not only do you need to know HTML, CSS and JavaScript, but you need to know how to configure and use build tools, npm, frameworks, and handle a bunch of security things such as CORS, CSP, and a whole bunch of other odds and ends!&lt;/p>
&lt;p>As you might expect, unless you;re doing this stuff daily, its hard to keep it all in your head, so removing any piece makes life much easier.&lt;/p>
&lt;p>One area I have found particularly useful is being able to use a framework such as React, but without needing a build step. Doing this is easier than it might appear, and only takes one or two little tricks to make it work.&lt;/p>
&lt;h1 id="removing-jsx">Removing JSX&lt;/h1>
&lt;p>The first piece of the puzzle is removing JSX. JSX looks like HTML, but actually gets compiled to a bunch of calls to Reacts &lt;code>createElement&lt;/code> function. In turn this builds out the Virtual-DOM, and React then does the diff/update steps etc. Without a build step we need some way to do that in the browser.&lt;/p>
&lt;p>&lt;a href="https://www.npmjs.com/package/htm">Htm&lt;/a> is a small library by Jason Miller that takes tagged template literals that look pretty close to JSX, and turns it in to the &lt;code>createElement&lt;/code> structure used by React!&lt;/p>
&lt;p>There is one minor different in that you need to refer to a component as &lt;code>&amp;lt;${myComponent}&amp;gt;&lt;/code> instead of plain &lt;code>&amp;lt;MyComponent&amp;gt;&lt;/code>, but otherwise everything behaves the same.&lt;/p>
&lt;p>H﻿tm needs to be bound to createElement to make it work so its good to do that in its own little module and export the html function in a file called &lt;code>html.js&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="kr">import&lt;/span> &lt;span class="nx">htm&lt;/span> &lt;span class="nx">from&lt;/span> &lt;span class="s1">&amp;#39;https://esm.sh/htm@3.1.1&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">createElement&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="nx">from&lt;/span> &lt;span class="s1">&amp;#39;react&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="kr">export&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">html&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">htm&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">bind&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">createElement&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="import-maps">Import Maps&lt;/h1>
&lt;p>Normally without a build you would have to import React like this:&lt;/p>
&lt;div class="highlight">&lt;pre class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">useState&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="nx">from&lt;/span> &lt;span class="s1">&amp;#39;https://esm.sh/react@18.2.0&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>This is a bit clunky and cumbersome, so instead we can leverage import maps to make that look a bit nicer.&lt;/p>
&lt;p>In the &lt;code>head&lt;/code> section of your html document include the following:&lt;/p>
&lt;div class="highlight">&lt;pre class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="nx">script&lt;/span> &lt;span class="nx">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;importmap&amp;#34;&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>
&lt;span class="p">{&lt;/span>
&lt;span class="s2">&amp;#34;imports&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="s2">&amp;#34;react&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="s2">&amp;#34;https://esm.sh/react@18.2.0&amp;#34;&lt;/span>
&lt;span class="p">}&lt;/span>
&lt;span class="p">}&lt;/span>
&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="err">/script&amp;gt;&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>In your JS files you can now do:&lt;/p>
&lt;div class="highlight">&lt;pre class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">useState&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="nx">from&lt;/span> &lt;span class="s1">&amp;#39;react&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="a-simple-app-example">A Simple App Example&lt;/h1>
&lt;p>To test all this out we need a simple hello-world example. Create a file called App.js containing the following:&lt;/p>
&lt;div class="highlight">&lt;pre class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="c1">// @ts-ignore
&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">html&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="nx">from&lt;/span> &lt;span class="s1">&amp;#39;html&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">useState&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="nx">from&lt;/span> &lt;span class="s1">&amp;#39;react&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="kr">const&lt;/span> &lt;span class="nx">Counter&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="kr">const&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="nx">count&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">setCount&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">useState&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;span class="k">return&lt;/span> &lt;span class="nx">html&lt;/span>&lt;span class="sb">`
&lt;/span>&lt;span class="sb"> &amp;lt;button onClick=&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="nx">setCount&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">count&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="sb">&amp;gt;Click Me [&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nx">count&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="sb">]&amp;lt;/button&amp;gt;
&lt;/span>&lt;span class="sb"> `&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="p">};&lt;/span>
&lt;span class="kr">export&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">App&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="nx">html&lt;/span>&lt;span class="sb">`
&lt;/span>&lt;span class="sb"> &amp;lt;div&amp;gt;
&lt;/span>&lt;span class="sb"> &amp;lt;h1&amp;gt;Hello (Build-less) World!&amp;lt;/h1&amp;gt;
&lt;/span>&lt;span class="sb"> &amp;lt;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nx">Counter&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="sb"> /&amp;gt;
&lt;/span>&lt;span class="sb"> &amp;lt;/div&amp;gt;
&lt;/span>&lt;span class="sb">`&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>This contains two components, the &lt;code>App&lt;/code> component which we will call to start our app, and a local &lt;code>Counter&lt;/code> component. You can see on line 18 that we needed to reference the &lt;code>Counter&lt;/code> component as a variable rather than an element name, but otherwise it looks exactly like a normal React component.&lt;/p>
&lt;h1 id="tying-it-all-together">Tying it all together&lt;/h1>
&lt;p>As normal, we bring this all together with an index.html document which contains the import map, the root div that will contain the application, and a small inline bootstrap script to kick it all off:&lt;/p>
&lt;div class="highlight">&lt;pre class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="cp">&amp;lt;!DOCTYPE html&amp;gt;&lt;/span>
&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">html&lt;/span> &lt;span class="na">lang&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;en&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">head&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">charset&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;UTF-8&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;viewport&amp;#34;&lt;/span> &lt;span class="na">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;width=device-width, initial-scale=1.0&amp;#34;&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span> &lt;span class="na">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;importmap&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="p">{&lt;/span>
&lt;span class="s2">&amp;#34;imports&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="s2">&amp;#34;react&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;https://esm.sh/react@18.2.0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="s2">&amp;#34;html&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;/html.js&amp;#34;&lt;/span>
&lt;span class="p">}&lt;/span>
&lt;span class="p">}&lt;/span>
&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">title&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>Build-less React MVP&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">title&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">head&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">body&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">div&lt;/span> &lt;span class="na">id&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;root&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>This will be replaced&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">div&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span> &lt;span class="na">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;module&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">html&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="nx">from&lt;/span> &lt;span class="s1">&amp;#39;html&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">createRoot&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="nx">from&lt;/span> &lt;span class="s1">&amp;#39;https://esm.sh/react-dom@18.2.0&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">App&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="nx">from&lt;/span> &lt;span class="s1">&amp;#39;./App.js&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="kr">const&lt;/span> &lt;span class="nx">root&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">createRoot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">getElementById&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;root&amp;#39;&lt;/span>&lt;span class="p">));&lt;/span>
&lt;span class="nx">root&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">render&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">html&lt;/span>&lt;span class="sb">`&amp;lt;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nx">App&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="sb"> /&amp;gt;`&lt;/span>&lt;span class="p">);&lt;/span>
&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">body&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">html&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>N﻿ote:&lt;/strong> we import react-dom with a full URL since this is the only place we&amp;rsquo;ll use it, so it isnt necessary to add it to the import map.&lt;/p>
&lt;p>A﻿s we go though app development, we can add other external scripts to the import map. for example we can import react-router-dom by adding:&lt;/p>
&lt;div class="highlight">&lt;pre class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="p">{&lt;/span>
&lt;span class="s2">&amp;#34;imports&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="p">...&lt;/span>
&lt;span class="s2">&amp;#34;react-reouter-dom&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;https://esm.sh/react-router-dom@6.4.1&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="p">...&lt;/span>
&lt;span class="p">}&lt;/span>
&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>a﻿nd then :something like&lt;/p>
&lt;div class="highlight">&lt;pre class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">html&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="nx">from&lt;/span> &lt;span class="s1">&amp;#39;html&amp;#39;&lt;/span>
&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">BrowserRouter&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">Routes&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">Route&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="nx">from&lt;/span> &lt;span class="s1">&amp;#39;react-router-dom&amp;#39;&lt;/span>
&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">MyComponent&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="nx">from&lt;/span> &lt;span class="s1">&amp;#39;/Components/MyComponent&amp;#39;&lt;/span>
&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">NotFound&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="nx">from&lt;/span> &lt;span class="s1">&amp;#39;/Components/NotFound&amp;#39;&lt;/span>
&lt;span class="kr">export&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">App&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{}&lt;/span> &lt;span class="nx">html&lt;/span>&lt;span class="sb">`
&lt;/span>&lt;span class="sb"> &amp;lt;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nx">BrowserRouter&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="sb">&amp;gt;
&lt;/span>&lt;span class="sb"> &amp;lt;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nx">Routes&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="sb">&amp;gt;
&lt;/span>&lt;span class="sb"> &amp;lt;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nx">Route&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="sb"> path=&amp;#34;/&amp;#34; element=&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nx">html&lt;/span>&lt;span class="sb">`&amp;lt;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nx">MyComponent&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="sb"> /&amp;gt;`&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="sb"> /&amp;gt;
&lt;/span>&lt;span class="sb"> &amp;lt;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nx">Route&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="sb"> path=&amp;#34;*&amp;#34; element=&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nx">html&lt;/span>&lt;span class="sb">`&amp;lt;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nx">NotFound&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="sb"> /&amp;gt;`&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="sb"> /&amp;gt;
&lt;/span>&lt;span class="sb"> &amp;lt;//&amp;gt;
&lt;/span>&lt;span class="sb"> &amp;lt;//&amp;gt;
&lt;/span>&lt;span class="sb">`&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="running-locally">Running Locally&lt;/h1>
&lt;p>As a final touch, all this can be run locally using something like the http-server utility from npm. You&amp;rsquo;ll need to run it in SSL mode which requires an SSL certificate which can be created with:&lt;/p>
&lt;div class="highlight">&lt;pre class="chroma">&lt;code class="language-shell" data-lang="shell">openssl req -newkey rsa:2048 -new -nodes -x509 -days &lt;span class="m">3650&lt;/span> -keyout key.pem -out cert.pem
&lt;/code>&lt;/pre>&lt;/div>&lt;p>and then start the server with the command:&lt;/p>
&lt;div class="highlight">&lt;pre class="chroma">&lt;code class="language-shell" data-lang="shell">http-server -S -C cert.pem
&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Import Maps to simplify Browser Based ESM</title><link>https://barneyparker.com/posts/import-maps-to-simplify-browser-based-esm/</link><pubDate>Tue, 12 Dec 2023 08:34:47 +0000</pubDate><guid>https://barneyparker.com/posts/import-maps-to-simplify-browser-based-esm/</guid><description>&lt;p>I﻿mport maps let you use short names when importing packages in the browser rather than using &lt;code>script&lt;/code> tags.&lt;/p>
&lt;p>I﻿n order to mark a script as an import map, the &lt;code>script&lt;/code> tag needs a &lt;code>type&lt;/code> attribute with a value of &lt;code>importmap&lt;/code>.&lt;/p>
&lt;p>T﻿he contents should be an object with a single attribute of &lt;code>imports&lt;/code> which is an object where the keys are the name you will use to refer to a package, and the value is the URL to the package. e.g:&lt;/p>
&lt;div class="highlight">&lt;pre class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span> &lt;span class="na">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;importmap&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="p">{&lt;/span>
&lt;span class="s2">&amp;#34;imports&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="s2">&amp;#34;React&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;https://esm.sh/react@18.2.0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="s2">&amp;#34;react-dom&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;https://esm.sh/react-dom@18.2.0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="s2">&amp;#34;htm&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;https://esm.sh/htm@3.1.1&amp;#34;&lt;/span>
&lt;span class="p">}&lt;/span>
&lt;span class="p">}&lt;/span>
&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>T﻿his should be placed in the &lt;code>head&lt;/code> section. The parser reads the import map, but doesn&amp;rsquo;t preload the imports. instead it waits until a package gets imported, and then translates it to its &lt;em>real&lt;/em> url for loading:&lt;/p>
&lt;div class="highlight">&lt;pre class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="kr">import&lt;/span> &lt;span class="nx">htm&lt;/span> &lt;span class="nx">from&lt;/span> &lt;span class="s1">&amp;#39;htm&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/code>&lt;/pre>&lt;/div></description></item></channel></rss>