• Stars
    star
    124
  • Rank 278,209 (Top 6 %)
  • Language
    JavaScript
  • License
    ISC License
  • Created almost 9 years ago
  • Updated about 5 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Write out a manifest file containing your versioned webpack chunks and assets.

Build Status

Manifest revision plugin for webpack

Wouldn't it be neat if you could just supply a directory path, install a plugin and now magically all of the assets found were automatically auto-tagged with their md5 value so you can cache them forever?

That's what this plugin does. For example, here's a manifest file that it output:

{
  "publicPath": "http://localhost:2992/assets/",
  "assets": {
    "images/hamburger.svg": "images/hamburger.d2cb0dda3e8313b990e8dcf5e25d2d0f.svg",
    "images/spinner.gif": "images/spinner.37348967baeae34bfa408c1f16794db1.gif",
    "images/touch/apple-touch-icon.png": "images/touch/apple-touch-icon.7326f54bfe6776293f08b34c3a5fde7b.png",
    "images/touch/chrome-touch-icon-192x192.png": "images/touch/chrome-touch-icon-192x192.571f134f59f14a6d298ddd66c015b293.png",
    "images/touch/icon-128x128.png": "images/touch/icon-128x128.7c46d686765c49b813ac5eb34fabf712.png",
    "images/touch/ms-touch-icon-144x144-precomposed.png": "images/touch/ms-touch-icon-144x144-precomposed.452d90b250d6f41a0c8f9db729113ffd.png",
    "images/credit-cards/american-express.png": "images/credit-cards/american-express.8a5ade08365dcc7e5fa39a946bb76ab8.png",
    "images/credit-cards/diners-club.png": "images/credit-cards/diners-club.03afaaa2d75264e332dc28309b7410b9.png",
    "images/credit-cards/discover.png": "images/credit-cards/discover.f89468f36ba1a9080b3bb05b9587d470.png",
    "images/credit-cards/jcb.png": "images/credit-cards/jcb.58f43e5f1fb8c6a4e7e76a17e7824e29.png",
    "images/credit-cards/mastercard.png": "images/credit-cards/mastercard.373e4f1ac72b50605183e8216edde845.png",
    "images/credit-cards/visa.png": "images/credit-cards/visa.26bcf191ee12e711aa540ba8d0c901b7.png",
    "app_js.js": "app_js.5018c3226e10bf313701.js",
    "app_css.css": "app_css.291431bdd7415f9ff51d.css"
  }
}

Custom output formats

What if you could easily format the output of the above file so it worked with existing frameworks such as Ruby on Rails? Sure, no problem buddy.

What if you want a custom output format that's not included? Again, no problem. Just pass in a function as the format option and it will get used. This is explained in more detail below in the API section.

Here's what's included

  • Assets include their logical paths for easy lookups on your server
  • You only have to keep track of your asset server in 1 place (your webpack config)
  • It's as small as possible and provides just enough info to do what it's intended to do
  • Supports multiple output formats

Installation

npm install --save manifest-revision-webpack-plugin

Quick start

var ManifestRevisionPlugin = require('manifest-revision-webpack-plugin');

// Where are your assets located in your project? This would typically be a path
// that contains folders such as: images, stylesheets and javascript.
var rootAssetPath = './src/client';

module.exports = {
  module: {
    loaders: [
      {
        test: /\.(jpe?g|png|gif|svg)$/i,
        loaders: [
            'file?context=' + rootAssetPath + '&name=[path][name].[hash].[ext]'
        ]
      }
    ]
  },
  plugins: [
    new ManifestRevisionPlugin(path.join('build', 'manifest.json'), {
        rootAssetPath: rootAssetPath,
        ignorePaths: ['/stylesheets', '/javascript']
    })
  ]
};

API

  • rootAssetPath defines where it should start looking for assets.
  • ignorePaths is an array of paths to ignore. Path could be a string or regexp.
  • extensionsRegex is a regexp for assets you always want to include. Example: /\.(jpe?g|png|gif|svg)$/i
  • format allows you to pick the manifest output file format.
    • Currently supports general (default), rails or passing in a function.

