Migrating from v1
Some major changes and enhancements of VuePress v2:
- VuePress v2 is now using Vue 3, so make sure your components and other client files are compatible with Vue 3.
- VuePress v2 is developed with TypeScript, so it provides better TS support now. It’s highly recommended to use TypeScript to develop plugins and themes. VuePress config file also supports TypeScript, and you can use
.vuepress/config.ts
directly. - VuePress v2 supports both Webpack and Vite as bundler. You can even use Vite in dev mode to get better development experience, and use Webpack in build mode to get better browser compatibility.
Core ideas and processes of VuePress v2 are the same with v1, while v2 API has been re-designed and becomes more normalized. So you might encounter breaking changes when migrating an existing v1 project to v2. This guide is here to help you migrating v1 sites / plugins / themes to v2.
- If you are a common user, you need to read the guide for users.
- If you are a plugin author, you need to read the guide for plugin authors.
- If you are a theme author, you need to read the guide for theme authors.
For Users
User Config Change
shouldPrefetch
Default value is changed from () => true
to false
.
extraWatchFiles
Removed.
You can watch files manually in onWatched hook.
patterns
Renamed to pagePatterns
markdown.lineNumbers
Moved to markdown.code.lineNumbers.
Default value is changed from false
to true
.
markdown.slugify
Removed.
If you want to change the slugify function anyway, set the following options separately:
markdown.anchor.slugify
markdown.toc.slugify
markdown.extractHeaders.slugify
markdown.pageSuffix
Removed.
markdown.externalLinks
Moved to markdown.links.externalAttrs.
markdown.toc
Changed.
markdown.plugins
Removed.
Use markdown-it plugins in extendsMarkdown hook.
markdown.extendMarkdown
Removed.
Use extendsMarkdown hook.
markdown.extractHeaders
Changed.
See Config > markdown.extractHeaders
Webpack Related Configs
All webpack related configs are moved to options of @vuepress/bundler-webpack
, so you should set them in bundlerConfig:
postcss
: moved tobundlerConfig.postcss
stylus
: moved tobundlerConfig.stylus
scss
: moved tobundlerConfig.scss
sass
: moved tobundlerConfig.sass
less
: moved tobundlerConfig.less
chainWebpack
: moved tobundlerConfig.chainWebpack
configureWebpack
: moved tobundlerConfig.configureWebpack
evergreen
: moved tobundlerConfig.evergreen
, and default value is changed fromfalse
totrue
.
Frontmatter Change
meta
Removed.
Use head instead. For example:
head:
- - meta
- name: foo
content: bar
- - link
- rel: canonical
href: foobar
- - script
- {}
- console.log('hello from frontmatter');
Has the same structure with:
// .vuepress/config.js
module.exports = {
// ...
head: [
['meta', { name: 'foo', content: 'bar' }],
['link', { rel: 'canonical', href: 'foobar' }],
['script', {}, `console.log('hello from frontmatter');`],
],
// ...
}
Permalink Patterns Change
:i_month
: removed:i_day
: removed:minutes
: removed (undocumented in v1):seconds
: removed (undocumented in v1):regular
: renamed to:raw
See Frontmatter > permalinkPattern.
Palette System Change
The stylus palette system of VuePress v1 (i.e. styles/palette.styl
and styles/index.styl
) is no longer provided by VuePress Core.
The palette system is extracted to @vuepress/plugin-palette.
Theme authors can use their own way to allow users to custom styles, and not be limited with stylus.
If you are using default theme, the palette system is still available but migrated to SASS. See Default Theme > Styles.
Conventional Files Change
.vuepress/enhanceApp.js
Renamed to .vuepress/clientAppEnhance.{js,ts}
.
The arguments of the function are changed, too.
.vuepress/components/
Files in this directory will not be registered as Vue components automatically.
You need to use @vuepress/plugin-register-components, or register your components manually in .vuepress/clientAppEnhance.{js,ts}
.
.vuepress/theme/
This directory will not be used as local theme implicitly if it is existed.
You need to set the path to the local theme explicitly via theme option.
Plugin API Change
ready
: renamed toonPrepared
updated
: renamed toonWatched
generated
: renamed toonGenerated
additionalPages
: removed, useapp.pages.push(createPage())
inonInitialized
hookclientDynamicModules
: removed, useapp.writeTemp()
inonPrepared
hookenhanceAppFiles
: renamed toclientAppEnhanceFiles
globalUIComponents
: renamed toclientAppRootComponentFiles
clientRootMixin
: renamed toclientAppSetupFiles
extendMarkdown
: renamed toextendsMarkdown
chainMarkdown
: removedextendPageData
: renamed toextendsPageData
extendsCli
: removedconfigureWebpack
: removedchainWebpack
: removedbeforeDevServer
: removedafterDevServer
: removed
See Plugin API.
Theme API Change
layouts
Now you need to specify the layouts directory or layout components manually.
See Theme API > layouts.
extend
Renamed to extends
.
You can still inherit a parent theme with extends: 'parent-theme'
, which will extends the plugins, layouts, etc.
However, the @theme
and @parent-theme
aliases are not available now.
CLI Change
eject command
Removed.
cache options
-c, --cache [cache]
: changed to--cache <cache>
, which means that the shorthand-c
is not forcache
option, and the value ofcache
option is not optional.--no-cache
: renamed to--clean-cache
.
Default Theme Change
Built-in Components
<CodeGroup />
and<CodeBlock />
renamed to<CodeGroup />
and<CodeGroupItem />
<Badge />
$badgeErrorColor
palette variable renamed to$badgeDangerColor
type
prop only acceptstip
,warning
anddanger
now
Palette System
The palette system of default theme has migrated to SASS.
Theme Config
Default theme config has changed a lot.
Official Plugins Change
See Official Plugins.
Community Themes and Plugins
Themes and plugins of v1 is not compatible with v2.
Please make sure that those themes and plugins you are using have supported v2, and refer to their own documentation for migration guide.
For Plugin Authors
Read the Plugin API Change first.
Some major breaking changes:
- Most of the v1 hooks have equivalents in v2. The only exception is
extendsCli
, which has been removed. - Webpack related hooks are removed, because VuePress Core has decoupled with webpack. If you still want to modify webpack config in plugin, try to handle
app.options.bundlerConfig
inonInitialized
hook.
For Theme Authors
Read the Plugin API Change and Theme API Change first.
Some major breaking changes:
- There is no conventional theme directory structure anymore.
- The file
theme/enhanceApp.js
ortheme/clientAppEnhance.{js,ts}
will not be used as client app enhance file implicitly. You need to specify it explicitly inclientAppEnhanceFiles
hook. - Files in
theme/global-components/
directory will not be registered as Vue components automatically. You need to use @vuepress/plugin-register-components, or register components manually inclientAppEnhance.{js,ts}
. - Files in
theme/layouts/
directory will not be registered as layout components automatically. You need to specify it explicitly inlayouts
option. - Files in
theme/templates/
directory will not be used as dev / ssr template automatically. - Always provide a theme entry file, and do not use
"main": "layouts/Layout.vue"
as the theme entry.
- The file
- Stylus is no longer the default CSS pre-processor, and the stylus palette system is not embedded. If you still want to use similar palette system as v1, @vuepress/plugin-palette may help.
- Markdown code blocks syntax highlighting by Prism.js is not embedded by default. You can use either @vuepress/plugin-prismjs or @vuepress/plugin-shiki, or implement syntax highlighting in your own way.
- For scalability concern,
$site.pages
is not available any more.