monaco-editor体积优化

2,984 阅读3分钟

最近使用monaco-editor打包体积很大,就通过按需加载功能模块来实现打包体积的优化,写个笔记记录一下。

优化思路

思路来源

import * as monaco from 'monaco-editor';
// or import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
// if shipping only a subset of the features & languages is desired

monaco.editor.create(document.getElementById('container'), {
	value: 'console.log("Hello, world")',
	language: 'javascript'
});

就是使用import * as monaco from 'monaco-editor/esm/vs/editor/editor.api引入monaco-eitor,这个就是最基础的版本,没有语言高亮、代码提示、折叠、右键等。 如果需要代码高亮、折叠等功能,我们就在这个基础版本上引入对应的功能即可。

示例

这是一个简单的javascript编辑器,有语法高亮、代码提示、折叠和代码格式化的功能。

import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker';
import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker';
import "monaco-editor/esm/vs/basic-languages/typescript/typescript.contribution"; // 代码高亮&提示
import "monaco-editor/esm/vs/basic-languages/javascript/javascript.contribution"; // 代码高亮&提示
import "monaco-editor/esm/vs/language/typescript/monaco.contribution"; // 代码高亮&提示
import 'monaco-editor/esm/vs/editor/contrib/contextmenu/browser/contextmenu.js'; // 右键显示菜单
import 'monaco-editor/esm/vs/editor/contrib/folding/browser/folding.js'; // 折叠
import 'monaco-editor/esm/vs/editor/contrib/format/browser/formatActions.js'; // 格式化代码
import 'monaco-editor/esm/vs/editor/contrib/suggest/browser/suggestController.js'; // 代码联想提示
import 'monaco-editor/esm/vs/editor/contrib/tokenization/browser/tokenization.js'; // 代码联想提示

self.MonacoEnvironment = {
  getWorker: function (workerId, label) {
    switch (label) {
      case 'typescript':
      case 'javascript':
        return new tsWorker();
      default:
        return new editorWorker();
    }
  }
};

效果

优化前

image.png

vite v2.9.12 building for production...