If you want to use a custom function it could look like this:

    // It must take 2 arguments. The first argument is the raw stats provided by
    // Webpack. The second argument is an object list of each asset.
    var myCoolFormatter = function (data, parsedAssets) {
        console.log(data);
        console.log('---');
        console.log(parsedAssets);

        // In this case we're returning an empty result.
        return {};
    };

    new ManifestRevisionPlugin(path.join('build', 'manifest.json'), {
        rootAssetPath: rootAssetPath,
        ignorePaths: ['/stylesheets', '/javascript'],
        format: myCoolFormatter,
    })

Is your custom formatter used in a popular framework?

Great, I would be more than happy to include it in this project. Just send a pull request. Here's the rules for submitting an official formatter:

  • It must have a unit test
  • It must be well documented (follow the other formatter examples)

You would end up modifying the following files:

How would I use the manifest file?

It can be used with any server and any programming language. What you could do is read the manifest.json file in once when your app boots up. Then create a template helper that accepts an asset and behind the scenes it will lookup that asset and return back the real file name.

What would that look like on the server?

Ok, let's say you're using the jinja template engine. You've also created a helper called asset_for.

Call your template helper in a template:
<img src="{{ asset_for('images/hamburger.svg') }}" alt="Hamburger">
It will produce this source code:
<img src="images/hamburger.d2cb0dda3e8313b990e8dcf5e25d2d0f.svg" alt="Hamburger">

What would the implementation of that look like?

There's too many web frameworks to include examples. As people use the project it would be nice to create wiki pages that have end to end examples on how to implement it in popular web frameworks.

  • Flask-Webpack: A Flask extension to use this plugin's manifest.json
    • Contains a blog post and demo video explaining how to set things up

Contributors

More Repositories

1

docker-django-example

A production ready example Django app that's using Docker and Docker Compose.
Python
1,071
star
2

build-a-saas-app-with-flask

Learn how to build a production ready web app with Flask and Docker.
HTML
918
star
3

dotfiles

Settings for various tools I use.
CSS
910
star
4

docker-rails-example

A production ready example Rails app that's using Docker and Docker Compose.
Ruby
856
star
5

ansible-docker

Install / Configure Docker and Docker Compose using Ansible.
Python
730
star
6

orats

Opinionated rails application templates.
Ruby
669
star
7

docker-flask-example

A production ready example Flask app that's using Docker and Docker Compose.
Python
513
star
8

ansigenome

A tool to help you gather information and manage your Ansible roles.
Python
444
star
9

flask-webpack

A Flask extension to manage assets with Webpack.
Python
338
star
10

rolespec

A test library for testing Ansible roles
Shell
232
star
11

docker-web-framework-examples

Example apps that demonstate how to use Docker with your favorite web frameworks.
Elixir
216
star
12

docker-node-example

An example Node / Express app that's using Docker and Docker Compose.
Shell
194
star
13

docker-phoenix-example

A production ready example Phoenix app that's using Docker and Docker Compose.
Elixir
192
star
14

flask-static-digest

Flask extension to help make your static files production ready by md5 tagging and gzipping them.
Python
150
star
15

notes

A zero dependency shell script that makes it really simple to manage your text notes.
Shell
115
star
16

ansible-nginx

Install and configure nginx (SSL A+ by default) with Ansible.
Jinja
73
star
17

flask-db

A Flask CLI extension to help migrate and manage your SQL database.
Python
73
star
18

ansible-acme-sh

Install and auto-renew SSL certificates with Let's Encrypt using acme.sh.
64
star
19

wait-until

A zero dependency Bash script that waits until a command of your choosing has run successfully.
Shell
55
star
20

ansible-user

Create and configure a user for SSH key based logins and passwordless sudo.
48
star
21

webserver

A zero dependency Python 3 web server to echo back an HTTP request's headers and data.
Python
48
star
22

