hexo-yam/README.md

294 lines
10 KiB
Markdown
Raw Normal View History

2019-09-11 01:48:32 +00:00
# hexo-yam
2016-06-23 05:27:24 +00:00
[![npm version](https://img.shields.io/npm/v/hexo-yam)](https://www.npmjs.com/package/hexo-yam)
[![Build Status](https://github.com/curbengh/hexo-yam/workflows/Tester/badge.svg)](https://github.com/curbengh/hexo-yam/actions?query=workflow%3ATester)
[![codecov](https://img.shields.io/codecov/c/gh/curbengh/hexo-yam)](https://codecov.io/gh/curbengh/hexo-yam)
[![NPM Dependencies](https://img.shields.io/librariesio/release/npm/hexo-yam)](https://libraries.io/npm/hexo-yam)
[![Known Vulnerabilities](https://img.shields.io/snyk/vulnerabilities/npm/hexo-yam)](https://snyk.io/test/npm/hexo-yam)
[![Total alerts](https://img.shields.io/lgtm/alerts/g/curbengh/hexo-yam.svg?logo=lgtm)](https://lgtm.com/projects/g/curbengh/hexo-yam/alerts/)
[![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/curbengh/hexo-yam.svg?logo=lgtm)](https://lgtm.com/projects/g/curbengh/hexo-yam/context:javascript)
2018-09-27 07:13:18 +00:00
2020-01-03 01:16:38 +00:00
Yet Another Minifier for Hexo. Minify and compress HTML, JS, CSS, SVG, XML and JSON. [Other files](https://github.com/curbengh/hexo-yam/blob/ba77db0094a7c07ea9f70f010bfc15541d4105ca/index.js#L64) are also compressed. Support gzip and [brotli](https://en.wikipedia.org/wiki/Brotli) [compressions](https://en.wikipedia.org/wiki/HTTP_compression).
2019-12-29 03:51:02 +00:00
## Table of contents
- [Version 4](#version-4)
- [Installation](#installation)
- [Options](#options)
- [HTML](#html)
- [CSS](#css)
- [JS](#js)
- [SVG](#svg)
- [Gzip](#gzip)
- [Brotli](#brotli)
2020-01-03 00:35:25 +00:00
- [XML](#xml)
2020-01-03 01:16:38 +00:00
- [JSON](#json)
2019-12-29 03:51:02 +00:00
- [Globbing](#globbing)
- [HTTP Compression](#http-compression)
## Version 4
In v4, `logger:` option has been renamed to `verbose:`
2019-09-11 01:48:32 +00:00
2020-01-02 10:46:28 +00:00
Migrate:
2019-09-11 01:48:32 +00:00
2020-01-02 10:46:28 +00:00
``` diff
minify:
html:
2020-01-02 10:46:28 +00:00
- logger: true
+ verbose: true
2019-09-11 01:48:32 +00:00
```
2018-11-02 10:29:00 +00:00
2016-05-26 11:09:41 +00:00
## Installation
``` bash
$ npm install hexo-yam --save
2016-05-26 11:09:41 +00:00
```
2019-09-11 01:48:32 +00:00
## Options
2016-05-26 11:09:41 +00:00
``` yaml
2019-09-11 01:48:32 +00:00
minify:
enable: true
2019-12-29 03:51:02 +00:00
html:
css:
js:
svg:
gzip:
brotli:
2016-05-26 11:23:57 +00:00
```
2019-09-11 01:48:32 +00:00
- **enable** - Enable the plugin. Defaults to `true`.
2019-12-29 03:51:02 +00:00
- **html** - See [HTML](#html) section
- **css** - See [CSS](#css) section
- **js** - See [JS](#js) section
- **svg** - See [SVG](#svg) section
- **gzip** - See [Gzip](#gzip) section
- **brotli** - See [Brotli](#brotli) section
2019-09-11 01:48:32 +00:00
2019-12-29 03:51:02 +00:00
## HTML
2019-09-11 01:48:32 +00:00
2016-05-26 11:23:57 +00:00
``` yaml
2019-09-11 01:48:32 +00:00
minify:
html:
enable: true
exclude:
2016-05-26 11:09:41 +00:00
```
- **enable** - Enable the plugin. Defaults to `true`.
2019-10-09 22:33:34 +00:00
- **priority** - Plugin's priority. Defaults to `10`. Set lower value to set higher priority and vice versa.
- **verbose** - Verbose output. Defaults to `false`.
2019-12-29 03:51:02 +00:00
- **exclude** - Exclude files. Support [wildcard](http://www.globtester.com/) pattern(s) in a string or array.
- **globOptions** - See [globbing](#globbing) section.
2018-10-26 05:06:58 +00:00
For more options, see [HTMLMinifier](https://github.com/kangax/html-minifier).
2019-12-29 03:51:02 +00:00
## CSS
2016-05-26 11:09:41 +00:00
``` yaml
2019-09-11 01:48:32 +00:00
minify:
css:
enable: true
exclude:
- '*.min.css'
2016-05-26 11:09:41 +00:00
```
- **enable** - Enable the plugin. Defaults to `true`.
2019-10-09 22:33:34 +00:00
- **priority** - Plugin's priority. Defaults to `10`.
- **verbose** - Verbose output. Defaults to `false`.
2019-12-29 03:51:02 +00:00
- **exclude** - Exclude files. Support [wildcard](http://www.globtester.com/) pattern(s) in a string or array.
- **level** - Optimization level. Defaults to `2`.
2019-12-29 03:51:02 +00:00
- **globOptions** - See [globbing](#globbing) section.
2019-04-23 04:01:04 +00:00
For more options, see [clean-css](https://github.com/jakubpawlowicz/clean-css).
2016-05-26 11:09:41 +00:00
2019-12-29 03:51:02 +00:00
## JS
2016-05-26 11:09:41 +00:00
``` yaml
2019-09-11 01:48:32 +00:00
minify:
js:
enable: true
exclude:
- '*.min.js'
2016-05-26 11:09:41 +00:00
```
- **enable** - Enable the plugin. Defaults to `true`.
2019-10-09 22:33:34 +00:00
- **priority** - Plugin's priority. Defaults to `10`.
- **verbose** - Verbose output. Defaults to `false`.
2019-12-29 03:51:02 +00:00
- **exclude** - Exclude files. Support [wildcard](http://www.globtester.com/) pattern(s) in a string or array.
2019-04-23 04:01:04 +00:00
- **compress** - Compress options.
- **mangle** - Mangle variable names. Defaults to `true`. Pass an object to specify [mangle options](https://github.com/terser-js/terser#mangle-options).
- **output** - Output options.
- To retain comments, `output: {comments: true}`.
2019-12-29 03:51:02 +00:00
- **globOptions** - See [globbing](#globbing) section.
2018-10-25 10:14:33 +00:00
For more options, see [Terser](https://github.com/terser-js/terser).
2016-05-26 11:09:41 +00:00
2019-12-29 03:51:02 +00:00
## SVG
2018-09-28 07:43:54 +00:00
2019-04-23 07:59:35 +00:00
``` yaml
2019-09-11 01:48:32 +00:00
minify:
svg:
enable: true
include:
- '*.svg'
- '!*.min.svg'
2019-04-23 07:59:35 +00:00
```
- **enable** - Enable the plugin. Defaults to `true`.
2019-10-09 22:33:34 +00:00
- **priority** - Plugin's priority. Defaults to `10`.
- **verbose** - Verbose output. Defaults to `false`.
2019-12-29 03:51:02 +00:00
- **include** - Include files. Support [wildcard](http://www.globtester.com/) pattern(s) in a string or array.
2019-04-23 07:59:35 +00:00
- Exclude `*.min.svg` by default.
2019-05-21 04:15:18 +00:00
- **plugins** - Plugin options.
2019-12-29 03:51:02 +00:00
- Example: to retain comments, `plugins: [{removeComments: false}]`.
- For more options, see [svgo](https://github.com/svg/svgo).
2019-12-29 03:51:02 +00:00
- **globOptions** - See [globbing](#globbing) section.
2019-04-23 07:59:35 +00:00
2019-12-29 03:51:02 +00:00
## Gzip
2019-04-23 07:59:35 +00:00
2018-09-28 07:43:54 +00:00
``` yaml
2019-09-11 01:48:32 +00:00
minify:
gzip:
enable: true
include:
- '*.html'
- '*.css'
- '*.js'
- '*.txt'
- '*.ttf'
- '*.atom'
- '*.stl'
- '*.xml'
- '*.svg'
- '*.eot'
- '*.json'
2018-09-28 07:43:54 +00:00
```
- **enable** - Enable the plugin. Defaults to `true`.
2019-10-09 22:33:34 +00:00
- **priority** - Plugin's priority. Defaults to `10`.
- **verbose** - Verbose output. Defaults to `false`.
2019-12-29 03:51:02 +00:00
- **include** - Include files. Support [wildcard](http://www.globtester.com/) pattern(s) in a string or array.
- Support one-liner, `include: ['*.html','*.css','*.js']`.
- Must include asterisk and single quotes. `.html` is invalid. `'*.html'` is valid.
2019-12-29 03:51:02 +00:00
- **globOptions** - See [globbing](#globbing) section.
- **level** - Compression level; lower value may results in faster compression but slightly larger (compressed) file. Range `1-9`. Defaults to `9`, or the value of [`zlib.constants.Z_BEST_COMPRESSION`](https://nodejs.org/docs/latest-v12.x/api/zlib.html#zlib_zlib_constants)
2016-05-26 11:09:41 +00:00
2019-12-29 03:51:02 +00:00
## Brotli
2018-09-30 07:30:32 +00:00
``` yaml
2019-09-11 01:48:32 +00:00
minify:
brotli:
enable: true
include:
- '*.html'
- '*.css'
- '*.js'
- '*.txt'
- '*.ttf'
- '*.atom'
- '*.stl'
- '*.xml'
- '*.svg'
- '*.eot'
- '*.json'
2018-09-30 07:30:32 +00:00
```
- **enable** - Enable the plugin. Defaults to `true`.
2019-10-09 22:33:34 +00:00
- **priority** - Plugin's priority. Defaults to `10`.
- **verbose** - Verbose output. Defaults to `false`.
2019-12-29 03:51:02 +00:00
- **include** - Include files. Support [wildcard](http://www.globtester.com/) pattern(s) in a string or array.
- **globOptions** - See [globbing](#globbing) section.
- **level** - Compression level. Range `1-11`. Defaults to `11`, or the value of [`zlib.constants.BROTLI_MAX_QUALITY`](https://nodejs.org/docs/latest-v12.x/api/zlib.html#zlib_brotli_constants)
2018-09-30 07:30:32 +00:00
2020-01-03 00:35:25 +00:00
## XML
2020-01-03 01:16:38 +00:00
Remove whitespaces in xml.
2020-01-03 00:35:25 +00:00
``` yaml
minify:
xml:
enable: false
include:
- '*.xml'
- '!*.min.xml'
```
- **enable** - Enable the plugin. Defaults to `false`.
- **priority** - Plugin's priority. Defaults to `10`.
- **verbose** - Verbose output. Defaults to `false`.
- **include** - Include files. Support [wildcard](http://www.globtester.com/) pattern(s) in a string or array.
- Exclude `*.min.xml` by default.
- **removeComments** - Remove [comments](https://developer.mozilla.org/en-US/docs/Web/XML/XML_introduction) in xml. Defaults to `true`.
- **globOptions** - See [globbing](#globbing) section.
For more options, see [minify-xml](https://github.com/kristian/minify-xml#options).
2020-01-03 01:16:38 +00:00
## JSON
Remove whitespaces in json.
``` yaml
minify:
json:
enable: false
include:
- '*.json'
- '!*.min.json'
```
- **enable** - Enable the plugin. Defaults to `false`.
- **priority** - Plugin's priority. Defaults to `10`.
- **verbose** - Verbose output. Defaults to `false`.
- **include** - Include files. Support [wildcard](http://www.globtester.com/) pattern(s) in a string or array.
- Exclude `*.min.json` by default.
- **globOptions** - See [globbing](#globbing) section.
2019-12-29 03:51:02 +00:00
## Globbing
Use "globOptions" to customise how glob patterns match files. Refer to [micromatch](https://github.com/micromatch/micromatch#options) for available options.
- basename is enabled by default, unless the pattern has a slash.
- basename is disabled depending on each pattern.
- This means the following options would work,
``` yml
exclude:
- '*foo.html' # basename is enabled
- '**/bar/*/*.html' # basename is automatically disabled
- '*baz.css' # basename is enabled
globOptions:
basename: true # default
```
- This behaviour doesn't apply to pattern that starts with `!` (negation).
- This limitation only applies to `include:` option used in svg, gzip and brotli.
- This means the following options would *not* work,
``` yml
include:
- '!foo.svg'
- '!**/bar/*/*.svg'
globOptions:
basename: true
```
- basename will stay disabled, if explicitly disabled in "globOptions".
2018-11-02 10:29:00 +00:00
## HTTP Compression
2019-12-29 03:51:02 +00:00
While most modern web browsers [support Brotli](https://www.caniuse.com/#feat=brotli), you also need to consider whether the web/app server, hosting platform, reverse proxy or CDN (whichever relevant to you) support it.
2018-11-02 10:40:36 +00:00
As of May 2019, GitHub Pages, GitLab Pages and Netlify *do not* support brotli yet. You can generate `.br` files, but they won't serve those files.
2018-11-02 10:29:00 +00:00
Name | Status (May 8, 2019)
--- | ---
GitHub Pages | [In consideration](https://github.community/t5/GitHub-Pages/Support-for-pre-compressed-assets-and-brotli-compression/m-p/22055)
GitLab Pages | [In progress](https://gitlab.com/gitlab-org/gitlab-pages/merge_requests/120)
Netlify | [In consideration](https://postimg.cc/qgxn0261)
Hexo Server | [In progress](https://github.com/hexojs/hexo-server/pull/100)
If you have access to the web server config, you should disable on-the-fly compression for static files (that are already compressed by this plugin),
2018-11-02 10:29:00 +00:00
- [nginx](https://github.com/google/ngx_brotli): Make sure both filter and static modules are enabled. This way pre-compressed `.br` files will be served while dynamic content can be compressed on-the-fly. Protip: `brotli_types text/plain text/css application/javascript application/json image/svg+xml application/xml+rss;` to prevent compressing media files (which are already compressed anyway).
- [Apache](https://httpd.apache.org/docs/2.4/en/mod/mod_brotli.html): See 'Serving pre-compressed content' section of [mod_brotli](https://httpd.apache.org/docs/2.4/en/mod/mod_brotli.html).
- [Caddy](https://caddyserver.com/features): [0.9.4+](https://caddyserver.com/blog/caddy-0_9_4-released) by default support pre-compressed `.gz` `.br` files and on-the-fly gzip compress dynamic files.
- [express](https://github.com/expressjs/express)/[connect](https://github.com/senchalabs/connect): Use [pre-compressed-assets](https://github.com/domadams/pre-compressed-assets). You still can continue to use [compression](https://github.com/expressjs/compression)/[shrink-ray-current](https://github.com/Alorel/shrink-ray) for dynamic files.
## Credits
All credits go to the following work:
- [hexo-neat](https://github.com/rozbo/hexo-neat) by rozbo
2019-04-10 10:04:43 +00:00
- gzip feature is inspired by [hexo-generator-optimize](https://github.com/JackyRen/hexo-generator-optimize)