Netherworld's Pretend Minibar

    nanohtml
    TypeScript icon, indicating that this package has built-in type declarations

    1.10.0 • Public • Published

    nanohtml

    npm version build status downloads js-standard-style

    HTML template strings for the Browser with support for Server Side Rendering in Node.

    Installation

    $ npm install nanohtml

    Usage

    Browser

    var html = require('nanohtml')
    
    var el = html`
      <body>
        <h1>Hello planet</h1>
      </body>
    `
    
    document.body.appendChild(el)

    Node

    Node doesn't have a DOM available. So in order to render HTML we use string concatenation instead. This has the fun benefit of being quite efficient, which in turn means it's great for server rendering!

    var html = require('nanohtml')
    
    var el = html`
      <body>
        <h1>Hello planet</h1>
      </body>
    `
    
    console.log(el.toString())

    Node with custom DOM

    Modules like jsdom implement (parts of) the DOM in pure JavaScript. If you don't really need the performance of string concatenation, or use nanohtml components that modify the raw DOM, use nanohtml/dom to give nanohtml a custom Document.

    var JSDOM = require('jsdom').JSDOM
    var nanohtml = require('nanohtml/dom')
    var jsdom = new JSDOM()
    
    var html = nanohtml(jsdom.window.document)
    var el = html`
      <body>
        <h1>Hello planet</h1>
      </body>
    `
    el.appendChild(html`<p>A paragraph</p>`)
    
    el.outerHTML === '<body><h1>Hello planet</h1><p>A paragraph</p></body>'

    Interpolating unescaped HTML

    By default all content inside template strings is escaped. This is great for strings, but not ideal if you want to insert HTML that's been returned from another function (for example: a markdown renderer). Use nanohtml/raw for to interpolate HTML directly.

    var raw = require('nanohtml/raw')
    var html = require('nanohtml')
    
    var string = '<h1>This a regular string.</h1>'
    var el = html`
      <body>
        ${raw(string)}
      </body>
    `
    
    document.body.appendChild(el)

    Attaching event listeners

    var html = require('nanohtml')
    
    var el = html`
      <body>
        <button onclick=${onclick}>
          Click Me
        </button>
      </body>
    `
    
    document.body.appendChild(el)
    
    function onclick (e) {
      console.log(`${e.target} was clicked`)
    }

    Multiple root elements

    If you have more than one root element they will be combined with a DocumentFragment.

    var html = require('nanohtml')
    
    var el = html`
      <li>Chashu</li>
      <li>Nori</li>
    `
    
    document.querySelector('ul').appendChild(el)

    Static optimizations

    Parsing HTML has significant overhead. Being able to parse HTML statically, ahead of time can speed up rendering to be about twice as fast.

    Browserify

    From the command line

    $ browserify -t nanohtml index.js > bundle.js

    Programmatically

    var browserify = require('browserify')
    var nanohtml = require('nanohtml')
    var path = require('path')
    
    var b = browserify(path.join(__dirname, 'index.js'))
      .transform(nanohtml)
    
    b.bundle().pipe(process.stdout)

    In package.json

    {
      "name": "my-app",
      "private": true,
      "browserify": {
        "transform": [
          "nanohtml"
        ]
      },
      "dependencies": {
        "nanohtml": "^1.0.0"
      }
    }

    Bundling

    Webpack

    At the time of writing there's no Webpack loader yet. We'd love a contribution!

    Babel / Parcel

    Add nanohtml to your .babelrc config.

    Without options:

    {
      "plugins": [
        "nanohtml"
      ]
    }

    With options:

    {
      "plugins": [
        ["nanohtml", {
          "useImport": true
        }]
      ]
    }

    Options

    • useImport - Set to true to use import statements for injected modules. By default, require is used.
    • appendChildModule - Import path to a module that contains an appendChild function. Defaults to "nanohtml/lib/append-child".

    Rollup

    Use the @rollup/plugin-commonjs plugin with @rollup/plugin-node-resolve. Explicitly import the browser or server entrypoint in your application. E.g.:

    import html from 'nanohtml/lib/browser';
    

    Attributions

    Shout out to Shama and Shuhei for their contributions to Bel, yo-yoify and pelo. This module is based on their work, and wouldn't have been possible otherwise!

    See Also

    License

    MIT

    Install

    npm i nanohtml

    DownloadsWeekly Downloads

    32,358

    Version

    1.10.0

    License

    MIT

    Unpacked Size

    79 kB

    Total Files

    22

    Last publish

    Collaborators

    • benlyn
    • s3ththompson
    • substack
    • yoshuawuyts
    • bret
    • lrlna
    • yerkopalma
    • juliangruber
    • timwis
    • ahdinosaur
    • toddself
    • sethvincent
    • maxogden
    • shama
    • freeman-lab
    • feross
    • emilbayes
    • colingourlay
    • jameskyburz
    • almost
    • slaskis
    • ungoldman
    • graforlock
    • tornqvist
    • amongiants
    • goto-bus-stop
    • mafintosh