✓ 92 modules transformed.
✓ 94 modules transformed.
✓ 140 modules transformed.
✓ 875 modules transformed.
dist/static/css/codicon-71cccbf1.ttf          70.80 KiB
dist/assets/editor.worker.a0146d7d.js         171.11 KiB
dist/assets/ts.worker.8f4f13c7.js             4783.24 KiB
dist/index.html                               0.43 KiB
dist/static/js/apex-9c789700.js               4.10 KiB / gzip: 1.86 KiB
dist/static/js/azcli-bd012a0d.js              1.07 KiB / gzip: 0.45 KiB
dist/static/js/abap-6a4bf9d6.js               14.07 KiB / gzip: 5.35 KiB
dist/static/js/bat-b1fe6d7e.js                2.04 KiB / gzip: 0.98 KiB
dist/static/js/bicep-bbe1b6ba.js              2.72 KiB / gzip: 1.08 KiB
dist/static/js/cameligo-177f1489.js           2.37 KiB / gzip: 1.07 KiB
dist/static/js/coffee-86d4a932.js             3.75 KiB / gzip: 1.42 KiB
dist/static/js/cpp-d86cb30d.js                5.56 KiB / gzip: 2.20 KiB
dist/static/js/clojure-2515574a.js            9.66 KiB / gzip: 3.65 KiB
dist/static/js/csp-c6eae903.js                1.63 KiB / gzip: 0.65 KiB
dist/static/js/csharp-54422859.js             4.66 KiB / gzip: 1.82 KiB
dist/static/js/css-8c53ab1c.js                4.64 KiB / gzip: 1.49 KiB
dist/static/js/cypher-36832a3b.js             3.55 KiB / gzip: 1.53 KiB
dist/static/js/dockerfile-35b9e10f.js         2.07 KiB / gzip: 0.79 KiB
dist/static/js/flow9-b296caf9.js              2.01 KiB / gzip: 0.96 KiB
dist/static/js/dart-5254d8ca.js               4.39 KiB / gzip: 1.74 KiB
dist/static/js/ecl-36eb7644.js                5.46 KiB / gzip: 2.33 KiB
dist/static/js/fsharp-3ebde1fc.js             3.15 KiB / gzip: 1.42 KiB
dist/static/js/go-091c5c74.js                 2.83 KiB / gzip: 1.25 KiB
dist/static/js/elixir-a61d4a28.js             9.77 KiB / gzip: 2.55 KiB
dist/static/js/graphql-6a07f0a6.js            2.45 KiB / gzip: 1.13 KiB
dist/static/js/freemarker2-d47c37c6.js        16.05 KiB / gzip: 4.20 KiB
dist/static/js/handlebars-fe4dd919.js         6.95 KiB / gzip: 1.74 KiB
dist/static/js/hcl-d1f42738.js                3.75 KiB / gzip: 1.59 KiB
dist/static/js/html-01d6b905.js               5.23 KiB / gzip: 1.53 KiB
dist/static/js/javascript-63dc6030.js         1.21 KiB / gzip: 0.63 KiB
dist/static/js/ini-cd9a24ed.js                1.32 KiB / gzip: 0.66 KiB
dist/static/js/java-24bf770d.js               3.39 KiB / gzip: 1.50 KiB
dist/static/js/kotlin-33a63639.js             3.60 KiB / gzip: 1.57 KiB
dist/static/js/typescript-e510ad13.js         5.60 KiB / gzip: 2.27 KiB
dist/static/js/lexon-bc6c82b7.js              2.62 KiB / gzip: 1.04 KiB
dist/static/js/less-b3428552.js               4.05 KiB / gzip: 1.52 KiB
dist/static/js/julia-c6b7edf4.js              7.29 KiB / gzip: 2.69 KiB
dist/static/js/lua-10de6019.js                2.31 KiB / gzip: 1.04 KiB
dist/static/js/m3-541e2c4e.js                 2.99 KiB / gzip: 1.41 KiB
dist/static/js/markdown-dbc1189e.js           3.94 KiB / gzip: 1.49 KiB
dist/static/js/liquid-5ca55e5a.js             4.20 KiB / gzip: 1.78 KiB
dist/static/js/mips-b0359785.js               2.76 KiB / gzip: 1.19 KiB
dist/static/js/objective-c-59d1a983.js        2.59 KiB / gzip: 1.17 KiB
dist/static/js/msdax-8626084f.js              5.04 KiB / gzip: 2.05 KiB
dist/static/js/pascaligo-858da816.js          2.19 KiB / gzip: 1.03 KiB
dist/static/js/pascal-8f0bf5a6.js             3.17 KiB / gzip: 1.50 KiB
dist/static/js/mysql-61258bc9.js              11.23 KiB / gzip: 4.09 KiB
dist/static/js/pla-ce7ce98a.js                1.88 KiB / gzip: 0.77 KiB
dist/static/js/perl-7c5420ea.js               8.30 KiB / gzip: 3.16 KiB
dist/static/js/php-76967d70.js                8.08 KiB / gzip: 2.15 KiB
dist/static/js/postiats-e25d8fee.js           7.91 KiB / gzip: 2.50 KiB
dist/static/js/powershell-37fd0fcf.js         3.43 KiB / gzip: 1.47 KiB
dist/static/js/python-2aa88607.js             3.87 KiB / gzip: 1.73 KiB
dist/static/js/protobuf-a16e6b52.js           9.07 KiB / gzip: 2.15 KiB
dist/static/js/pgsql-cb9ca237.js              13.33 KiB / gzip: 4.51 KiB
dist/static/js/pug-f1d20abb.js                4.96 KiB / gzip: 1.74 KiB
dist/static/js/r-9758a160.js                  3.30 KiB / gzip: 1.39 KiB
dist/static/js/qsharp-5fd4b01d.js             3.11 KiB / gzip: 1.46 KiB
dist/static/js/powerquery-875a007e.js         16.78 KiB / gzip: 4.89 KiB
dist/static/js/redis-51c379a5.js              3.71 KiB / gzip: 1.58 KiB
dist/static/js/razor-a722df70.js              8.91 KiB / gzip: 2.40 KiB
dist/static/js/restructuredtext-c7ba3444.js   4.04 KiB / gzip: 1.47 KiB
dist/static/js/rust-f7a10365.js               4.30 KiB / gzip: 1.91 KiB
dist/static/js/sb-ad12ccee.js                 2.03 KiB / gzip: 0.95 KiB
dist/static/js/ruby-af55dd67.js               8.54 KiB / gzip: 2.64 KiB
dist/static/js/redshift-49a0a6c6.js           11.76 KiB / gzip: 4.36 KiB
dist/static/js/scheme-932f6028.js             1.97 KiB / gzip: 0.93 KiB
dist/static/js/scala-997545d7.js              7.39 KiB / gzip: 2.17 KiB
dist/static/js/shell-2951783f.js              3.24 KiB / gzip: 1.32 KiB
dist/static/js/scss-7242a203.js               6.50 KiB / gzip: 1.85 KiB
dist/static/js/sophia-16ade9f1.js             2.94 KiB / gzip: 1.31 KiB
dist/static/js/sparql-80e86f3b.js             2.73 KiB / gzip: 1.27 KiB
dist/static/js/swift-5e0c1d7d.js              5.29 KiB / gzip: 2.15 KiB
dist/static/js/solidity-ecf1b4ee.js           18.40 KiB / gzip: 4.47 KiB
dist/static/js/sql-0a0621b8.js                10.30 KiB / gzip: 3.89 KiB
dist/static/js/st-f1fdd5d5.js                 7.46 KiB / gzip: 2.32 KiB
dist/static/js/tcl-93b2e7b2.js                3.73 KiB / gzip: 1.47 KiB
dist/static/js/twig-fa486bb3.js               6.07 KiB / gzip: 1.62 KiB
dist/static/js/vb-0829324d.js                 5.90 KiB / gzip: 2.15 KiB
dist/static/js/xml-8fb518da.js                2.69 KiB / gzip: 1.11 KiB
dist/static/js/systemverilog-ffa15dc6.js      7.67 KiB / gzip: 2.82 KiB
dist/static/js/yaml-e5a124b1.js               4.24 KiB / gzip: 1.63 KiB
dist/static/js/tsMode-22ed608b.js             21.81 KiB / gzip: 6.30 KiB
dist/static/js/htmlMode-41dd7985.js           33.56 KiB / gzip: 8.85 KiB
dist/static/js/cssMode-9e42ff5b.js            33.03 KiB / gzip: 8.73 KiB
dist/static/js/jsonMode-1af6005d.js           38.92 KiB / gzip: 10.83 KiB
dist/static/css/index-49127184.css            83.35 KiB / gzip: 14.33 KiB
dist/static/js/index-679bd70a.js              2870.25 KiB / gzip: 735.61 KiB

优化后

image.png

vite v2.9.12 building for production...
✓ 46 modules transformed.
✓ 93 modules transformed.
✓ 543 modules transformed.
dist/static/css/codicon-71cccbf1.ttf    70.80 KiB
dist/assets/editor.worker.a0146d7d.js   171.11 KiB
dist/assets/ts.worker.8f4f13c7.js       4783.24 KiB
dist/index.html                         0.43 KiB
dist/static/js/javascript-8391752c.js   1.21 KiB / gzip: 0.63 KiB
dist/static/js/typescript-c89694e3.js   5.60 KiB / gzip: 2.27 KiB
dist/static/js/tsMode-0232e6d7.js       21.81 KiB / gzip: 6.30 KiB
dist/static/css/index-b865ba57.css      54.70 KiB / gzip: 9.19 KiB
dist/static/js/index-e0572502.js        2253.75 KiB / gzip: 587.84 KiB