5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AceエディタをVueコンポーネントにして使いたい!

Last updated at Posted at 2021-02-05

image.png
Ace (Ajax.org Cloud9 Editor) というブラウザ上で動作するテキストエディタがあるのですが、Vueで動作させるためにどうすればいいのかではまったのでまとめておきます。

環境

  • Vue CLI v4.5.10
  • Vue 2を選択して新しいプロジェクトを作成した状態

NPM

名前にaceがつくパッケージがいろいろあって紛らわしいのですが、本家はace-buildsです。

npm install ace-builds

Vue

それでは新しいVueコンポーネントファイルAce.vueを記述していきます。

まずAceをバインドさせるdiv要素をテンプレートに用意します。ref属性は後で使います。スタイルクラスはお好みで。

<template>
  <div ref="ace" class="ace"></div>
</template>

<style scoped>
.ace {
  position: relative !important;
  border: 1px solid lightgray;
  margin: auto;
  height: 100%;
  width: 100%;
}
</style>

script要素内でインポートするのはace-builds, ace-builds/webpack-resolver そして使いたい言語モードとテーマです。

import ace from 'ace-builds'
import 'ace-builds/webpack-resolver'

// 使いたい言語モードのインポート
import 'ace-builds/src-noconflict/mode-javascript'

// 使いたいテーマのインポート
import 'ace-builds/src-noconflict/theme-github'

あとはAceをmountedフックの中で初期化させれば良さそうです。Aceを初期化する際、先ほど定義したref属性の値をthis.$refsで参照します。そしていずれ使いそうなので、dataにAceエディタへの参照editorを保存しておきます。

言語モードはace/mode/abc、テーマはace/theme/_abc_の形で指定します。

export default {
  name: 'Ace',
  data() {
    return {
      editor: Object,
    };
  },
  mounted () {
    this.editor = ace.edit(this.$refs.ace);
    this.editor.session.setMode('ace/mode/javascript');
    this.editor.setTheme('ace/theme/monokai');
  }
};

できたファイルの中身はこんな感じです。

Ace.vue
<template>
  <div ref="ace" class="ace"></div>
</template>

<script>
import ace from 'ace-builds'
import 'ace-builds/webpack-resolver'

// 使いたい言語モードのインポート
import 'ace-builds/src-noconflict/mode-javascript'

// 使いたいテーマのインポート
import 'ace-builds/src-noconflict/theme-github'

export default {
  name: 'Ace',
  data() {
    return {
      editor: Object,
    };
  },
  mounted () {
    this.editor = ace.edit(this.$refs.ace);
    this.editor.session.setMode('ace/mode/javascript');
    this.editor.setTheme('ace/theme/monokai');
  }
};
</script>

<style scoped>
.ace {
  position: relative !important;
  border: 1px solid lightgray;
  margin: auto;
  height: 100%;
  width: 100%;
}
</style>

とりあえずAceをコンポーネント化できました。App.vueでインポートして、ビルドしてみるとちゃんと動きます。

image.png

App.vue
<template>
  <div id="app">
    <div style="width: 20rem; height: 10rem">
      <Ace />
    </div>
  </div>
</template>

<script>
import Ace from './components/Ace.vue'

export default {
  name: 'App',
  components: {
    Ace
  }
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  color: #2c3e50;
}
</style>

Aceコンポーネントのパラメータ化

せっかくなので、言語モードやテーマ、あとエディタにデフォルトで表示させるテキストを外から指定したりできるようにしてみました。
こちらに置いておきます: https://github.com/otoiku/ace_component

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?