This project has moved: See @viu/launchpad
Viu Launchpad
Launchpad is our proven frontend build stack and toolkit to get projects of the ground quickly. It's based on Gulp and an assortment of handy tasks to test, build, optimize and deploy frontends. Launchpad is based on the popular GulpStarter by Viget.
Release Notes / Breaking Changes
- 1.1.2:
- No changes. This release is published to deprecate the repository. See @viu/launchpad
- 1.1.0:
- Updated gulp-nunjucks (html) task to in order to be able to include templates from node_modules.
- 1.0.0: VIU is proud to release version 1.0.0 of the VIU Launchpad. Highlights are:
- Starting from our first 'stable' release, we will be following strict semVer naming conventions.
- Therefore we will not have any braking changes without clear labelling.
- This release is meant for node lts (boron) up to the latest node.
Get started
Make sure you have node.js version boron (or higher) installed and selected (if you use nvm). Create the following folder structure or use the example configuration from the ./demo/ folder.
- assets
- fonts
- icons (are automatically put into an icon font
- images
- sprites (are automatically added to a svg sprite)
- static (are just copied to the root folder of the output)
- components
- {componentname}
- {componentname}.js
- {componentname}.scss
- {componentname}.html
- {componentname}.json
- {componentname}
- data
- global.json (file that holds global data)
- [...] here you add a {templatename}.json for every template that needs specific data
- javascripts
- global.js (if you follow the example configuration below)
- stylesheets
- globals.scss (if you follow the example configuration below)
- templates
- layouts
- macros
- index.html
- {templatename}.html
Media Credits: camera.mp4 (http://www.beachfrontbroll.com/)
Then copy the following example package.json into the project root, remove comments and adjust values as you see fit. Then execute npm install
(See notes for additional information, particularily for Windows users.)
The generated package.json can be extended to override configuration values and to make project properties available in templates (see the HTML section below). A possible package.json file could look like this (remove comments if you copy this into your package.json and execute npm install
again to load dependencies):
Modes
Development (Default)
The npm run gulp
command runs the default task, defined in gulpfile.js/tasks/default.js. All files will compile in development mode (uncompressed with source maps). BrowserSync will serve up files to localhost:3000
and will stream live changes to the code and assets to all connected browsers. Additional BrowserSync tools are available on localhost:3001
.
The npm run develop
command has the same effect.
Run JavaScript Tests (currently untested)
npm run test
Test files located in __tests__
folders are picked up and run using
Before using tests you need to install karma with npm install karma --save-dev
Karma, Mocha, Chai, and Sinon. The test script right now first compiles a production build, and then, if successful runs Karma. This is nice when using something like Travis CI in that if an error occurs during the build step, Travis alerts me that it failed. To pass, the files have to compile properly AND pass the JS tests.
eslint eslint and sass-lint)
Run Linting on JavaScript- and Sass-Source files (withnpm run lint
This will check all JavaScript- and Sass-Source files for errors and warnings, according to the specified linter config. By default the subfolders vendor
and generated
will be excluded and files in there will not be checked.
The eslint-config inherits from the Airbnb JavaScript Style Guide and adds the environments for browser
, node
and mocha
for testing. Additionally the eslint-plugin import
is installed to check failed imports. If you need more environments, plugins and or rules, have a look at gulfile.js/eslintrc.yml.
Sass is linted via sass-lint, the config-file is in gulpfile.js/sass-lint.yml. The config extends from the default rules and adds more strict configuration for classic BEM conventions and is quite strict. Feel free to configure according to your projects specifications.
Build production-ready files
npm run production
This will compile revisioned and compressed files to ./public
. To build production files and preview them localy, run
Demo
npm run demo
This will start a static server that serves your production files to http://localhost:5000. This is primarily meant as a way to preview your production build locally, not necessarily for use as a live production server.
Debug complex problems
npm run debug
This will compile revisioned and files to ./public
, in the same way that npm run production
does. However, this command will not minify / uglify your code, but rather keep the readable JavaScript.
Target specific variables
Add capability to define build-target-specific variables. These variables can be used in javascript files, and will be replaced to the configured value at compile-time.
config.tasks.js.targetBuildVariables
Usage:
- List the build-target-specific variables you like to use in your scripts, in tasks.js.targetBuildVariables 2.A Define new npm scripts for all the target-environments you like to have, Environment-Variables to a specific value. or: 2.B Just set the Environment-Variables (E.g. 'API_USERS') directli via CLI (plattform-specific command)
- Use the variables in your javascript files. Note that 'API_USERS' will be available as API_USERS in your Script.
Basic scenario would be that you want to have different build, which test different API's, for instance: Test-API on: "test.example.com" Develop-API on: "dev.example.com" Example package.JSON: (Only with specific 'develop' script. You probably have to define the other Scripts like "production_test", "production_develop" etc. as well.)
"tasks": {
"js": {
"targetBuildVariables": [
"API_USERS",
"API_PRODUCTS"
]
}
},
"scripts": {
"develop": "gulp --gulpfile node_modules/viu-launchpad/gulpfile.js/index.js",
"develop_test": "cross-env API_USERS=test.example.com/getusers API_PRODUCTS=test.example.com/getproducts npm run develop",
"develop_dev": "cross-env API_USERS=dev.example.com/getusers API_PRODUCTS=dev.example.com/getproducts npm run develop"
}
IMPORTANT: Note the cross-env
call at the beginning of the npm-scripts develop_test
and develop_dev
. The cross-env
package will make sure that setting the environment-variable (e.g. API_USERS
) will work cross-platform.
With this configuration, you can use your custom variables in your javascript files like following:
console.log(__API_USERS__);
console.log(__API_PRODUCTS__);
npm run develop_test
=> 'test.example.com/getusers'
=> 'test.example.com/getproducts'
npm run develop_dev
=> 'dev.example.com/getusers'
=> 'dev.example.com/getproducts'
Note: If you have set the environment variable directly via CLI, you just would run 'npn run develop (or whatever)'.
Features
- CSS: Sass (indented, scss, or both)
- Libsass (node-sass) for super fast compiles
- Autoprefixer
- JS: Modular ES6 with Babel and Webpack
- Async requires
- Multiple bundles
- Shared modules
- Source Maps
- HTML: Static templating with Nunjucks and gulp-data
- Images:
- SVG Sprites: Compiles a spritesheet from a folder of SVGs
- Compression with image-min
- Fonts:
- Icon Fonts: Generate from a folder of SVGs
- Folder and
.sass
mixin for including WebFonts
- Development Mode:
- File Watching and Live Reloading with BrowserSync
- Source Maps
- Production Builds:
- JS and CSS are uglified and minified
- All filneames are revisioned with an md5 hash, a
rev-manifest.json
file is genrearted and all asset references are updated in html, css, and js - File size reporting
- Local production sever for testing
- Testing:
- JS test examples with Karma, Mocha, Chai, Sinon
- Linting:
- JS linting with eslint and Sass-linting with sass-lint
Task Details
JS
Modular ES6 and/or Typescript with Babel and Webpack.
CSS
Your Sass gets run through Autoprefixer, so don't prefix! The examples use the indented .sass
syntax, but use whichever you prefer.
HTML
gulpfile.js/tasks/html
Robust templating with Nunjucks.
Components automatically load the datafile (in the same folder and with the same name as the component) and combine this data object with data that can be provided directly in the template where the component is included. Data provided via the layout is overwritting the dafault data taken from the component folder.
Components are used via the component-tag which is not Nunjucks standard functionality but added in VIU Launchpad. usage:
{% component 'test', exampleComponentData %}
You may configure this task to use gulp-cached to only rebuild, if the file has actually changed during development.
In projects with many html templates, this may improve performance. As a side-effect, the templates will not be rebuilt, if only the json is edited.
"html": {
"cache": true,
},
The data/global.json and the package.json are merged recursively with the page template of the current page and the merged object is available in the template.
IconFont
SVGs added to src/icons
will be automatically compiled into an iconFont, and output to ./public/fonts
. At the same time, a .sass
file will be output to src/stylesheets/generated/_icons.sass
. This file contains mixins and classes based on the svg filename. If you want to edit the template that generates this file, it's at gulpfile.js/tasks/iconFont/template.sass
Usage:
With generated classes:
<span class="icon -twitter"></span>
With mixins:
.lil-birdy-guy
Don't forget about accessibility!
<!-- or -->Twitter
SVG Sprites
gulpfile.js/tasks/svgSprite
SVGs sprites are super powerful. This particular setup allows styling 2 different colors from your css. You can have unlimited colors hard coded into your svg.
In the following example, the first path will be red
, the second will be white
, and the third will be blue
. Paths without a fill attribute will inherit the fill
property from css. Paths with fill="currentColor" will inherit the current css color
value, and hard-coded fills will not be overwritten, since inline styles trump css values.
<svg xmlns="http://www.w3.org/2000/svg"> <path d="..."/> <path fill="currentColor" d="..."/> <path fill="blue" d="..."/> </svg>
I've included a helper to generate the required svg markup in src/html/macros/helpers.html
, so you can just do:
{{ sprite('my-icon') }}
Which spits out:
I recommend setting up your SVGs on a 500 x 500 canvas, centering your artwork, and expanding/combining any shapes of the same color. This last step is important.
Static Files (favicons, app icons, etc.)
There are some files that belong in your root destination directory that you won't want to process or revision in production. Things like favicons, app icons, etc., should go in src/static
, and will get copied over to public
as a last step (after revisioning in production). Nothing should ever go directly in public
, since it gets completely trashed and re-built when running the default
or production
tasks.
Notes
Launchpad requires Node 6.10.x or higher. We recommend using NVM to manage versions.
For Windows Users
- Install NVM (Node version manager) for PowerShell: https://github.com/aaronpowell/ps-nvmw
- Install node via NVM, and use it
- Before attempting to do 'npm install', install one of the 2.7.* versions of Python (https://www.python.org/downloads/)
- Before attempting to do 'npm install', check that you have cl.exe (C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\cl.exe); if not, open Visual Studio and create a C++ project - it will ask you to install C++ tools, install these and reopen powershell
- Open PowerShell as administrator to do npm install (and don't forget 'Set-NodeVersion v6.10.1')
Configuration
All configuration that is possible can be found in node_modules/viu-launchpad/gulpfile.js/config.json and can be overwritten in the "config" object within the package.json.