• Option API
    • name
    • plugins
    • chainWebpack
    • define
    • alias
    • beforeDevServer
    • afterDevServer
    • extendMarkdown
    • chainMarkdown
    • enhanceAppFiles
    • clientDynamicModules
    • extendPageData
    • clientRootMixin
    • additionalPages
    • globalUIComponents
    • extendCli

    Option API

    name

    • 类型: string
    • 默认值: undefined插件的名字。

    在内部,VuePress 将会使用插件的包名作为插件的名称。当你你插件是一个本地插件(即直接使用了一个纯函数)时,请确保设定了该选项,这对调试更有利。

    1. // .vuepress/config.js
    2. module.exports = {
    3. plugins: [
    4. [
    5. (pluginOptions, context) => ({
    6. name: 'my-xxx-plugin'
    7. // ... the rest of options
    8. })
    9. ]
    10. ]
    11. }

    plugins

    • 类型: array
    • 默认值: undefined一个插件可以像 preset 一样包含多个插件。
    1. // 一个插件
    2. module.exports = {
    3. plugins: [
    4. 'tag',
    5. 'category'
    6. ]
    7. }

    chainWebpack

    • 类型: Function
    • 默认值: undefined使用 webpack-chain 来修改内部的 webpack 配置:
    1. module.exports = {
    2. chainWebpack (config, isServer) {
    3. // config 是一个 ChainableConfig 的实例
    4. }
    5. }

    提示

    由于 VuePress 是一个基于 Vue-SSR 的应用,这里会有两个 webpack 配置,isServer 用于决定当前的 webpack 配置是应用到 server 还是 client。

    参考:

    • Vue SSR > 构建配置

    define

    • 类型: Object|Function
    • 默认值: undefined由于通过 chainWebpack 使用 DefinePlugin 会有点麻烦:
    1. module.exports = {
    2. chainWebpack (config) {
    3. config.plugin('injections').tap(([options]) => [
    4. Object.assign(options, {
    5. SW_BASE_URL: JSON.stringify('/')
    6. })
    7. ])
    8. }
    9. }

    VuePress 特别开辟了一个更简洁的 define 选项。值得注意的是这些值已自动地被 JSON.stringify 处理。

    • 对象式:
    1. module.exports = {
    2. define: {
    3. SW_BASE_URL: '/',
    4. }
    5. }
    • 函数式:
    1. module.exports = (options, context) => ({
    2. define () {
    3. return {
    4. SW_BASE_URL: context.base || '/',
    5. SW_ENABLED: !!options.enabled,
    6. }
    7. }
    8. })

    alias

    • 类型: Object|Function
    • 默认值: undefined我们可以通过 chainWebpack 来配置别名:
    1. module.exports = (options, context) => ({
    2. chainWebpack (config) {
    3. config.resolve.alias.set('@pwd', process.cwd())
    4. }
    5. })

    alias 可以使这个流程更像配置:

    1. module.exports = (options, context) => ({
    2. alias: {
    3. '@theme': context.themeAPI.themePath
    4. }
    5. })

    beforeDevServer

    • 类型: Function
    • 默认值: undefined等同于 webpack-dev-server 中的 before 选项,你可以使用它来自定义你的 devServer,如:
    1. module.exports = {
    2. // ...
    3. beforeDevServer(app, server) {
    4. app.get('/path/to/your/custom', function(req, res) {
    5. res.json({ custom: 'response' })
    6. })
    7. }
    8. }

    afterDevServer

    • 类型: Function
    • 默认值: undefined等同于 webpack-dev-server 中的 after,你可以用其在所有中间件的最后去执行一些自定义的中间件:
    1. module.exports = {
    2. // ...
    3. afterDevServer(app, server) {
    4. // hacking now ...
    5. }
    6. }

    extendMarkdown

    • 类型: Function
    • 默认值: undefined一个函数,修改内部用于渲染 markdown 文件的 markdown-it 实例的配置、或者应用一些额外的插件:
    1. module.exports = {
    2. extendMarkdown: md => {
    3. md.set({ breaks: true })
    4. md.use(require('markdown-it-xxx'))
    5. }
    6. }

    chainMarkdown

    • 类型: Function
    • 默认值: undefined使用 markdown-it-chain 来修改内部的 markdown 配置。
    1. module.exports = {
    2. chainMarkdown (config) {
    3. // 与 new MarkdownIt 的 'options' 互动
    4. // 参考: https://markdown-it.github.io/markdown-it/#MarkdownIt.new
    5. config
    6. .options
    7. .link(true)
    8. .breaks(true)
    9. // 修改内置插件的参数
    10. config
    11. .plugin('anchor')
    12. .tap(([options]) => [
    13. Object.assign(options, { permalinkSymbol: '#' })
    14. ])
    15. // 增加额外的插件
    16. config
    17. .plugin('sup')
    18. .use(require('markdown-it-sup'))
    19. // Remove internal plugin
    20. config.plugins.delete('snippet')
    21. }
    22. }

    参考:

    • VuePress 的内置 markdown-it 插件
    • 配置插件

    enhanceAppFiles

    • 类型: String | Array | AsyncFunction
    • 默认值: undefined此选项接受指向增强文件的绝对文件路径或返回该路径的函数,你可以通过此选项做一些应用级别的配置:
    1. import { resolve } from 'path'
    2. module.exports = {
    3. enhanceAppFiles: resolve(__dirname, 'client.js')
    4. }

    此选项还支持动态代码,允许你使用触摸编译上下文的能力来做更多的事:

    1. module.exports = (option, context) => {
    2. return {
    3. enhanceAppFiles() {
    4. return {
    5. name: 'dynamic-code',
    6. content: `export default ({ Vue }) => { Vue.mixin('$source', '${
    7. context.sourceDir
    8. }') }`
    9. }
    10. }
    11. }
    12. }

    clientDynamicModules

    • 类型: Function
    • 默认值: undefined有时,你可能想要在编译期间生成一些在客户端使用的模块:
    1. module.exports = (options, context) => ({
    2. clientDynamicModules() {
    3. return {
    4. name: 'constants.js',
    5. content: `export const SOURCE_DIR = '${context.sourceDir}'`
    6. }
    7. }
    8. })

    然后你可以在客户端这样使用你的模块:

    1. import { SOURCE_DIR } from '@dynamic/constants'

    extendPageData

    • 类型: Function
    • 默认值: undefined一个函数,用于拓展或者修改 $page 对象。这个函数将会在编译器为每个页面执行一次。
    1. module.exports = {
    2. extendPageData ($page) {
    3. const {
    4. _filePath, // 源文件的绝对路径
    5. _computed, // 在构建期访问全局的计算属性,如:_computed.$localePath.
    6. _content, // 源文件的原始内容字符串
    7. _strippedContent, // 源文件剔除掉 frontmatter 的内容字符串
    8. key, // 页面唯一的 hash key
    9. frontmatter, // 页面的 frontmatter 对象
    10. regularPath, // 当前页面遵循文件层次结构的默认链接
    11. path, // 当前页面的实际链接(在 permalink 不存在时,使用 regularPath )
    12. } = $page
    13. // 1. Add extra fields.
    14. $page.xxx = 'xxx'
    15. // 2. Change frontmatter.
    16. frontmatter.sidebar = 'auto'
    17. }
    18. }

    注意

    那些以 _ 开头的字段意味着你只能在编译期访问。

    例子:

    1. module.exports = {
    2. extendPageData ($page) {
    3. $page.size = ($page._content.length / 1024).toFixed(2) + 'kb'
    4. }
    5. }

    然后你可以在任意的 Vue 中通过 this.$page.size 来访问这个变量。

    clientRootMixin

    • 类型: String
    • 默认值: undefined指向 mixin 文件的路径,它让你你可以控制根组件的生命周期:
    1. // 插件的入口
    2. const path = require('path')
    3. module.exports = {
    4. clientRootMixin: path.resolve(__dirname, 'mixin.js')
    5. }
    1. // mixin.js
    2. export default {
    3. created () {},
    4. mounted () {}
    5. }

    additionalPages

    • 类型: Array|AsyncFunction
    • 默认值: undefined增加一个指向某个 markdown 文件的页面:
    1. const path = require('path')
    2. module.exports = {
    3. additionalPages: [
    4. {
    5. path: '/readme/',
    6. filePath: path.resolve(__dirname, '../../README.md')
    7. }
    8. ]
    9. }

    或增加一个具有明确内容的页面:

    1. module.exports = {
    2. async additionalPages () {
    3. // 注意 VuePress 没有任何内置的请求库,
    4. // 你需要自己安装它。
    5. const rp = require('request-promise')
    6. const content = await rp('https://raw.githubusercontent.com/vuejs/vuepress/master/CHANGELOG.md')
    7. return [
    8. {
    9. path: '/changelog/',
    10. content
    11. }
    12. ]
    13. }
    14. }

    或增加一个纯粹的路由:

    1. module.exports = {
    2. additionalPages: [
    3. {
    4. path: '/alpha/',
    5. frontmatter: {
    6. layout: 'MyLayout'
    7. }
    8. }
    9. ]
    10. }

    globalUIComponents

    • 类型: Array|String
    • 默认值: undefined你可能想注入某些全局的 UI,并固定在页面中的某处,如 back-to-top, popup。在 VuePress 中,一个全局 UI 就是一个 Vue 组件。你可以直接配置该全局组件的名称,如:
    1. module.exports = {
    2. globalUIComponents: [
    3. 'Component-1',
    4. 'Component-2'
    5. ]
    6. }

    VuePress 将会自动将这些组件注入到布局组件的隔壁:

    1. <div id="app">
    2. <div class="theme-container"> ... </div> <!-- Layout Component -->
    3. <div class="global-ui">
    4. <Component-1/>
    5. <Component-2/>
    6. </div>
    7. </div>

    extendCli

    • 类型: function
    • 默认值: undefined注册一个额外的 command 来增强 vuepress 的 CLI。这个函数将会以一个 CAC 的实例作为第一个参数被调用。
    1. module.exports = {
    2. extendCli (cli) {
    3. cli
    4. .command('info [targetDir]', '')
    5. .option('--debug', 'display info in debug mode')
    6. .action((dir = '.') => {
    7. console.log('Display info of your website')
    8. })
    9. }
    10. }

    现在你可以在你项目中使用 vuepress info [targetDir] 了!

    提示

    值得注意的是,一个自定义的 command 需要 VuePress 像 vuepress devvuepress build 去定位到你的站点配置,所以在开发一个 command 时,请确保引导用户去传入 targetDir 作为 CLI 参数的一部分。