mirror of https://github.com/curbengh/hexo-yam
feat: minify svg using svgo
This commit is contained in:
parent
a219775d6c
commit
15465ca16b
18
README.md
18
README.md
|
@ -78,6 +78,24 @@ For more options, see [Terser](https://github.com/terser-js/terser).
|
|||
|
||||
----------
|
||||
|
||||
``` yaml
|
||||
neat_svg:
|
||||
enable: true
|
||||
include:
|
||||
- '*.svg'
|
||||
- '!*.min.svg'
|
||||
```
|
||||
- **enable** - Enable the plugin. Defaults to `true`.
|
||||
- **logger** - Verbose output. Defaults to `false`.
|
||||
- **include** - Include files. Support wildcard pattern.
|
||||
- Exclude `*.min.svg` by default.
|
||||
- **plugin** - Plugin options.
|
||||
- To retain comments, `plugins: [{removeComments: false}]`.
|
||||
|
||||
For more options, see [svgo](https://github.com/svg/svgo).
|
||||
|
||||
----------
|
||||
|
||||
``` yaml
|
||||
neat_gzip:
|
||||
enable: true
|
||||
|
|
9
index.js
9
index.js
|
@ -33,6 +33,14 @@ if (hexo.config.neat_enable === true) {
|
|||
compress: {}
|
||||
}, hexo.config.neat_js)
|
||||
|
||||
// SVG minifier
|
||||
hexo.config.neat_svg = Object.assign({
|
||||
enable: true,
|
||||
logger: false,
|
||||
include: ['*.svg','!*.min.svg'],
|
||||
plugin: []
|
||||
}, hexo.config.neat_svg)
|
||||
|
||||
// gzip compression
|
||||
hexo.config.neat_gzip = Object.assign({
|
||||
enable: true,
|
||||
|
@ -51,6 +59,7 @@ if (hexo.config.neat_enable === true) {
|
|||
hexo.extend.filter.register('after_render:html', filter.logicHtml)
|
||||
hexo.extend.filter.register('after_render:css', filter.logicCss)
|
||||
hexo.extend.filter.register('after_render:js', filter.logicJs)
|
||||
hexo.extend.filter.register('after_generate', filter.logicSvg)
|
||||
hexo.extend.filter.register('after_generate', filter.logicGzip)
|
||||
hexo.extend.filter.register('after_generate', filter.logicBrotli)
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@ const Htmlminifier = require('html-minifier').minify
|
|||
const nanomatch = require('nanomatch')
|
||||
const zlib = require('zlib')
|
||||
const br = require('iltorb')
|
||||
const svgo = require('svgo')
|
||||
|
||||
function logicHtml (str, data) {
|
||||
const hexo = this
|
||||
|
@ -86,6 +87,43 @@ function logicJs (str, data) {
|
|||
return result.code
|
||||
}
|
||||
|
||||
function logicSvg () {
|
||||
const hexo = this
|
||||
const options = hexo.config.neat_svg
|
||||
// Return if disabled.
|
||||
if (options.enable === false) return
|
||||
|
||||
let route = hexo.route
|
||||
let routeList = route.list()
|
||||
let include = options.include
|
||||
|
||||
return Promise.all((nanomatch(routeList, include, { matchBase: true })).map(path => {
|
||||
return new Promise((resolve, reject) => {
|
||||
// Grab all assets using hexo router
|
||||
let assetPath = route.get(path)
|
||||
let assetTxt = ''
|
||||
// Extract the content
|
||||
assetPath.on('data', (chunk) => (assetTxt += chunk))
|
||||
assetPath.on('end', () => {
|
||||
if (assetTxt.length) {
|
||||
// gzip compress using highest level
|
||||
new svgo(options).optimize(assetTxt).then(function(result) {
|
||||
// Save the compressed file to .gz
|
||||
route.set(path, result.data)
|
||||
// Logging
|
||||
let saved = ((assetTxt.length - result.data.length) / assetTxt.length * 100).toFixed(2)
|
||||
if (options.logger) {
|
||||
let log = hexo.log || console.log
|
||||
log.log('Minify the svg: %s [%s saved]', path, saved + '%')
|
||||
}
|
||||
resolve(assetTxt)
|
||||
})
|
||||
}
|
||||
})
|
||||
})
|
||||
}))
|
||||
}
|
||||
|
||||
function logicGzip () {
|
||||
const hexo = this
|
||||
const options = hexo.config.neat_gzip
|
||||
|
@ -174,6 +212,7 @@ module.exports = {
|
|||
logicHtml: logicHtml,
|
||||
logicCss: logicCss,
|
||||
logicJs: logicJs,
|
||||
logicSvg: logicSvg,
|
||||
logicGzip: logicGzip,
|
||||
logicBrotli: logicBrotli
|
||||
}
|
||||
|
|
|
@ -22,12 +22,14 @@
|
|||
"html-minifier": "^4.0.0",
|
||||
"iltorb": "^2.4.2",
|
||||
"nanomatch": "^1.2.13",
|
||||
"svgo": "^1.2.2",
|
||||
"terser": "^3.17.0"
|
||||
},
|
||||
"keywords": [
|
||||
"html",
|
||||
"js",
|
||||
"css",
|
||||
"svg",
|
||||
"minify",
|
||||
"compress",
|
||||
"gzip",
|
||||
|
|
Loading…
Reference in New Issue