To upgrade to Hexo v4, change the following line in your package.json,
- "hexo": "^3.9.0",  | 
Breaking change
- chore: drop Node 6 #3598
 - fix post_link, asset_link when title contains unescaped html charaters #3704
- Affects 
asset_link,post_linktag plugins - If you want to retain unescaped characters, set 
falseto the final argument{% asset_link 'filename 'title' 'false' %} 
 - Affects 
 - fix: encode permalink by default #3708
- If you currently use 
encodeURI(post.permalink)(includingpermalinkof 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.urlvariable. 
 - If you currently use 
 - fix(paginator): add 
escapeoption for compatibility with hexo-util 1.3.0 #3728- Theme devs, if you customize 
prev_text/next_textwith html (e.g. to insert icons), you need to setescape: falsein 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: falseto 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.updatedvariable, setuse_date_for_updated: truein 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.htmlfrompermalinkvariables 
pretty_urls:
trailing_index: false- Does not apply to 
this.urlvariable (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_forhelper #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 
fieldandexcludeoptions, 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 hexo-util 1.0.1 and hexo-renderer-marked 2.0.0 #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