Releases: hexojs/hexo
5.0.0
Breaking change
-
refactor(external_link): migrate config during load_config @SukkaW [#4414] [#4371]
- See Writing section for new options (introduced back in v4)
# _config.yml external_link: true|false # deprecated # New option external_link: enable: true|false
# _config.yml # https://hexo.io/docs/configuration#Date-Time-format use_date_for_updated: true # deprecated # New option updated_option: date
- If you check
external_link
for truthy value, since it's now automatically converted to object, it will be always truthy:
<% if (config.external_link) { %>
- If you wish to maintain backward compatibility with older Hexo versions:
<% if ((typeof config.external_link === 'boolean' && config.external_link === true) || (typeof config.external_link === 'object' && config.external_link.enable === true)) { %>
-
feat: bring up config.updated_option @SukkaW [#4278]
- This can be useful for a theme that prefers to display
Updated:
only when it's set in the article's front-matter.
- This can be useful for a theme that prefers to display
-
feat(open_graph): drop 'keywords' option from front-matter @curbengh [#4174]
- Search engines no longer support
keywords
.
- Search engines no longer support
-
fix(#3464): override permalink use the front-matter @SukkaW [#4359]
- User config:
# _config.yml permalink: :year/:month/:day/:title/
- Front-matter
--- title: foo bar permalink: breaking-news/ ---
- That post will be available on
http://yourhexo.com/breaking-news/
- A reminder that permalink must have a trailing
.html
or/
permalink: :year/:month/:day/:title/ # default # or permalink: :year/:month/:day/:title.html
-
Remove lodash from global variable @SukkaW [#4266]
- Lodash
_
is no longer available on Hexo API.
// Dropped <% const arrayB = _.uniq(arrayA) %>
- We encourage the use over native JS API over Lodash, we find this guide to be helpful.
- If you prefer to use Lodash, you can always install it and make it available via
Helper
API
- Lodash
-
chore/ci: drop Node.js 8 and add Node.js 14 @SukkaW [#4255]
- Node 8 has reached EOL on 31 Dec 2019.
- Hexo now requires Node 10+; although Node 10.x is still supported, but it's going to be officially deprecated in less than a year (April 2021), so we recommend Node 12+.
-
refactor: remove site config from theme config @SukkaW [#4145]
- Previously
hexo.theme.config
is merged intohexo.config
, they are now separated to avoid possible conflict in configuration.
- Previously
New feature
- feat(tag): show source of the error & beautify @SukkaW [#4420]
- feat(post_link): better error message when a post could not be located [#4426]
- The error message is now clearer when there is an incorrect filename.
- skip assets of unpublished posts and delete them if exist @DaemondShu [#3489]
- When there is an unpublished post:
--- title: Still a draft.... published: false ---
- That post including its assets will not be generated into the
public/
folder.
- feat(extend/injector): bring up new extend Injector @SukkaW [#4049]
- Refer to the API documentation for usage.
- feat: add prism highlight support @SukkaW [#4119]
- Refer to the documentation for usage.
- feat(tagcloud): new option class & level @stevenjoezhang [#4370]
- Ability to add class name for CSS styling.
- feat(config): validate config before processing posts @SukkaW [#4381]
- feat(post_permalink): add
:second
attribute option for post permalink @kkocdko [#4185]- Example:
permalink: :year/:month/:day/:hour/:minute/:second/:title.html
- Refer to Permalinks for available attributes.
- feat(youtube_tag): add cookie option @curbengh [#4155]
- When disabled, cookie is not set/sent in the youtube video embed.
- feat(youtube_tag): support playlist @SukkaW [#4139]
- Ability to embed a playlist.
- feat(load_theme_config): support alternate theme config @SukkaW [#4120]
- Theme can be configured in a file
_config.[name].yml
, e.g._config.landscape.yml
for hexo-theme-landscape. - Placed the file in the root folder, same as the current
_config.yml
. - Refer to the documentation for configuration priority.
- Theme can be configured in a file
- feat(feed_tag): support parsing config.feed @curbengh [#4029]
- Better integration with hexo-generator-feed.
- feat(tag): add unregister() method @SukkaW [#4046]
- This means you can now unregister existing tag plugins and replace it with your own with the same name.
- feat(filter): add
_after_html_render
filter @jiangtj [#4051] - feat(load_config): support theme_dir in node_modules @SukkaW [#4112]
- fix(list_tags): custom class for each element @noraj [#4059]
- Customize the class name for each element
<ul>
,<li>
,<a>
,<span>
for list_tags plugin.
- Customize the class name for each element
Performance
- perf(tag): rendering optimization @SukkaW [#4418]
- perf(external_link): faster regexp & condition shorthand @SukkaW [#4436]
- perf(external_link): optimize regex @SukkaW [#4008]
- perf(filter): shorthand syntax @SukkaW [#4377]
- perf(backtick_code): shorthand @SukkaW [#4369]
- perf: avoid running irrelevant plugins in 'clean' command @curbengh [#4386]
- To maintain compatibility with third-party console plugins, this only applies to
hexo clean
, nothexo c
alias.
- To maintain compatibility with third-party console plugins, this only applies to
- perf(titlecase): lazy require @SukkaW [#4417]
- perf(tag/code): performance improvements @SukkaW [#4416]
- perf(post): simplify codeblock escape @SukkaW [#4254]
- perf(meta_generator): avoid unnecessary check @SukkaW [#4208]
- perf(external_link): cache config @SukkaW [#4134]
- perf(open_graph): avoid using htmlTag() and enhance cache @SukkaW [#4125]
- refactor(list_archives): reduce calls to date.format() @dailyrandomphoto [#4011]
- fix(moment.locale): avoid lookup repeatedly with the wrong names @dailyrandomphoto [#4007]
Fix
- fix(box): ignore .git and node modules in the theme folder @jiangtj [#4306]
- fix: allow empty title @stevenjoezhang [#4344]
- fix(#4236): don't create "/index" directories when post_asset_folder is true @jiangtj [#4258]
- fix(#4317): non-greedy regexp for tag escape @SukkaW [#4358]
- fix(post): use non-greedy regular expressions @stevenjoezhang [#4161]
- fix(post): properly escape swig tag inside post @SukkaW [#4352]
- swig tag inside a single backtick is now interpreted as code embed.
-
`{% foo %}{{ bar }}{% endfoo %}`
- fix(logging): log database only in relevant commands @curbengh [#4387]
Writing database to ${dbPath}/db.json
message shouldn't show up inhexo clean
andhexo version
.
- fix(server-cache): must match exact alias @curbengh [#4388]
- Improve compatibility with 3rd-party console plugins that may have a name that starts with an 's'.
- fix(tag-code): parse 'wrap' option @curbengh [#4391]
highlight.wrap
option in user config is now properly passed to thecodeblock
tag plugin
- fix: remove unused type check @himself65 [#4398]
- fix: access error code from error object directly @SukkaW [#4280]
- Improve compatibility with native JS API
- fix: load_plugin with extra line EOF @SukkaW [#4256]
- fix: parsing code error in backticks @seaoak [#4229]
- fix(toc_helper): escape class name and handle null id @curbengh [#4009]
- fix(meta_generator): match existing
<meta>
with different order @SukkaW [#4017] - fix(excerpt): stricter regex @curbengh [#4443]
- Now only the following variants of excerpt tag are valid.
<!--more-->
<!-- more-->
<!--more -->
<!-- more -->
Refactor
- refactor(meta_generator): no longer ignore empty @SukkaW [#4442]
- refactor(external_link): migrate config during load_config @SukkaW [#4414]
- Reduce array#reduce @segayuu [#4299]
- Correct using createSha1Hash() with pipe() @seaoak [#4323]
- refactor(post): reduce promise @SukkaW [#4337]
- refactor: simplify code @2997ms [#4408]
- refactor(external_link): filter regexp @segayuu [#4412]
- refactor(hexo): merge theme_config before generation @SukkaW [#4360]
- refactor(nunjucks): dedicated nunjucks renderer @SukkaW [#4356]
- refactor: drop hexo-util#HashStream @SukkaW [#4279]
- refactor(toc): avoid using htmlTag @SukkaW [#4183]
- refactor(hexo_index): remove unused parameter @curbengh [#4153]
- Refactor(class): Replace prototype to class syntax @segayuu [#4151]
- refactor: copy object with spread op...
4.2.1
4.2.0
Features
- Caching is disabled by default in hexo-server [#3963]
- It's disabled so that any changes (particularly to the theme's layout) can be previewed in real-time.
- If you use hexo-server in production environment to serve your website, it can be enabled by,
_config.yml server: cache: true
- Add
min_depth:
option totoc()
helper [#3997]- Example usage:
<%- toc(page.content, { min_depth: 2 }) %> // table of content would only include <h2>, <h3> and above
Fixes
- Merges similar theme configs in main config and theme's config [#3967]
- For example:
_config.yml theme_config: a: b: 'foo'
- Plus,
_config.yml of theme a: c: 'bar'
theme
variable should have,
a: { b: 'foo', c: 'bar' }
- Fixes some caching issue [#3985]
- Open Graph now applies all
pretty_urls
options toog:url
tag [#3983]
Refactor
-
No longer uses lodash [#3969], [#3987], [#3753]
- Lodash
_
is still available as a global variable, usually utilized in theme layout. - However, we plan to completely drop it in the coming Hexo 5.0.0
- This project page includes all the relevant pull requests which you may find useful
- Lodash
-
Completely drops cheerio [#3850], [#3677]
- This means Hexo no longer includes cheerio as part of its production dependencies (it's still a development dependency)
- This also means the following initialization methods no longer work,
const cheerio = require('./node_modules/hexo/node_modules/cheerio/index') const cheerio = require('./node_modules/cheerio/index')
- To use cheerio,
$ npm install --save cheerio
const cheerio = require('cheerio')
4.1.1
Feature
- Add
trailing_html:
topretty_urls:
option to remove ".html" from url [#3917]- Use the following config to remove the trailing ".html" from permalink variables
_config.yml pretty_urls: trailing_html: false
- Example:
https://yoursite.com/page/about.html
->https://yoursite.com/page/about
Fixes
- Set default locales (in "language_TERRITORY" format) for
og:locale
Open Graph tag [#3921]- Previously
og:locale
was inserted only iflanguage:
is configured in "language-TERRITORY" format - With this fix, if the language is "en",
og:locale
will default to "en_US". Refer to the pull request for the full list.
- Previously
meta_generator()
helper should output the correct Hexo version [#3925]permalink_defaults:
option should be parsed, not replaced [#3926]- "node_modules/" and ".git/" folders in themes/ are now always ignored [#3918]
Refactor
- Further reduces lodash usage [#3880]
4.1.0
Breaking change
- Requires Node 8.10 or above [#3778]
- Node 8 is going to be deprecated in less than a month, we strongly urge to upgrade to Node 10 or newer
og:locale
Open Graph tag won't be inserted iflanguage:
(in config, front-matter of post/page oropen_graph()
helper) is not inlanguage-TERRITORY
format [#3808]en
is invaliden-GB
is valid- Not all locales are supported (e.g.
en-AU
is not valid), see official list - Dash (e.g. "en-GB") must be used for multilingual support, dash is automatically transformed to underscore (e.g. "en_GB") in
og:locale
- Verify the corresponding file exists in the
languages/
folder of installed theme before changing thelanguage:
config
Features
- Support adding hour and minute to post permalink [#3629]
- Example usage:
_config.yml permalink: :year/:month/:day/:hour/:minute/:title/
- Results in
https://yoursite.com/2019/12/09/23/59/a-post/
- Insert
article:published_time
[#3674]article:author
[#3805] Open Graph tags - Enable
lazyload
in iframe-related tag plugins [#3798]- Affects
iframe
,jsfiddle
,vimeo
,youtube
tag plugins - Requires supported browsers to benefit from this feature
- Unsupported browsers would simply ignore the attribute, thus it is safe to use and always enabled
- Affects
meta_generator
helper to insert metadata element tag [#3782]- Example usage:
- Insert the following snippet (if EJS is used) inside
<head>
element of your theme layout,
<%- meta_generator() %>
- would output
<meta name="generator" content="Hexo 4.1.0">
- Hexo 3.9.0+ inserts the tag automatically; to get the performance benefit (of the
meta_generator
helper),meta_generator:
option should be disabled,
_config.yml meta_generator: false
- Support custom attributes in
js()
[#3681] andcss()
[#3690] helpers- Example usage:
<%- js({ src: 'script.js', integrity: 'foo', async: true }) %> // <script src="/script.js" integrity="foo" async></script> <%- css({ href: 'style.css', integrity: 'foo' }) %> // <link rel="stylesheet" href="/style.css" integrity="foo">
- Support
wrap:
option to enable/disable wrapping backtick codeblock in<table>
element [#3827]- Enabled by default, enabling
line_number
also enables it - Configure in
highlight:
_config.yml highlight: line_number: false # must be disabled to disable wrap: wrap: false
- This option also can be passed to
codeblock()
tag plugin [#3848]
{% codeblock lang:js wrap:false %} const foo = (bar) => { return bar; }; {% endcodeblock %}
- Enabled by default, enabling
Fixes
- Retain blank lines in a codeblock attached in blockquote [#3770]
- Replaced deprecated
og_updated_time
Open Graph tag witharticle:modified_time
[#3674] - Replaced deprecated
keywords
Open Graph tag witharticle:tag
[#3805] - meta_generator tag should be inserted into
<head>
that spans multiple lines [#3778] - No longer clear database
db.json
when runninghexo new
orhexo --help
[#3793] - Completely ignore files/folders specified in
ignore:
option [#3797]- If you're using Webpack or related tools in your theme, the
node_modules
folder could cause some issues - A temporary workaround is to configure Hexo to ignore that folder,
_config.yml ignore: '**/themes/*/node_modules/**'
- The workaround will no longer be necessary in future version
- If you're using Webpack or related tools in your theme, the
- jsfiddle, vimeo and youtube tag plugins now use https only [#3806]
external_link
filter should not process data URLs (e.g.mailto:
&javascript:
) [#3812] and<article>
element [#3895]- Prevent unnecessary insertion of front-matter when using alias in Hexo CLI [#3830]
-p
is alias of--path
-s
is alias of--slug
-r
is alias of--replace
- Applies
include:
andexclude:
options to post's asset folder [#3882] ignore:
option should work for files, in addition to folders [#3878]
Housekeeping
- Add FOSSA license analyzer for open-source software license compliance [#3779]
- Run benchmark in CI to catch regression [#3776]
- Further reduces lodash usage [#3786], [#3788], [#3790], [#3785], [#3809], [#3791], [#3810], [#3826], [#3867], [#3845]
- Remove unnecessary file at the end of unit test [#3792]
- Add funding source to npm [#3851]
- Update bump strip-ansi from 5.2.0 to 6.0.0 [#3852]
- Update chalk from 2.4.2 to 3.0.0 [#3853]
4.0.0
Breaking change
- chore: drop Node 6 #3598
- fix post_link, asset_link when title contains unescaped html charaters #3704
- Affects
asset_link
,post_link
tag plugins - If you want to retain unescaped characters, set
false
to the final argument{% asset_link 'filename 'title' 'false' %}
- Affects
- fix: encode permalink by default #3708
- If you currently use
encodeURI(post.permalink)
(includingpermalink
of page, tag & category variables), there are three options:- Use
encodeURI(decodeURI(post.permalink))
for backward-compatibility with hexo v3.9 (and older) - Use
encodeURL()
function provided by hexo-util, it is backward-compatible - Drop
encodeURI()
function, this breaks backward-compatibility
- Use
- If you want to use the variables in decoded form,
- Use
decodeURI(post.permalink)
decodeURL()
of hexo-util can decode punycoded domain.
- Use
- This change does not apply to
this.url
variable.
- If you currently use
- fix(paginator): add
escape
option for compatibility with [email protected] #3728- Theme devs, if you customize
prev_text
/next_text
with html (e.g. to insert icons), you need to setescape: false
in the parameter.
- Theme devs, if you customize
Feature
-
feat(filter): use existing excerpt if possible #3612
- Support
excerpt:
in front-matter
- Support
-
switch minimatch to micromatch #3538
- Refer to micromatch docs for advanced globbing
-
feat: add option to disable meta generator tag #3653
- Add
meta_generator: false
to config to disable
- Add
-
feat(generator): allow limit parallel generation #3665
- If you experience "Out of memory" issue, try lowering the value in
hexo g --concurrency <number>
- If you experience "Out of memory" issue, try lowering the value in
-
Option to use date instead of file mtime for updated date #3235
- If you prefer not to use file modification time in the
post.updated
variable, setuse_date_for_updated: true
in config
- If you prefer not to use file modification time in the
-
feat(list_tags): add Schema "keywords" and Microdata "tag" #3678
-
feat(permalink_variable): add pretty_urls option to remove index.html from url #3691
- Use the following config to remove the trailing
index.html
frompermalink
variables
pretty_urls: trailing_index: false
- Does not apply to
this.url
variable (see #3661). - Should be compatible with existing canonical-related plugins, recommend plugin and theme devs to test
- Use the following config to remove the trailing
-
feat: add
full_url_for
helper #3701- use this helper
full_url_for(page.path)
instead ofconfig.url + page.path
- use this helper
-
fix: external_link should use after_render #3675
- added
field
andexclude
options, see #3675 for guide.
- added
Performance
- perf(meta_generator): drop cheerio #3671
- perf(open_graph): drop cheerio and use regex #3680
- perf(external_link): drop cheerio and use regex #3685
- perf(cache): enforce caching across modes #3756
Fix
- fix: set english as default #3654
- Use filename when title is not specified in the front-matter #3672
- fix: ignore categories / tags with zero posts #3624
- fix(open_graph): remove index.html from url #3661
- fix(open_graph): remove duplicate twitter card tags #3668
- fix(helpers, tag plugins): encode url by default #3710
- Refer to #3708 for guide on decoding.
- fix(open_graph): percent-encode url, not html escape #3686
- fix: Allow backtick code block in "blockquote" tag plugin #2321
- fix: Correct processing of backtick code block on blockquote #3765
- fix: prevent inserting extra new line character into the end of backtick code block #3768
Dependency
- chore(deps): update tildify requirement from ^1.2.0 to ^2.0.0 #3541
- chore(deps): update strip-indent requirement from ^2.0.0 to ^3.0.0 #3534
- chore(deps-dev): update husky requirement from ^1.1.3 to ^3.0.0 #3608
- chore(deps-dev): update eslint requirement from ^5.9.0 to ^6.0.1 #3606
- chore(deps-dev): update lint-staged requirement from ^8.1.0 to ^9.1.0 #3615
- chore: update to [email protected] and [email protected] #3646
- chore(deps): update hexo-i18n requirement from ^0.2.1 to ^1.0.0 #3698
- chore(deps): update hexo-fs requirement from ^1.0.0 to ^2.0.0 #3699
- chore(deps): update hexo-front-matter requirement from ^0.2.3 to ^1.0.0 #3700
- chore(deps): update hexo-log requirement from ^0.2.0 to ^1.0.0 #3730
- chore(deps): update warehouse requirement from ^2.2.0 to ^3.0.0 #3736
- chore(deps): bump hexo-cli from 2.0.0 to 3.0.0 #3743
3.9.0
New Features
- Updated
hexo-renderer-marked
to 1.0.1 (#3571) - Updated
hexo-fs
to 1.0.0 (#3301) - TOC: Seek anchor id from parent nodes when target is not available (#3404)
- tag/include_code now can include ranged code lines (#3393)
Bug Fixes
- DisableNunjucks: true should render markdown code block (#3573)
- Changing source config should generate assets (#3399)
Refactor
- Spread function: Hexo built-in plugin blockquote (#3291)
- ES6 block scoping refactor (#3294)
- Use spread syntax (#3333)
Housekeeping
It is a great release and thanks for hardworking from all contributors. 🤗