Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/CarterLi/vue3-ace-editor
Like vue2-ace-editor but more functional and supports Vue 3
https://github.com/CarterLi/vue3-ace-editor
Last synced: 3 months ago
JSON representation
Like vue2-ace-editor but more functional and supports Vue 3
- Host: GitHub
- URL: https://github.com/CarterLi/vue3-ace-editor
- Owner: CarterLi
- License: mit
- Created: 2020-09-09T09:22:53.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2024-07-24T14:50:07.000Z (6 months ago)
- Last Synced: 2024-10-02T06:53:24.796Z (4 months ago)
- Language: TypeScript
- Size: 1.58 MB
- Stars: 183
- Watchers: 4
- Forks: 24
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesomeLibrary - vue3-ace-editor - Like vue2-ace-editor but more functional and supports Vue 3 (语言资源库 / typescript)
README
vue3-ace-editor
====================[![npm](https://img.shields.io/npm/v/vue3-ace-editor.svg)](https://www.npmjs.com/package/vue3-ace-editor)
A packaging of [ace](https://ace.c9.io/). Inspired by [vue2-ace-editor](https://github.com/chairuosen/vue2-ace-editor), but supports [Vue 3](https://github.com/vuejs/vue-next)
## Install
`ace-builds` must be installed alongside `vue3-ace-editor` using your favorite package manager.
* npm i vue3-ace-editor ace-builds
* yarn add vue3-ace-editor ace-builds
* pnpm i vue3-ace-editor ace-builds## Usage
```vue
import { ref } from 'vue';
import { VAceEditor } from 'vue3-ace-editor';
import 'ace-builds/src-noconflict/mode-json'; // Load the language definition file used below
import 'ace-builds/src-noconflict/theme-chrome'; // Load the theme definition file used belowconst content = ref(JSON.stringify({ message: 'Hello Ace' }));
```
Property `v-model:value` is required. `` has no height by default. Its height must be specified manually, or set both `min-lines` and `max-lines` to make the editor's height auto-grow.
Property `lang`, `theme` is same as [ace-editor's doc](https://github.com/ajaxorg/ace)
## Load modes and themes (**REQUIRED**)
Using of `ace-builds/webpack-resolver` is removed due to bug https://github.com/CarterLi/vue3-ace-editor/issues/3. You **MUST** import `theme` and `mode` yourself. eg.
```js
// You MUST make sure that `ace-builds` or `vue3-ace-editor` (which imports `ace-builds` internally) is loaded before importing `mode` and `theme`
import 'ace-builds/src-noconflict/mode-json';
import 'ace-builds/src-noconflict/theme-chrome';
```To use dynamic loading to avoid first-load overhead
```js
import ace from 'ace-builds';import modeJsonUrl from 'ace-builds/src-noconflict/mode-json?url';
ace.config.setModuleUrl('ace/mode/json', modeJsonUrl);import themeChromeUrl from 'ace-builds/src-noconflict/theme-chrome?url';
ace.config.setModuleUrl('ace/theme/chrome', themeChromeUrl);
```Note that to make search box (`Ctrl+F` or `Command+F`) work, `ext-searchbox` must also be loaded.
```js
import extSearchboxUrl from 'ace-builds/src-noconflict/ext-searchbox?url';
ace.config.setModuleUrl('ace/ext/searchbox', extSearchboxUrl);
```Find all supported themes and modes in `node_modules/ace-builds/src-noconflict`
## Deferences with [vue2-ace-editor](https://github.com/chairuosen/vue2-ace-editor)
1. This component uses [ace-builds](https://www.npmjs.com/package/ace-builds) directly, instead of the outdated wrapper [brace](https://www.npmjs.com/package/brace)
1. DOM size changes are detected automatically using [ResizeObserver](resize-observer-polyfill), thus no `width` / `height` props needed.
1. For easier usage, more props / events added / emitted.
1. Prop `readonly`: This Boolean attribute indicates that the user cannot modify the value of the control.
1. Prop `placeholder`: A hint to the user of what can be entered in the control.
1. Prop `wrap`: Indicates whether the control wraps text.
1. Prop `printMargin`: A short hand of `showPrintMargin` and `printMarginColumn`.
1. Prop `minLines` and `maxLines`: Specifiy the minimum and maximum number of lines.
1. All ace events emitted. Docs can be found here:
1. Some commonly used methods `focus`, `blur`, `selectAll` provided as shortcuts.## Get raw ace instance
Use `getAceInstance`
```vue
import { ref, onMounted } from 'vue';
const aceRef = ref(null);
onMounted(() => {
console.log(aceRef.value.getAceInstance());
})
```
`@init` is provided for `vue2-ace-editor` compatibility only but is not recommanded to use.
## Enable syntax checking
To enable syntax checking, module `ace/mode/lang_worker` must be registered, and option `useWorker: true` must be set.
Take JSON for example:
```ts
import workerJsonUrl from 'ace-builds/src-noconflict/worker-json?url'; // For viteimport workerJsonUrl from 'file-loader?esModule=false!ace-builds/src-noconflict/worker-json.js'; // For webpack / vue-cli
ace.config.setModuleUrl('ace/mode/json_worker', workerJsonUrl);
``````html
```
See also https://github.com/CarterLi/vue3-ace-editor/issues/3#issuecomment-768190528 to load the worker file from CDN
## Minimal example using vite
* Preview:
* Source:## Use it with Nuxt
Since ace doesn't support SSR, using it with Nuxt can be tricky. You must make sure that `ace` related things are loaded only at client side.
```vue
import { markRaw, onMounted, ref } from 'vue';
const VAceEditor = ref('div'); // Stores dynamic loaded component. Before `vue3-ace-editor` is loaded, a `div` is used as a placeholder
const content = ref(JSON.stringify({ platform: 'Nuxt', env: 'SSR' }, null, 2));onMounted(async () => { // onMounted is a client-only lifecycle hook
await import('ace-builds'); // To importing things in a function, dynamic import must be used
await import('ace-builds/src-noconflict/mode-json');
await import('ace-builds/src-noconflict/theme-chrome');
VAceEditor.value = markRaw((await import('vue3-ace-editor')).VAceEditor);
});
```
Full example:
## LICENSE
MIT