Changelog History
Page 1
-
v5.2.0 Changes
September 17, 2020🔄 Changes
- perf(external_link): faster regexp @SukkaW [#4536]
- prioritise
http(s)://
over//
- prioritise
👍 feat: support 'disableNunjucks' in front-matter @curbengh [#4518]
- Enable this option to disable tag plugin
- Setting this option in front-matter will override the same option set by the renderer (e.g. hexo-renderer-marked)
---title: foodate: 2020-01-02 03:04:05disableNunjucks: true|false---
🛠 fix: avoid escaping front-matter if unnecessary @curbengh [#4522]
- using variable (e.g.
{{ title }}
) with special characters no longer result in double-quote wrap
- using variable (e.g.
🛠 fix: validate value of config.url @curbengh [#4520]
config.url
should starts with "http://" or "https://"
🛠 fix(router): convert string to buffer in route stream @ppoffice [#4517]
- fix crash in
hexo generate --bail
- fix crash in
🛠 fix(disableNunjucks): query both async and sync versions of renderer @curbengh [#4498]
disableNunjucks
option should now works reliably with synchronous renderer
🔌 feat(load_plugin): ignore pkg name endswith theme name @SukkaW [#4497]
- An initial effort to support scoped package
Housekeeping
- perf(external_link): faster regexp @SukkaW [#4536]
-
v5.1.1 Changes
August 23, 2020🔄 Changes
🛠 fix(filter/highlight): avoid escaping curly bracket when highlight & prismjs disabled @curbengh [#4489]
- When both highlight.js and prismjs are disabled:
_config.ymlhighlight: enable: falseprismjsenable: false
- there was an issue that curly brackets
{ }
are escaped{ }
mistakenly in the backtick_code_block.js filter. The fix is to avoid running that filter when code highlight is disabled. - Some users disable Hexo's default code highlight as they prefer to their own method.
-
v5.1.0 Changes
August 22, 2020🔋 Features
📜 feat(highlight): parse 'caption' option to prismHighlight @curbengh [#4476]
caption
is now available in prismjs:_config.ymlhighlight: enable: falseprismjs: enable: true
It can be used in triple backtick codeblock:
``` js caption console.log('foo')
above codeblock will be rendered as:
(class attributes are omitted for brevity)<pre><div class="caption"><span>caption</span></div><code>console...</code></pre>
you can style the caption by:
pre div.caption { font-size: 0.9em; color: #888; }pre div.caption a { float: right; }
- also available via
codeblock
andinclude_code
tag plugins.🛠 fix: refactor post escape @SukkaW [#4472]
- fixed issue with prismjs that, in some cases, did not remove hexo's processing tag properly
✂ Remove plugins option in config @stevenjoezhang [#4475]
# \_config.ymlplugins:
plugins
option has been deprecated long ago and it's now completely dropped- plugins should be saved in
scripts/
folder or installed via npmpackage.json
.
🐎 Performance
-
v5.0.2 Changes
August 10, 2020 -
v5.0.1 Changes
August 10, 2020🔄 Changes
- 🛠 fix(helpers): call url_for from hexo-util @curbengh [#4447]
- ⚡️ perf(external_link): update regexp @SukkaW [#4467]
- regex of
external_link
filter now pre-match external links, instead of solely rely onisExternalLink
- regex of
- perf(injector): shorthand optimization @SukkaW [#4462]
-
v5.0.0 Changes
July 29, 2020💥 Breaking change
🔗 refactor(external_link): migrate config during load_config @SukkaW [#4414] [#4371]
See Writing section for new options (introduced back in v4)
_config.ymlexternal_link: true|false # deprecated# New optionexternal_link: enable: true|false
_config.yml# https://hexo.io/docs/configuration#Date-Time-formatuse\_date\_for\_updated: true # deprecated# New optionupdated_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)) { %>
🔨 refactor(box): remove Bluebird.asCallback @SukkaW [#4379]
- Callback syntax for
Box
is never documented nor utilized in Hexo's internal.
- This is also a reminder that we might drop callbacks from all Hexo API in future. [#3328]
⚡️ 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.feat(open_graph): drop 'keywords' option from front-matter @curbengh [#4174]
- Search engines no longer support
keywords
.🛠 fix(#3464): override permalink use the front-matter @SukkaW [#4359]
User config:
_config.ymlpermalink: :year/:month/:day/:title/
Front-matter
---title: foo barpermalink: 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# orpermalink: :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
APIchore/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.
🆕 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(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 operator @SukkaW [#4140]
- 🔨 refactor: simplify code @Himself65 [#4138]
- 🔨 refactor: utilize Object.entries @SukkaW [#4118]
- 🔨 refactor: utilize hexo-util pr-169 @SukkaW [#4045]
- 🔨 refactor(hexo/index): use Set @SukkaW [#4013]
- 🔨 refactor: Class syntax @SukkaW [#4100]
- 🔨 refactor(helper): minor changes @SukkaW [#4061]
- 💅 style: space for asyncArrow @SukkaW [#4102]
- ⬇️ Reduce stream @segayuu [#4333]
Dependencies
- ⚡️ chore(deps): update hexo-front-matter from 1.0.0 to 2.0.0 @SukkaW [#4439]
- ⚡️ chore(deps): update hexo-util from 1.9.0 to 2.2.0 [#4276] [#4438]
- 🌲 chore(deps): bump hexo-log from 1.0.0 to 2.0.0 [#4392]
- chore(deps-dev): bump hexo-renderer-marked from 2.0.0 to 3.0.0 [#4390]
- chore(deps-dev): bump mocha from 6.2.2 to 8.0.1 [#4060] [#4354]
- ⚡️ Update tester node version @segayuu [#4324]
- 👕 chore(deps-dev): bump eslint from 6.8.0 to 7.0.0 [#4301]
- chore(deps): bump warehouse from 3.0.1 to 4.0.0 [#4077] [#4322]
- 👕 chore(deps-dev): bump lint-staged from 9.5.0 to 10.2.0 [#4283]
- chore(deps): bump hexo-fs from 2.0.0 to 3.0.1 [#4277]
- chore(deps-dev): bump sinon from 7.5.0 to 9.0.2 [#4005] [#4232]
- chore(deps-dev): bump husky from 3.1.0 to 4.2.5 [#4235]
- chore(deps): bump chalk from 3.0.0 to 4.0.0 [#4215]
- chore(deps-dev): bump nyc from 14.1.1 to 15.0.0 [#4003]
Misc
- 🔨 refactor: port shell script to javascript @Himself65 [#4405]
- 🔨 refactor(console/generate): class & destructure assign @SukkaW [#4338]
- 🛠 Fix not to pass callback to hexo-fs @segayuu [#4339]
- 💅 style: es6 string extensions & destructure @SukkaW [#4357]
- Migrate Travis and Appveyor tp GitHub Actions
- ci(appveyor): drop appveyor @SukkaW [#4402]
- chore: add release release-drafter (#3858) @YoshinoriN [#4165]
- ci: add GitHub Actions to run linter @Himself65 [#4143]
- ci(travis): remove Windows @curbengh [#4076]
- ci(github_actions): Create tester job @segayuu [#4169]
- Move coveralls from travis to github actions @segayuu [#4326]
- ci(benchmark): generate flamegraph @SukkaW [#4000]
- ci(flamegraph): fix 0x @SukkaW [#4116]
- 🛠 Fix issues found by lgtm.com
- 🔨 refactor(benchmark): minor changes @SukkaW [#4411]
- github(issue_template): add special notice @SukkaW [#4348]
- add mandarin issue template
✅ Test
- ⚡️ test(benchmark): optimize for local & render post support @SukkaW [#4428]
- ✅ perf(mocha): run tests in parallel @curbengh [#4374]
- 🔨 refactor(test): async hexo/load_config.js @segayuu [#4340]
- ✅ test(#4087): add related cases @SukkaW [#4364]
- ✅ test(post): add test cases for [#3543] & [#3459] @SukkaW [#4361]
- ✅ test(generate): add a small delay before clean up @SukkaW [#4393]
- ✅ test(#4385): no double escape in code block @SukkaW [#4395]
- ✅ test(generate): add a longer delay after fs#unlink @SukkaW [#4400]
- ✅ test: coverage improvements @SukkaW [#4270] [#4421] [#4422]
- 🍎 test(box): fix test cases for macOS @stevenjoezhang [#4269]
- ✅ test(load_plugins): make sure file is created @SukkaW [#4265]
- ✅ test(post): adding extra test cases @SukkaW [#4238]
- ✅ test(load_plugins): minor changes @SukkaW [#4212]
- ✅ test(post): fix cases added in #4161 @SukkaW [#4162]
- ✅ test(tags-plugins/helper): improve test coverage @SukkaW [#4014]
- 💅 style(test-helper-is): asyncArrow space @SukkaW [#4015]
- ✅ test: improve coverage @SukkaW [#4050]
- 🏁 test(load-database): fix EPERM error in windows @curbengh [#4069]
- ✅ test: useful sinon.assert @segayuu [#4164]
- ✅ test: replace from rewire to sinon.stub() @segayuu [#4157]
- 🔨 refactor test @segayuu [#4115]
- simplify unit test
-
v4.2.1 Changes
May 14, 2020🚀 Before
4.2.0
, Hexo does not work with Node 14. This is a patch release for support Node 14.🛠 Fix
- chore: incompatible with Node 14 [#4285]
- chore(deps): bump hexo-util from 1.8.0 to 1.9.1
- chore(deps): bump hexo-util from 2.0.0 to 2.0.1
- chore: incompatible with Node 14 [#4285]
-
v4.2.0 Changes
December 22, 2019🔋 Features
0️⃣ 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.ymlserver: 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.ymltheme_config: a: b: 'foo'
- Plus,
_config.yml of themea: 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
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')
-
v4.1.1 Changes
December 12, 2019🔋 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.ymlpretty_urls: trailing_html: false
- Example:
https://yoursite.com/page/about.html
->https://yoursite.com/page/about
🛠 Fixes
- 0️⃣ 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]
-
v4.1.0 Changes
December 09, 2019💥 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, otherwise it assumesen_US
value [#3808]en
is invaliden_GB
is valid- Not all locales are supported (e.g.
en_AU
is not valid), see official list
🔋 Features
👌 Support adding hour and minute to post permalink [#3629]
- Example usage:
_config.ymlpermalink: :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,
meta_generator:
option needs to be disabled,
_config.ymlmeta_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.ymlhighlight: 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.ymlignore: '**/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]
- Requires Node 8.10 or above [#3778]