npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

kickin

v0.4.2

Published

CLI for starting project with Eleventy.

Downloads

4

Readme

kickin 📦

code style: prettier

Quickly bootstraps environment for developing your great site with Eleventy.

Intention

There are many starters for Eleventy projects. Yep 😵 . And we want also to get into it 😊 . If seriously, our goal is to create comfortable environment for developers, while preserving maximal performance ✊ .

Get started

We do not recommend installing CLI globally. Instead, use npx to initialize project.

The minimal required version of NodeJS is 12.17.0. The reason is that CLI is built on ES module system that is native for a JavaScript world for now.

Using

kickin is a simple command that can accept name of the project, and it will be place, where your code will live. If you already have one, then you can invoke command from inside and get your environment.

npx kickin my-project

or

mkdir my-project
cd my-project
npx kickin

After

There are four main commands available:

  • npm start - starts development server on http://localhost:3000
  • npm run build - builds project.
  • npm run certs - creates certificates for ability to run site with HTTPS locally.
  • npm run serve - runs local server with secure protocol on https://localhost:3000. Mimics production environment.

For generating certificates mkcert utility is used. Make sure it is installed on your local machine.

You can change any part of the generated project as you want - configuration file and all dependencies are open to be changed.

Overview

As template language we encourage using JavaScript(.11ty.js) files, though no one stops you to use other templating engines. It's your choice, and we respect it.

Structure

Starter's folder structure are built according to ones used in Halo Lab.

  • All code is located in src folder.

    • assets - this folder supposed to be home for static content: images, fonts, video, audio etc.
      • images
      • fonts
      • video
      • audio
    • components - folder where are located Eleventy's components(default name is _includes)
    • layouts - folder for layouts.
    • pages - place where future site's pages live.
    • scripts - folder for scripts that will be used in HTML.
    • styles - folder for styles.
  • Bundled code is located in build folder.

Inner structure of defined directories is up to you 🙃

HTML

For building templates with JavaScript, you must export from file render method that return HTML string.

module.exports.render = () => /* html */ `<div>Hello world</div>`;

It can be asynchronous.

Unfortunately, currently Eleventy does not support ES modules syntax. Though there is a direction to it.

In order to highlight the HTML syntax in template string in VSCode, you can install Comment tagged templates extension.

If template contains data then along with render function you should export data object.

module.exports.data = {
  /* some key/value pairs */
};

This object will be passed to render function as first argument.

Note: for layouts this object will have content property that contains inner template's HTML.

Also you can organize template as class. It must have render method(either synchronous or asynchronous) and data method(synchronous or asynchronous) or as getter.

module.exports = class {
  data() {
    // getter or async method
    return {
      /* some key/value pairs */
    };
  }

  async render(data) {
    return /* html */ `<p>I am a class!</p>`;
  }
};

Both layout templates and templates from pages directory must follow above rules. But if you create component, then it can be just function that returns some HTML.

To include component template into layout or page template simply import component into file and use it 👐.

Component (components/row.js):

module.exports = () => /* html */ `<span>I am a component.</span>;`

Template (pages/home.js):

const row = require('../components/row');

module.exports.render = () => /* html */ `<div>${row()}</div>`;

Cool! 😃

More info about JavaScript templates in Eleventy here.

