Giter VIP home page Giter VIP logo

eleventy-plugin-lightningcss's Introduction

Eleventy Plugin: LightningCSS

Process CSS in Eleventy (11ty) with LightningCSS to minify, prefix, and add future CSS support.

Also respects either your package.json browserslist or a .browserslistrc, otherwise the default targets are > 0.2% and not dead.

Review LightningCSS docs to learn more about what future CSS features are supported via syntax lowering, including color functions, media query ranges, logical properties, and more.

Note Requires Eleventy v2 - review upgrade considerations if applying to an existing project.

If you want Sass support as well, use my Sass + LightningCSS plugin instead!

Features

LightningCSS minifies, prefixes, and enables transpiling based on your browserslist (or the included default) to gain future-CSS support today, with graceful upgrading as browser support improves.

It includes enables the following LightningCSS flags by default:

Usage

Install the plugin package:

npm install @11tyrocks/eleventy-plugin-lightningcss

Then, include it in your .eleventy.js config file:

const lightningCSS = require("@11tyrocks/eleventy-plugin-lightningcss");

module.exports = (eleventyConfig) => {
  // If you already have a config, add just the following line
  eleventyConfig.addPlugin(lightningCSS);
};

⚠️ Important: The files will end up in collections.all and appear in places like RSS feeds where you may be using the "all" collection. To prevent that, a temporary workaround is to create a directory data file to exclude your Sass files.

Place the following in the directory containing your Sass files. As an example, for a directory called css the file would be called css/css.json:

{
  "eleventyExcludeFromCollections": true
}

Then, write your CSS using any organization pattern you like as long as it lives within your defined Eleventy input directory.

Note If you are already using PostCSS or Parcel, you will be doubling efforts with this plugin and should not add it.

Config Options

Base options

Option Type Default
importPrefix string '_'
nesting boolean true
customMedia boolean true
minify boolean true
sourceMap boolean false
visitors array []
customAtRules object {}

Bundling Import Prefix

The plugin defaults to setting up 11ty to ignore CSS filenames prefixed with _ (configure with importPrefix) so that those files do not end up as separate stylesheets in your final build. That way you can signify which CSS files you are including via the @import syntax.

Extend LightningCSS with custom transforms

Example: Support mixins and static variables

Expand to see how to configure mixins and static variables as custom at-rules using the LightningCSS docs examples for unknown and custom at-rules.

Support mixins and static variables
let declared = new Map();
let mixins = new Map();

const rules = {
  Rule: {
    unknown(rule) {
      declared.set(rule.name, rule.prelude);
      return [];
    },
    custom: {
      mixin(rule) {
        mixins.set(rule.prelude.value, rule.body.value);
        return [];
      },
      apply(rule) {
        return mixins.get(rule.prelude.value);
      },
    },
  },
};

const tokens = {
  Token: {
    "at-keyword"(token) {
      return declared.get(token.value);
    },
  },
};

const atRules = {
  mixin: {
    prelude: "<custom-ident>",
    body: "style-block",
  },
  apply: {
    prelude: "<custom-ident>",
  },
};

module.exports = (eleventyConfig) => {
  eleventyConfig.addPlugin(lightningCSS, {
    customAtRules: atRules,
    visitors: [rules, tokens],
  });
};

How does it work?

This plugin uses Eleventy's addTemplateFormats and addExtension features to essentiallly recognize CSS as a first-class templating language, and add custom processing. Since it makes CSS into a templating language, changes are applied during local development hot-reloading without a delay or requiring a manual browser refresh.

eleventy-plugin-lightningcss's People

Contributors

5t3ph avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Forkers

sourcecodecheck

eleventy-plugin-lightningcss's Issues

eleventy.js

Hi Stephanie ,

Daniele here 👋
Thank you for your plugin.
I had a problem, I think that setting it with the new configuration file "eleventy.config.js" it doesn’t work, I had to reuse the old name "eleventy.js".

Could it be, or is it a my problem of other configurations?

Thanks for your check!

Support `drafts.customMedia`

Great plug-in! I’ve got something very similar running on my own site, but would love to defer the complexity to a plugin like this one. And I can… almost! It seems the drafts.customMedia option isn’t supported; can it be?

Clearer error messages

The error messages when lighning is unable to parse a file does not indicate the line number that is not parsable. This should be part of any error message to make it easier to debug.

 Problem writing Eleventy templates: (more in DEBUG output)
