Hexo 4.1.0 Released

Breaking changes

  • 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 if language: (in config, front-matter of post/page or open_graph() helper) is not in language-TERRITORY format #3808
    • en is invalid
    • en-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 the language: config


  • Support adding hour and minute to post permalink #3629

    • Example usage:
    permalink: :year/:month/:day/:hour/:minute/:title/
    • Results in https://example.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

  • 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,
    meta_generator: false
  • Support custom attributes in js() #3681 and css() #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:
    line_number: false # must be disabled to disable wrap:
    wrap: false
    {% codeblock lang:js wrap:false %}
    const foo = (bar) => {
    return bar;
    {% endcodeblock %}
    • Outputs,
      const foo = (bar) => {
      return bar;


  • Retain blank lines in a codeblock attached in blockquote #3770

  • Replaced deprecated og_updated_time Open Graph tag with article:modified_time #3674

  • Replaced deprecated keywords Open Graph tag with article:tag #3805

  • meta_generator tag should be inserted into <head> that spans multiple lines #3778

  • No longer clear database db.json when running hexo new or hexo --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,
    ignore: '**/themes/*/node_modules/**'
    • The workaround will no longer be necessary in future version
  • 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: and exclude: options to post’s asset folder #3882

  • ignore: option should work for files, in addition to folders [#3878]