All Projects → faucet-pipeline → faucet-pipeline-spring-boot-starter

faucet-pipeline / faucet-pipeline-spring-boot-starter

Licence: other
faucet-pipeline for Spring Boot

Programming Languages

java
68154 projects - #9 most used programming language
HTML
75241 projects
kotlin
9241 projects
javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to faucet-pipeline-spring-boot-starter

Opentracing Toolbox
Best-of-breed OpenTracing utilities, instrumentations and extensions
Stars: ✭ 161 (+847.06%)
Mutual labels:  spring-boot-starter
sinatras-skeleton
Basic Sinatra Skeleton MVC CRUD App with Sprockets, Warden, ActiveRecord and PostgresQL
Stars: ✭ 13 (-23.53%)
Mutual labels:  turbolinks
ttall
Laravel fronend preset for TTALL stack - Tailwindcss | Turbolinks | Alpine.js | Laravel | Livewire 🚀
Stars: ✭ 50 (+194.12%)
Mutual labels:  turbolinks
Riptide
Client-side response routing for Spring
Stars: ✭ 169 (+894.12%)
Mutual labels:  spring-boot-starter
boxdrop
Dropbox Clone built with StimulusReflex
Stars: ✭ 66 (+288.24%)
Mutual labels:  turbolinks
stimulus reflex
Build reactive applications with the Rails tooling you already know and love.
Stars: ✭ 2,001 (+11670.59%)
Mutual labels:  turbolinks
Grpc Spring Boot Starter
Spring Boot starter module for gRPC framework.
Stars: ✭ 2,190 (+12782.35%)
Mutual labels:  spring-boot-starter
Spring5Tutorial
Spring 文件的範例資源
Stars: ✭ 36 (+111.76%)
Mutual labels:  webflux
vue-on-rails
Easy way to mount/destroy Vue.js components with Ruby on Rails and Turbolinks 5
Stars: ✭ 17 (+0%)
Mutual labels:  turbolinks
weixin-sdk
www.docs4dev.com/
Stars: ✭ 19 (+11.76%)
Mutual labels:  spring-boot-starter
Rocketmq Spring Boot Starter
rocketmq-spring-boot-starter
Stars: ✭ 178 (+947.06%)
Mutual labels:  spring-boot-starter
normas
Normal Lightweight Javascript Framework for server-side render compatible with Turbolinks
Stars: ✭ 32 (+88.24%)
Mutual labels:  turbolinks
stimulus-turbolinks
Stimulus + Vue.js + Turbolinks test Rails app
Stars: ✭ 33 (+94.12%)
Mutual labels:  turbolinks
Tutorial Soap Spring Boot Cxf
Tutorial how to create, test, deploy, monitor SOAP-Webservices using Spring Boot and Apache CXF
Stars: ✭ 167 (+882.35%)
Mutual labels:  spring-boot-starter
MultiFaucet
MultiFaucet drips ETH, tokens, and NFTs across many testnet networks, at once.
Stars: ✭ 151 (+788.24%)
Mutual labels:  faucet
Cas Client Autoconfig Support
Annotation-based configuration support for Apereo CAS Java clients
Stars: ✭ 153 (+800%)
Mutual labels:  spring-boot-starter
CRUD-Laravel-Livewire-SPA
CRUD Laravel 7 & Livewire (SPA) Single Page Application
Stars: ✭ 34 (+100%)
Mutual labels:  turbolinks
logback-access-spring-boot-starter
Spring Boot Starter for Logback-access.
Stars: ✭ 153 (+800%)
Mutual labels:  spring-boot-starter
localstack-spring-boot-starter
SpringBoot Starter for Localstack
Stars: ✭ 38 (+123.53%)
Mutual labels:  spring-boot-starter
stimulus-turbolinks-demo
A Stimulus + Turbolinks Demo of an app called Proposahoy!
Stars: ✭ 30 (+76.47%)
Mutual labels:  turbolinks

faucet-pipeline-spring-boot-starter

Build Status Test coverage Quality Gate Maven Central

A Spring Boot starter and auto-configuration for the faucet-pipeline:

tl;dr: faucet-pipeline is a framework-independent, pluggable asset pipeline that takes the pain out of preprocessing JavaScript, CSS and associated files (e.g. images or fonts). It simplifies the process of converting modern JavaScript (ES6) to support older browsers (ES5), or Sass to CSS - eliminating typical low-level configuration nightmares.

The faucet-pipeline bundles your application files, fingerprints them and creates a manifest for them. It also can be used to watch the configured files and rerun the process during development.

Introduction

This starter is needed when you want to use faucet with your Spring Boot project. The following issues have to be tackled:

  • The resource processed through the pipeline ("assets") should not be part of the regular Java / Groovy / Kotlin sources and other resources of the project. As such, the assets would be copied by the build system (either Maven or Gradle) itself. You have to provide a place for the assets, this is not something the starter can do for you.

  • The processed assets need to be in the class path of the Spring Application. This is also a build step, that the starter cannot do for you.

What the starter does however are the following tasks:

  • It checks whether a faucet-manifests exists (defaults to classpath:/manifest.json) and if so, loads it

  • It checks whether the application is either a servlet or reactive web application. If not, the starter does nothing.

  • For a web application it registers a ResourceResolver that is able to retrieve internal urls that might are the output of finger printing and map them to external urls.

This works for servlet and reactive Spring applications.

tl;dr

git clone [email protected]:faucet-pipeline/faucet-pipeline-spring-boot-starter.git
cd faucet-pipeline-spring-boot-starter
./mvnw clean install
cd demo-webmvc
FAUCETPIPELINE_CACHEMANIFEST=false ./mvnw spring-boot:run

