Z

Monaco Editor Install

monaco-editor(后文简称monaco)源自VS Code,它是目前地球上最先进的在线代码编辑器,如果只用到一些开箱即用的功能,那与平常使用的JavaScript第三方库没什么区别。但想要在其上做一些复杂的定制开发,相对来说就麻烦一些。之后的文章会探讨在monaco上做定制开发的一些方法。

安装

这部分没什么可多说的,就是平常Web开发的那一套了,为了给后续文章一些环境的上下文,这里列出我的monaco安装配置,使用的技术有TypeScript,SCSS,Webpack。

monaco本身自带有样式及字体,所以即使你不写额外的样式,Webpack也需要包含处理样式及字体的loader,这是我的webpack配置:

 1const { resolve } = require("path");
 2
 3const HtmlWebpackPlugin = require("html-webpack-plugin");
 4const MonacoWebpackPlugin = require("monaco-editor-webpack-plugin");
 5
 6const dist = resolve(__dirname, "dist");
 7
 8module.exports = {
 9    entry: "./src/index.ts",
10    output: {
11        filename: "[name].[hash].js",
12        path: dist,
13    },
14    resolve: {
15        extensions: [".ts", ".js", ".scss"],
16    },
17    mode: "development",
18    devtool: "source-map",
19    module: {
20        rules: [
21            {
22                test: /\.ts$/,
23                use: "ts-loader",
24            },
25            {
26                test: /\.css$/,
27                use: ["style-loader", "css-loader"],
28            },
29            {
30                test: /\.scss$/i,
31                use: [
32                    "style-loader",
33                    {
34                        loader: "css-loader",
35                        options: {
36                            localsConvention: "camelCaseOnly",
37                            modules: {
38                                localIdentName:
39                                    "[path][name]__[local]--[hash:base64:5]",
40                            },
41                            importLoaders: 2,
42                        },
43                    },
44                    "sass-loader",
45                ],
46            },
47            {
48                test: /\.(png|jpe?g|gif|woff2?|ttf)$/,
49                use: "file-loader",
50            },
51        ],
52    },
53    devServer: {
54        port: 3000,
55        contentBase: dist,
56        hot: true,
57    },
58    plugins: [
59        new MonacoWebpackPlugin(),
60        new HtmlWebpackPlugin({
61            filename: "index.html",
62            template: resolve(__dirname, "src/index.html"),
63        }),
64    ],
65};

有一点需要额外说一下,Webpack配置里使用了MonacoWebpackPlugin,它用于帮你打包monaco的language web worker。monaco默认支持TypeScript, JavaScript, CSS, LESS, SCSS, JSON, HTML。加载了这些worker,在网页上就能有类似于VS Code的语法检查、补全效果,不论你的编辑器是不是要支持这些语言,都推荐使用它。

创建编辑器实例

通过editor.create创建一个编辑器实例,我们可以写一个函数,用于创建编辑器实例。

 1import { editor } from "monaco-editor";
 2
 3function createEditor(ele: HTMLElement) {
 4    const editorInstance = editor.create(ele, {
 5        automaticLayout: true,
 6        language: "typescript",
 7    });
 8}
 9
10export { createEditor };

现在就有了一个在线的typescript编辑器了,得益于前面使用了MonacoWebpackPlugin,创建编辑器时monaco会自动根据配置的语言(通过language字段)加载对应web worker。现在的编辑器已经与VS Code没什么区别了。

同时我们还配置了automaticLayout为true,确保monaco可以根据根结点,也就是参数ele的尺寸变化自动重新布局,这点非常方便,否则就需要手动完成重新布局过程。

目前为止,我们已经有了一个开箱即用的TypeScript编辑器了,接着可以进一步开发了。