Skip to main content

plain.importmap

Use import maps in templates.

Heavily inspired by rails/importmap-rails, this app adds a simple process for integrating import maps into Django.

This is a new project and it hasn't been used in production yet. But if you're looking to use import maps with Django, give it a try and tell us how it goes. The structure (and code) is pretty simple. Contributions are welcome!

How to use it

You'll need to do four things to use plain-importmap.

The TL;DR is:

  • Add "importmap" to INSTALLED_PACKAGES
  • Create an importmap.toml
  • Run python manage.py importmap_generate
  • Use {% importmap_js %} in your template

1. Install it

Do the equivalent of pip install plain-importmap and add it to your INSTALLED_PACKAGES list in your settings.py file.

# settings.py
INSTALLED_PACKAGES = [
    ...
    "importmap",
]

2. Create an importmap.toml file

This should live next to your manage.py file. Here you'll add a list of "packages" you want to use.

The "name" can be anything, but should probably be the same as what it you would import from in typical bundling setups (i.e. import React from "react").

The "source" will get passed on to the jspm.org generator, but is basically the <npm package>@<version> you want to use.

[[packages]]
name = "react"
source = "react@17.0.2"

3. Run importmap_generate

To resolve the import map, you'll need to run python manage.py importmap_generate.

This will create importmap.lock (which you should save and commit to your repo) that contains the actual import map JSON (both for development and production).

You don't need to look at this file yourself, but here is an example of what it will contain:

{
  "config_hash": "09d6237cdd891aad07de60f54689d130",
  "importmap": {
    "imports": {
      "react": "https://ga.jspm.io/npm:react@17.0.2/index.js"
    },
    "scopes": {
      "https://ga.jspm.io/": {
        "object-assign": "https://ga.jspm.io/npm:object-assign@4.1.1/index.js"
      }
    }
  },
  "importmap_dev": {
    "imports": {
      "react": "https://ga.jspm.io/npm:react@17.0.2/dev.index.js"
    },
    "scopes": {
      "https://ga.jspm.io/": {
        "object-assign": "https://ga.jspm.io/npm:object-assign@4.1.1/index.js"
      }
    }
  }
}

4. Add the scripts to your template

The import map itself gets added by using {% load importmap %} and then {% importmap_js %} in the head of your HTML. This will include the es-module-shim.

After that, you can include your own JavaScript! This could be inline or from static. Just be sure to use type="module" and the "name" you provided when doing your JS imports (i.e. "react").

{% load importmap %}
<!DOCTYPE html>
<html lang="en">
<head>
    {% importmap_js %}
    <script type="module">
        import React from "react"

        console.log(React);
    </script>
</head>
<body>

</body>
</html>

When it renders you should get something like this:

<!DOCTYPE html>
<html lang="en">
<head>
    <script async src="https://ga.jspm.io/npm:es-module-shims@1.3.6/dist/es-module-shims.js"></script>
    <script type="importmap">
    {
        "imports": {
            "react": "https://ga.jspm.io/npm:react@17.0.2/dev.index.js"
        },
        "scopes": {
            "https://ga.jspm.io/": {
                "object-assign": "https://ga.jspm.io/npm:object-assign@4.1.1/index.js"
            }
        }
    }
    </script>

    <script type="module">
        import React from "react"

        console.log(React);
    </script>
</head>
<body>

</body>
</html>

Project status

This is partly an experiment, but honestly it's so simple that I don't think there can be much wrong with how it works currently.

Here's a list of things that would be nice to do (PRs welcome):

  • Command to add new importmap dependency (use ^ version automatically?)
  • Django check for comparing lock and config (at deploy time, etc.)
  • Use deps to update shim version
  • Preload option
  • Vendoring option (including shim)
  • More complete error handling (custom exceptions, etc.)

Metadata

Release files for plain.importmap 0.8.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for plain.importmap 0.8.1
File Size Uploaded
plain_importmap-0.8.1.tar.gz 6.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for plain.importmap 0.8.1
File Interpreter ABI Platform
plain_importmap-0.8.1-py3-none-any.whl Python 3 none any Details

Total release size: 15.0 kB

Release files / plain_importmap-0.8.1.tar.gz

Download URL plain_importmap-0.8.1.tar.gz
Size 6.3 kB
Tags Source
SHA-256 checksum
How to use checksums
2a4f3103ec0f3db12e6312aabd7c6df0fb702cabd4ac2e74ccb1c356efa5bce9
BLAKE2b-256 checksum
How to use checksums
98be486cbd381a6ab3445239260eefcfd7d8d15a6645c16d839e95f9e766dcee
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.7.2

Release files / plain_importmap-0.8.1-py3-none-any.whl

Download URL plain_importmap-0.8.1-py3-none-any.whl
Size 8.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
55d89b05f3c4f2a6ce72a1bf7be1eb5c86d587e900acb0656cb7a4caeba09e8a
BLAKE2b-256 checksum
How to use checksums
d16b13b9a649306344e79ff561c1493dff52ff559361e92cba8fe9e386347e37
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.7.2

Release history Release notifications | RSS feed

This release

0.8.1 This release

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.0

2 release files

0.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page