[11ty] 1. Having trouble rendering css template ./assets/css/common.css (via TemplateContentRenderError)
[11ty] 2. Unexpected token Comma (via SyntaxError)
[11ty] 
[11ty] Original error stack trace: SyntaxError: Unexpected token Comma
[11ty]     at Object.<anonymous> (/Users/aciccarello/code/aciccarello/ciccarello.me/node_modules/@11tyrocks/eleventy-plugin-lightningcss/.eleventy.js:85:30)
[11ty]     at Template._render (/Users/aciccarello/code/aciccarello/ciccarello.me/node_modules/@11ty/eleventy/src/TemplateContent.js:514:28)
[11ty]     at async Template.renderWithoutLayout (/Users/aciccarello/code/aciccarello/ciccarello.me/node_modules/@11ty/eleventy/src/Template.js:456:27)
[11ty]     at async TemplateMap.populateContentDataInMap (/Users/aciccarello/code/aciccarello/ciccarello.me/node_modules/@11ty/eleventy/src/TemplateMap.js:589:39)
[11ty]     at async TemplateMap.cache (/Users/aciccarello/code/aciccarello/ciccarello.me/node_modules/@11ty/eleventy/src/TemplateMap.js:483:5)
[11ty]     at async TemplateWriter._createTemplateMap (/Users/aciccarello/code/aciccarello/ciccarello.me/node_modules/@11ty/eleventy/src/TemplateWriter.js:330:5)
[11ty]     at async TemplateWriter.generateTemplates (/Users/aciccarello/code/aciccarello/ciccarello.me/node_modules/@11ty/eleventy/src/TemplateWriter.js:360:5)
[11ty]     at async TemplateWriter.write (/Users/aciccarello/code/aciccarello/ciccarello.me/node_modules/@11ty/eleventy/src/TemplateWriter.js:407:23)
[11ty]     at async Eleventy.executeBuild (/Users/aciccarello/code/aciccarello/ciccarello.me/node_modules/@11ty/eleventy/src/Eleventy.js:1191:13)
[11ty]     at async Eleventy._watch (/Users/aciccarello/code/aciccarello/ciccarello.me/node_modules/@11ty/eleventy/src/Eleventy.js:822:24)
[11ty] Benchmark     37ms  18%   278× (Configuration) "slugify" Liquid Filter
[11ty] Wrote 0 files in 0.21 seconds (v2.0.1)

ERRORS: Having trouble rendering/compiling css template + Browser queries must be an array or string. Got object.

Enabling the plugin via eleventyConfig.addPlugin(lightningCSS); in .eleventy.js produces the following error:

[11ty] 1. Having trouble rendering css template ./src/Box.css (via TemplateContentRenderError)
[11ty] 2. Having trouble compiling template ./src/Box.css (via TemplateContentCompileError)
[11ty] 3. Browser queries must be an array or string. Got object. (via BrowserslistError)
[11ty] 
[11ty] Original error stack trace: BrowserslistError: Browser queries must be an array or string. Got object.
[11ty]     at checkQueries (/projects/eleventy/node_modules/browserslist/index.js:387:11)
[11ty]     at browserslist (/projects/eleventy/node_modules/browserslist/index.js:398:3)
[11ty]     at Object.compile (/projects/eleventy/node_modules/@11tyrocks/eleventy-plugin-lightningcss/.eleventy.js:100:43)
[11ty]     at CustomEngine.compile (/projects/eleventy/node_modules/@11ty/eleventy/src/Engines/Custom.js:201:7)
[11ty] Wrote 0 files in 0.01 seconds (v2.0.1)

If I rename or delete Box.css I get the same error, but for the next CSS file in my project (/src/Center.css).

I'm configuring browserslist in my package.json, but I've also tried the default method and produced the same error.

Contents of .eleventy.js

Editing _partial files does not rebuild main stylesheets that import them

Hi, thanks for publishing this plugin!

I'm running into a problem that I think may be related to the changes in Eleventy 2.0 to track layout dependencies and only rebuild files that changed. Apologies in advance if this is documented somewhere (I didn't see anything mentioned in the README or in LightningCSS's own docs).

It seems that files output via transforms/plugins don't track dependencies correctly, so if a stylesheet depends on a partial and the partial changes, the stylesheet will not rebuild. I've put together a very minimal repro sandbox here: https://github.com/AleksandrHovhannisyan/11ty-sandbox/tree/eleventy-plugin-lightningcss

To reproduce:

  1. Clone that repo.
  2. Run yarn to install dependencies.
  3. Run yarn serve to start the 11ty server.
  4. Navigate to localhost:8080 to view the site.
  5. Edit src/css/_partial.css to trigger a rebuild. Observe that the change is detected but src/css/styles.css (which depends on src/css/_partial.css) does not rebuild.

Terminal output of running yarn serve: $ npx @11ty/eleventy --serve --incremental [11ty] Writing _site/src/index.html from ./src/index.html (liquid) [11ty] Writing _site/src/css/styles.css from ./src/css/styles.css [11ty] Wrote 2 files in 0.10 seconds (v2.0.1) [11ty] Watching… [11ty] Server at http://localhost:8080/ [11ty] File changed: src/css/_partial.css [11ty] Wrote 0 files (skipped 2) in 0.01 seconds (v2.0.1) [11ty] Watching…

Expected behavior: editing _partial.css should trigger a rebuild of styles.css.

Sourcemap support

It would be nice if this plugin supported writing sourcemaps to disk.

It could support inline sourcemaps, linked/external sourcemaps, or both. Inline would be easier to add, but linked ones sound more efficient in terms of performance.

Thanks for your work!


Ideally, there'd be a separate plugin for source-maps. Plugins would get and/or change the value of a data key, such as sourcemap.value, so the sourcemap could be transformed between plugins. The plugin would then use that data to write the sourcemap, based on user options. Alas, no such plugin exists.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.