Usage and configuration

Runtime

Just include the starter in your pom.xml:

<dependency>
    <groupId>org.faucet-pipeline</groupId>
    <artifactId>faucet-pipeline-spring-boot-starter</artifactId>
    <version>1.3.0</version>
</dependency>

or in your build.gradle:

implementation 'org.faucet-pipeline:faucet-pipeline-spring-boot-starter:1.3.0'

The starter can only work if Springs resource chain is active. The starter won’t activate this for you, so please configure

spring.web.resources.chain.enabled=true

The resource resolver will be mapped to /**, so basically that’s it.

Compile time

Make sure that your assets end up into /classes (maven) or /resources/main (gradle). This project contains two demos, demo-webmvc and demo-webflux. The following approach is from demo-webmvc.

Configure your faucet-pipeline

Follow the instructions from the website:

npm init # gets you a fresh package.json
npm install --save\ # Installs the pipeline for you
      faucet-pipeline-js\
      faucet-pipeline-sass\
      faucet-pipeline-static

In your package.json add the following scripts:

"scripts": {
    "compile": "faucet --fingerprint --compact",
    "watch": "faucet --no-fingerprint --watch"
}

The compact-switch is optional.

Create a faucet.config.js next to package.json. Here’s the one from demo-webmvc`

let targetBaseDir = "./target/classes/static"
const path = require('path');

module.exports = {
    js: [{
        source: "./src/main/assets/javascripts/application.js",
        target: targetBaseDir + "/javascripts/application.js"
    }],
    sass: [{
        source: "./src/main/assets/stylesheets/application.scss",
        target: targetBaseDir + "/stylesheets/application.css"
    }],
    static: [{
        source: "./src/main/assets/images",
        target: targetBaseDir + "/images"
    }],
    manifest: {
        target: "./target/classes/manifest.json",
        key: 'short',
        webRoot: targetBaseDir
    }
};

You’ll notice that it puts the all processed assets into ./target/classes/static. That is where Spring Boot looks for static files by default. Pushing it directly into the classes folder allows dynamic reloading later on. An alternative would be going through generated-resources.

As the above configuration writes the assets into subdirectories, you have to configure your Spring application to include those path patterns:

faucet-pipeline.path-patterns = /javascripts/**, /stylesheets/**, /images/**

Add frontend-maven-plugin (maven)

frontend-maven-plugin is ``Maven-node-grunt-gulp-npm-node-plugin to end all maven-node-grunt-gulp-npm-plugins.'':

With the package.json and faucet-configuration in place, add the following configuration:

<plugin>
    <groupId>com.github.eirslett</groupId>
    <artifactId>frontend-maven-plugin</artifactId>
    <version>1.6</version>
    <executions>
        <execution>
            <id>install-node-and-npm</id>
            <goals>
                <goal>install-node-and-npm</goal>
            </goals>
            <phase>generate-resources</phase>
            <configuration>
                <nodeVersion>v9.5.0</nodeVersion>
            </configuration>
        </execution>
        <execution>
            <id>install-node-dependencies</id>
            <goals>
                <goal>npm</goal>
            </goals>
        </execution>
        <execution>
            <id>run-faucet-pipeline</id>
            <goals>
                <goal>npm</goal>
            </goals>
            <configuration>
                <arguments>run compile --fingerprint</arguments>
            </configuration>
        </execution>
    </executions>
</plugin>

This downloads Node and NPM and installs all dependencies via package.json and executes the pipeline during build. Assuming that your Spring Boot application has the Spring Boot Maven plugin configured like so

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

you can run the application with mvn spring-boot:run. When you use a supported template language like Thymeleaf and the URL-helper they offer, links to assets will contain the finger printed resources automatically. Those links

<link th:href="@{/stylesheets/application.css}" rel="stylesheet" data-turbolinks-track="reload">
<script th:src="@{/javascripts/application.js}" data-turbolinks-track="reload"></script>

Will be turned into

<link href="https://github.com/stylesheets/stylesheets/application-70d5f3dc18d122548efadcedfc0874f0.css" rel="stylesheet" data-turbolinks-track="reload">
<script src="https://github.com/javascripts/javascripts/application-8af210bcc164a457cb381a627729320b.js" data-turbolinks-track="reload"></script>

With gradle:

Add

buildscript {
    repositories {
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath "com.moowork.gradle:gradle-node-plugin:1.2.0"
    }
}

// ...plugins

apply plugin: "com.moowork.node"

to your build.gradle to being able to execute npm/yarn.
Then add a frontend build task and let the bootRun task depend on it:

task buildFrontend(type: YarnTask) {
    args = ['run', 'compile']
}

bootRun.dependsOn buildFrontend

Now you can run gradle bootRun to run your application.

Automatic restart, manifest caching

Use spring-boot-devtools to automatically reload the application when things change:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
</dependency>

The manifest is cached by default but that can be turned off via faucet-pipeline.cache-manifest = false. One easy way to do this without hardcoding it into a properties file is as an environment variable:

Run the demo in one window like so:

FAUCETPIPELINE_CACHEMANIFEST=false ./mvnw spring-boot:run

And in another terminal

npm run watch

And you’ll see the assets being processed and refreshed in the app.

About the demo application

Both demos - for WebMVC and Webflux - collect ideas. They use Turbolinks for quick navigation between server side rendered sites. Turbolinks come from Ruby on Rails.

The demo is a Bootstrap-based site branded with the INNOQ-theme and it looks like this:

Homepage WebMVC demo

Going reactive

The demo-webflux Version is a fully reactive, Spring 5 + Kotlin based application. Please start this one directly as JAR, the Maven Spring Boot Plugin seems to configure stuff slightly differently.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].