It is recommended for pages to use pwa.11ty.js layout. This layout template can accept following properties (along with styles, scripts and Eleventy's data):

  • lang - (default en) - language of page.
  • title - text for title tag.
  • description - text for page description meta tag.
  • keywords - keywords for keywords meta tag.

Unfortunately, there is a bug updating HTML pages when any required template's dependency is changed.

Styles

In starter Sass language is supported.

Stylesheets must be located in styles directory and inner structure does not matter. They will be compiled, minified and cleaned from unused selectors automatically.

In order to include style to page in page's template provide styles property in data object. It can be string or array of string. The path to style is relative to src/styles directory, so you do not need to include this prefix to path.

module.exports.data = {
  // Bundler of this starter is smart enough to recognize type of style
  // and its location (file will be resolved at `src/styles/home.scss`)
  styles: 'home.scss',
};

If style is inside some directory, then it must be provided in path:

module.exports.data = {
  styles: 'directory/common.scss', // -> src/styles/directory/common.scss
};

This is thanks to eleventy-plugin-styles.

Scripts

Starter supports modern JavaScript syntax (except for Eleventy's templates) and TypeScript.

Scripts must be located in scripts directory and inner structure does not matter (like with styles 😋).

In order to include scripts into HTML page provide scripts property in page template's data object (can be either type of string or array of string). The path to script is relative to src/scripts directory, so you do not need to include this prefix to path.

module.exports.data = {
  // This will be resolved to 'src/scripts/main.js'
  scripts: 'main.js', // or 'main.ts' -> 'src/scripts/main.ts'
};

This is thanks to eleventy-plugin-scripts.

Images

Starter includes image shortcode. Use it if you want to include image to HTML (either raster, or vector(SVG) one).

Info about shortcodes and how to use it in JavaScript templates here.

Signature of shortcode:

interface ImageAttributes {
  /** Defines alternative text for image. */
  alt?: string;
  /** Defines title for image. */
  title?: string;
  /** Class name(s) for `class` attribute. */
  classes?: string | ReadonlyArray<string>;
}

async function image(
  src: string,
  attributes?: ImageAttributes
): Promise<string>;

First parameter is mandatory and contains a path to image relative to images directory.

module.exports.render = async function () {
  return /* html */ `<main>${await this.image('logo.png')}</main>`;
};

For using shortcodes do not write template with arrow functions, because they do not have access to this!

logo.png will be resolved to src/assets/images/logo.png, then webp and avif images will be generated and placed along with source image in build directory. In HTML, you will receive efficient images with right paths 😊!

This is thanks to eleventy-shortcode-image.

If you define path to image from CSS (for example in url function), then same rules are applied here. But if you define url as absolute (absolute public url) then it will be returned as is and no image optimizations will be accomplished.

This is done intentionally in case if you want to just copy assets to output directory.

Other assets

Like for images, path to fonts in CSS should be relative to fonts directory from src. You can also define absolute (public) urls for fonts.

Due to wide support of woff2 format it is recommended to include woff2 and woff font formats only.

PWA

Starter has plugin that automatically generates favicon, splash images for mobile devices and tile images.

As source for them will be using favicon.png file under images directory. Though you can customize its name in .eleventy.js file.

Also manifest.json from src directory will be filled with generated icons property.

This is thanks to eleventy-plugin-pwa-icons.

Sitemap

For sitemap.xml generation templates from pages directory are used.

For creating proper sitemap.xml pass correct HOST variable of .env file.

Detailed about sitemap here.

Service worker

Starter contains plugin that adds service worker to build and enable offline support for site/application.

Registration service worker script will be automatically injected into each HTML page.

By default, worker will cache static resources (images, fonts, audio files etc.) and try to use it from cache at first. Dynamic resources, that can be changed often (html, js, css) are cached also, but every request will be transferred to server at first.

More about strategies here.

This is thanks to eleventy-plugin-workbox.

Compressing

Generated HTML, CSS and JS during building are compressed using brotli algorithm. For sending compressed version of content you must configure server by yourself.

Why brotli?

This is thanks to eleventy-plugin-compress

Configuration

Default configuration of Eleventy is enough for most use cases, but sometimes there is a need to change some behavior.

.eleventy.js is starting point for Eleventy.

If you want to change some behavior or add new feature to site, place most code in .eleventy/ directory. It has following structure:

  • filters - used for holding custom filters.
  • plugins - contains custom plugins for Eleventy.
  • shortcodes - contains shortcodes
  • transforms - holds HTML transformer functions that changes generated HMTL by Eleventy.

Word from author

Have fun! ✌️