Loader for webpack to generate fontfaces from font families and iconfonts from svgs using webfonts-generator.
$ npm install multifonts-loader
<button
class="
icon
icon-pig
icon-arrow-after
font-Roboto-BoldItalic"
>
Click Me
</button>
@import 'fonts/fonts'
@import 'iconfont/iconfont'
button
@include webfont('Roboto-BoldItalic')
@include webfont-icon('chicken')
@include webfont-icon('arrow', 'after')
h1
@include webfont('Arial', 'bold', 'italic')
@include webfont-icon('lock-close', 'before', 'baseline', '80%')
&:before
margin-right: 0.25em
label
@include webfont('Helvetica-Bold')
&[for="email"]
@include webfont-icon('email')
&[for="password"]
@include webfont-icon('key')
&:before
margin-right: 0.25em
input
@include webfont('Roboto-LightItalic')
button
@include webfont('Roboto-BoldItalic')
@include webfont-icon('lock', 'after', 'baseline', '16px', 'bold', 'normal')
&:after
margin-left: 0.25em
<span class="[FONT_CLASS_PREFIX]-[FONT_FILE_NAME]"></span>
<span class="[ICON_BASE_SELECTOR] [ICON_CLASS_PREFIX]-[SVG_FILE_NAME]"></span>
<span class="[ICON_BASE_SELECTOR] [ICON_CLASS_PREFIX]-[SVG_FILE_NAME]-after"></span>
NOTE:
You can specify the position of the icon by appending the word '-after'
to its default selector.
By default the icon will be added before
.
Example:
<span class="font-Roboto-ThinItalic"></span>
<span class="icon icon-arrow"></span>
<span class="icon icon-arrow-after"></span>
Name | Required | Default | Description |
---|---|---|---|
FONT_CLASS_PREFIX |
true |
font- | Specifies the class prefix for the font |
FONT_FILE_NAME |
true |
'' | Specifies the font-family name |
ICON_BASE_SELECTOR |
true |
icon | Specifies the base selector for the icon |
ICON_CLASS_PREFIX |
true |
icon- | Specifies the class prefix for the icon |
SVG_FILE_NAME |
true |
'' | Specifies the icon name |
@include webfont('FONT_FILE_NAME', 'FONT_WEIGHT', 'FONT_STYLE')
Example:
@import 'fonts/fonts'
div
@include webfont('Arial', 'bold', 'italic')
p
@include webfont('Roboto-ThinItalic')
Name | Required | Default | Type | Description |
---|---|---|---|---|
FONT_FILE_NAME |
true |
'' |
{String} |
Specifies the name of the font-family to use. For generated fonts the font-family is derived from the font filename. |
FONT_WEIGHT |
false |
normal |
css standard |
Sets how thick or thin characters in text should be displayed |
FONT_STYLE |
false |
normal |
css standard |
Specifies the font style for a text |
@include webfont-icon('SVG_FILE_NAME', 'ICON_POSITION', 'ICON_ALIGN', 'ICON_SIZE', 'ICON_WEIGHT', 'ICON_STYLE')
Example:
@import 'iconfont/iconfont'
span
@include webfont-icon('calendar', 'before', 'middle', '16px', 'bold', 'italic')
@include webfont-icon('arrow', 'after')
Name | Required | Default | Type | Description |
---|---|---|---|---|
SVG_FILE_NAME |
true |
'' |
{String} |
Specifies the name of the icon to use. It is derived from the svg filename |
ICON_POSITION |
false |
before |
[before,after] |
The position of the icon relative to the current element |
ICON_ALIGN |
false |
top |
css standard |
Specifies the alignment of the icon |
ICON_SIZE |
false |
inherit |
css standard |
Specifies the size of the icon |
ICON_WEIGHT |
false |
normal |
css standard |
Sets how thick or thin characters in text should be displayed |
ICON_STYLE |
false |
normal |
css standard |
Specifies the font style for the icon |
Create one or multiple configuration files for your fonts and iconfonts.
multifonts.loader.js
const path = require('path');
module.exports = {
fonts: {
files: [
// '**/*.+(woff|woff2|eot|ttf|otf|svg)',
'**/*.woff',
'**/*.woff2',
'**/*.eot',
'**/*.ttf',
'**/*.otf',
'**/*.svg'
],
inputPath: path.resolve(__dirname, 'assets/fonts'),
outputPath: 'fonts',
publicPath: '/',
fontFilename: '[fontname].[chunkhash].[ext]?[hash]',
cssDest: path.resolve(__dirname, 'styles/fonts'),
cssFilename: 'fonts',
scssDest: path.resolve(__dirname, 'styles/fonts'),
scssFilename: 'fonts',
templateOptions: {
classPrefix: 'font-',
mixinName: 'webfont'
}
},
icons: {
files: [
'**/*.svg',
'arrow2.svg',
'subdirectory/animal1.svg',
'subdirectory/animal2.svg',
'subdirectory/animal200.svg',
'subfolder',
'subdirectory',
path.resolve(__dirname, '../Icons/svg', 'arrow.svg'),
path.resolve(__dirname, '../Icons/svg/subdirectory', 'animal1.svg')
],
inputPath: path.resolve(__dirname, 'assets/icons/svg'),
outputPath: 'iconfont',
types: ['eot', 'woff', 'woff2', 'ttf', 'svg'],
order: ['eot', 'woff', 'woff2', 'ttf', 'svg'],
publicPath: '/',
fontName: 'IconFont',
fontFilename: '[fontname].[chunkhash].[ext]?[hash]',
cssDest: path.resolve(__dirname, 'styles/iconfont'),
cssFilename: 'iconfont',
scssDest: path.resolve(__dirname, 'styles/iconfont'),
scssFilename: 'iconfont',
templateOptions: {
baseSelector: 'icon',
classPrefix: 'icon-',
mixinName: 'webfont-icon'
}
}
};
See below webpack-multifonts-loader#options
The configuration file defines two main sections:
Responsible to locate and process the font families to generate the respective fontfaces.
Optionally, you can decide to generate the fontfaces CSS and/or the SCSS files to a specified location for you to include in your application.
Responsible to locate and process the svg files to generate the respective iconfonts.
Optionally, you can decide to generate the iconfont CSS and/or the SCSS files to a specified location for you to include in your application.
{
test: /multifonts\.loader\.js/, // This is the name of the loader configuration file
use: [
MiniCssExtractPlugin.loader,
'css-loader',
'multifonts-loader'
]
}
Chain the multifonts-loader with the css-loader and MiniCssExtractPlugin.loader to generate the CSS style directly into the Webpack default output path.
Optionally you can also generate the css and scss files to include directly into your application.
See below fonts webpack-multifonts-loader#cssdest
See below fonts webpack-multifonts-loader#scssdest
See below icons webpack-multifonts-loader#cssdest
See below icons webpack-multifonts-loader#scssdest
Extend the loader configuration by including all the available options directly into the rule definition.
See below webpack-multifonts-loader#options
Example:
You can override the fontFilename depending on the environment.
{
test: /multifonts\.loader\.js/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
{
loader: 'multifonts-loader',
options: {
fonts: {
fontFilename: isDevelopment
? '[fontname].[chunkhash].[ext]?[hash]'
: '[chunkhash].[ext]?[hash]'
// ...
// Add any other available option
},
icons: {
fontFilename: isDevelopment
? '[fontname].[chunkhash].[ext]?[hash]'
: '[chunkhash].[ext]?[hash]'
// ...
// Add any other available option
}
}
}
]
}
See below fonts webpack-multifonts-loader#fontfilename
See below icons webpack-multifonts-loader#fontfilename
Include the configuration file into your app.
app.js
require('multifonts.loader');
fonts: {
files: [
// '**/*.+(woff|woff2|eot|ttf|otf|svg)',
'**/*.woff',
'**/*.woff2',
'**/*.eot',
'**/*.ttf',
'**/*.otf',
'**/*.svg'
],
inputPath: path.resolve(__dirname, 'assets/fonts'),
outputPath: 'fonts',
publicPath: '/',
fontFilename: '[fontname].[chunkhash].[ext]?[hash]',
cssDest: path.resolve(__dirname, 'styles/fonts'),
cssFilename: 'fonts',
scssDest: path.resolve(__dirname, 'styles/fonts'),
scssFilename: 'fonts',
templateOptions: {
classPrefix: 'font-',
mixinName: 'webfont'
}
}
Name | Type | Required | Default |
---|---|---|---|
files |
{Array} |
true |
undefined |
inputPath |
{String} |
true |
undefined |
outputPath |
{String} |
false |
iconfont/ |
publicPath |
{String} |
false |
/ |
fontFilename |
{String} |
false |
[fontname].[hash].[ext] |
cssDest |
{String} |
false |
false |
cssFilename |
{String} |
false |
iconfont |
scssDest |
{String} |
false |
false |
scssFilename |
{String} |
false |
iconfont |
fontfaceTemplateCSS |
{String} |
false |
../templates/fontface-css.hbs |
fontfaceTemplateSCSS |
{String} |
false |
../templates/fontface-scss.hbs |
templateOptions |
{Object} |
false |
{} |
templateOptions.classPrefix |
{String} |
false |
font- |
templateOptions.mixinName |
{String} |
false |
webfont |
Required: true
Type: Array
Default: undefined
The Glob pattern to use to find the font files to process.
Required: true
Type: String
Default: undefined
The context for the Glob pattern.
Required: false
Type: String
Default: iconfont/
The path relative to the default Webpack output folder where to save the fonts files.
Required: false
Type: String
Default: /
This is the URL prefix for the generated font url (e.g. /static/ or https://cdn.project.net/). Should typically match Webpack's config.output.publicPath.
Required: false
Type: String
Default: [fontname].[hash].[ext]
See webfonts-loader#filename-string
The generated font file names. These elements can be used:
[fontname]
: the name of the font file being generated[ext]
: the extension of the font file being generated (eot
, ...)[hash]
: the hash of the current compilation[chunkhash]
: the hash of the SVG files
This option can be also configured globally in the webpack loader options.
Required: false
Type: String
Default: false
The absolute path to use to save a copy of the CSS file being generated.
If set the CSS file will be generated at the specified destination.
Required: false
Type: String
Default: iconfont
The name CSS file being generated.
Required: false
Type: String
Default: false
The absolute path to use to save a copy of the SCSS file being generated.
If set the SCSS file will be generated at the specified destination.
Required: false
Type: String
Default: iconfont
The name SCSS file being generated.
Required: false
Type: String
Default: ../templates/fontface-css.hbs
The template to use to generate the css.
Required: false
Type: String
Default: ../templates/fontface-scss.hbs
The template to use to generate the scss.
Options passed to the fontfaceTemplateCSS and fontfaceTemplateSCSS.
It can be extended to include any custom variables you would like to render in your custom templates.
templateOptions: {
classPrefix: 'font-',
mixinName: 'webfont',
// This options will be passed to the template for you to render
customOption: 'customValue'
}
Required: false
Type: String
Default: font-
The prefix to use for the font classes being generated.
Required: false
Type: String
Default: webfont
The name of the scss mixin to call when including the font.
icons: {
files: [
'**/*.svg',
'arrow2.svg',
'subdirectory/animal1.svg',
'subdirectory/animal2.svg',
'subdirectory/animal200.svg',
'subfolder',
'subdirectory',
path.resolve(__dirname, '../Icons/svg', 'arrow.svg'),
path.resolve(__dirname, '../Icons/svg/subdirectory', 'animal1.svg')
],
inputPath: path.resolve(__dirname, 'assets/icons/svg'),
outputPath: 'iconfont',
types: ['eot', 'woff', 'woff2', 'ttf', 'svg'],
order: ['eot', 'woff', 'woff2', 'ttf', 'svg'],
publicPath: '/',
fontName: 'IconFont',
fontFilename: '[fontname].[chunkhash].[ext]?[hash]',
cssDest: path.resolve(__dirname, 'styles/iconfont'),
cssFilename: 'iconfont',
scssDest: path.resolve(__dirname, 'styles/iconfont'),
scssFilename: 'iconfont',
templateOptions: {
baseSelector: 'icon',
classPrefix: 'icon-',
mixinName: 'webfont-icon'
}
}
Name | Type | Required | Default |
---|---|---|---|
files |
{Array} |
true |
undefined |
inputPath |
{String} |
true |
undefined |
outputPath |
{String} |
false |
fonts/ |
types |
{Array} |
false |
['eot', 'woff', 'woff2', 'ttf', 'svg'] |
order |
{Array} |
false |
['eot', 'woff', 'woff2', 'ttf', 'svg'] |
publicPath |
{String} |
false |
/ |
fontName |
{String} |
false |
IconFont |
fontFilename |
{String} |
false |
[fontname].[hash].[ext] |
cssDest |
{String} |
false |
false |
cssFilename |
{String} |
false |
iconfont |
scssDest |
{String} |
false |
false |
scssFilename |
{String} |
false |
fonts |
cssTemplate |
{String} |
false |
../templates/css.hbs |
scssTemplate |
{String} |
false |
../templates/scss.hbs |
templateOptions |
{Object} |
false |
{} |
templateOptions.baseSelector |
{String} |
false |
icon |
templateOptions.classPrefix |
{String} |
false |
icon- |
templateOptions.mixinName |
{String} |
false |
webfont-icon |
Required: true
Type: Array
Default: undefined
The Glob pattern to use to find the svg files to process.
Required: true
Type: String
Default: undefined
The context for the Glob pattern.
Required: false
Type: String
Default: fonts/
The path relative to the default Webpack output folder where to save the svg iconfont files.
Required: false
Type: Array
Default: ['eot', 'woff', 'woff2', 'ttf', 'svg']
Required: false
Type: Array
Default: ['eot', 'woff', 'woff2', 'ttf', 'svg']
Required: false
Type: String
Default: /
See webfonts-loader#publicpath-string
Required: false
Type: String
Default: IconFont
See webfonts-generator#fontname
Required: false
Type: String
Default: [fontname].[hash].[ext]
See webfonts-loader#filename-string
The generated font file names. These elements can be used:
[fontname]
: the value of thefontName
parameter[ext]
: the extension of the font file being generated (eot
, ...)[hash]
: the hash of the current compilation[chunkhash]
: the hash of the SVG files
This option can be also configured globally in the webpack loader options.
Required: false
Type: String
Default: false
The absolute path to use to save a copy of the CSS file being generated.
If set the CSS file will be generated at the specified destination.
Required: false
Type: String
Default: fonts
The name CSS file being generated.
Required: false
Type: String
Default: false
The absolute path to use to save a copy of the SCSS file being generated.
If set the SCSS file will be generated at the specified destination.
Required: false
Type: String
Default: fonts
The name SCSS file being generated.
Required: false
Type: String
Default: ../templates/css.hbs
The template to use to generate the css.
Required: false
Type: String
Default: ../templates/scss.hbs
The template to use to generate the scss.
Options passed to the cssTemplate and scssTemplate.
It can be extended to include any custom variables you would like to render in your custom templates.
templateOptions: {
baseSelector: 'icon',
classPrefix: 'icon-',
mixinName: 'webfont-icon',
// This options will be passed to the template for you to render
customOption: 'customValue'
}
Required: false
Type: String
Default: icon
The class name for the css being generated.
See webfonts-generator#templateoptions
Required: false
Type: String
Default: icon-
The css class prefix for the css being generated.
See webfonts-generator#templateoptions
Required: false
Type: String
Default: webfont-icon
The name of the scss mixin to call when including the icons.
$ npm run test-build
$ npm run test-dev
- Inpired by webfonts-loader
- Made possible by webfonts-generator
Public domain, see the LICENCE
file.