dockercon21-docker-best-practices

Reference links for my live demo talk from DockerCon 21.
47
star
23

ansible-fail2ban

Install and configure fail2ban using ansible.
46
star
24

runninginproduction.com

The website for the Running in Production podcast.
HTML
41
star
25

esbuild-copy-static-files

An esbuild plugin to copy static files that changed from a source directory to a destination directory.
Shell
34
star
26

flask-pg-extras

A Flask extension to obtain useful information from your PostgreSQL database.
Python
33
star
27

ansible-swapfile

Create and configure a swap file with Ansible.
32
star
28

ansible-letsencrypt

Install and auto-renew SSL certificates with Let's Encrypt and Ansible.
Python
29
star
29

nyhackr-cli-dev-env

Reference notes for the Creating a Command Line Driven Development Environment talk.
18
star
30

ansible-playbooks

A collection of ansible playbooks with end to end examples.
Shell
18
star
31

ansible-rails

Deploy a rails application using git with ansible.
Ruby
18
star
32

invoice

Calculate a billable amount, hours and days logged for 1 or more projects.
Shell
17
star
33

gowatcher

Reload a specified go program automatically by monitoring a directory.
Shell
16
star
34

docker-community-all-hands

Reference links to every talk I've given for the Docker Community All-Hands events.
15
star
35

deploy-web-apps-with-docker

Rescue yourself from the complexity of DevOps
Dockerfile
15
star
36

sublime-text-3-packages

A list of my Sublime Text 3 packages along with their settings.
Python
14
star
37

verdiff

A CLI tool to diff 2 versions of a Phoenix, Rails, Django or Laravel generated project.
Python
13
star
38

title-case-converter

A CLI tool to capitalize words based on industry standard style guides.
Python
13
star
39

flask-secrets

A Flask CLI extension to generate random secret tokens.
Python
13
star
40

ansible-sshd

Install and configure openssh-server using Ansible.
13
star
41

ansible-security

Configure ssh and ufw as well as install fail2ban with ansible.
12
star
42

gemshine

Recursively compare a ruby project's gem versions to their latest versions.
Ruby
12
star
43

ansible-iptables

Configure iptables using Ansible.
12
star
44

lcurl

Visit a site every X seconds in a loop to help detect downtime while testing deployment strategies.
Shell
11
star
45

latest-releases

A command line tool that lets you keep tabs on the latest releases of your favorite tools and libraries.
Shell
11
star
46

demo-for-chattanooga-python-user-group

A demo app for a talk I gave at the Chattanooga python user group.
JavaScript
10
star
47

ansible-monit

Install monit and configure as many processes as you want with ansible.
8
star
48

passify

A small utility to create a password and wrap bcrypt.
JavaScript
8
star
49

pick-random-youtube-comments

Get a list of top level comments from a YouTube video and then pick N amount of unique comment authors by choosing them randomly.
Python
8
star
50

ansible-bootstrap

Configure a server to run Ansible and install essential packages.
6
star
51

ansible-postgres

Install a bare bones version of postgres with ansible.
5
star
52

ansible-pumacorn

Manage a puma or unicorn rails process with init.d using ansible.
Ruby
5
star
53

docker-faye

A docker image for running a secure Faye (websocket) server.
JavaScript
5
star
54

ansible-ferm

Manage iptables with ferm using ansible.
4
star
55

ansible-nodejs

Install the latest stable version of nodejs with ansible.
4
star
56

ansible-mariadb

Install and configure MariaDB using Ansible.
4
star
57

ansible-sendy

Copy and configure Sendy with Ansible.
C
3
star
58

ansible-locale

Install and configure your system's locale using ansible
3
star
59

ansible-phpfpm

Install and configure php-fpm using Ansible.
2
star
60

ansible-dnsmasq

Install and configure dnsmasq to map a TLD to localhost using ansible.
2
star
61

docker-play-example

A production ready example Play app that's using Docker and Docker Compose.
1
star