# Migrate to 3.*

If you're using vue.component, vue.render or vue.staticRenderFns by importing. The upgrade may affect your project.

On the template for Vue component by compiling markdown,

  • Source attributes for img, video, source, image, use tag
  • ![alt text](Image URL) on Markdown

are transformed as Webpack env's assets like require(originalPath) as default. So, check each element is working as you intended.

To disable this transformation, give vue.transformAssetUrls: false.

{
  test: /\.md$/,
  loader: 'frontmatter-markdown-loader'
  options: {
    mode: [Mode.VUE_COMPONENT]
    vue: {
      transformAssetUrls: false
    }
  }
}

And vue.render, vue.staticRenderFns becomes to return functions instead of string of functions.

import fm from "something.md"
import OtherComponent from "OtherComponent.vue"

export default {
  data () {
    return {
      templateRender: null
    }
  },

  components: {
    OtherComponent // If markdown has `<other-component>` in body, will work :)
  },

  render (createElement) {
    return this.templateRender ? this.templateRender() : createElement("div", "Rendering");
  },

  created () {
-    this.templateRender = new Function(fm.vue.render)();
-    this.$options.staticRenderFns = new Function(fm.vue.staticRenderFns)()
+    this.templateRender = fm.vue.render;
+    this.$options.staticRenderFns = fm.vue.staticRenderFns;
  }
}

# Migrate to 2.*/3.* from 1.*

From 2.0.0, mode is added to load contents selectively. That was breaking change but compresses the build size a lot.

See the section as your use-case in 1.x.y:

# Was importing md.html only

As v2's default behavior, html and attributes will be returned. So nothing to configure in your end. The config will be really simple.

{
  test: /\.md$/,
  loader: 'frontmatter-markdown-loader'
}

Then the loader gives [Mode.HTML] for options.mode.

# Was importing md.body

Have Mode.BODY (body as string) on options.mode.

import Mode from "frontmatter-markdown-loader/mode"

...

{
  test: /\.md$/,
  loader: 'frontmatter-markdown-loader'
  options: {
    mode: [Mode.HTML, Mode.BODY]
  }
}

# Was importing md.attributes._meta

Have Mode.META (meta as string) on options.mode.

import Mode from "frontmatter-markdown-loader/mode"

...

{
  test: /\.md$/,
  loader: 'frontmatter-markdown-loader'
  options: {
    mode: [Mode.HTML, Mode.META]
  }
}

# Was using vue: true option

# To use md.vue.render, md.vue.staticRenderFns

Have Mode.VUE_RENDER_FUNCTIONS (vue-render-functions as string) on options.mode.

import Mode from "frontmatter-markdown-loader/mode"

...

{
  test: /\.md$/,
  loader: 'frontmatter-markdown-loader'
  options: {
    mode: [Mode.VUE_RENDER_FUNCTIONS]
  }
}

If you had vue.root, you can keep that to specify the class name of root element.

{
  test: /\.md$/,
  loader: 'frontmatter-markdown-loader'
  options: {
    mode: [Mode.VUE_RENDER_FUNCTIONS],
    vue: {
      root: 'myAwesomeMarkdown'
    }
  }
}

# To use md.vue.component

Have Mode.VUE_COMPONENT (vue-component as string) on options.mode.

import Mode from "frontmatter-markdown-loader/mode"

...

{
  test: /\.md$/,
  loader: 'frontmatter-markdown-loader'
  options: {
    mode: [Mode.VUE_COMPONENT]
  }
}

If you had vue.root, you can keep that to specify the class name of root element.

{
  test: /\.md$/,
  loader: 'frontmatter-markdown-loader'
  options: {
    mode: [Mode.VUE_COMPONENT],
    vue: {
      root: 'myAwesomeMarkdown'
    }
  }
}