[HN Gopher] Ace, CodeMirror, and Monaco: A comparison of browser... ___________________________________________________________________ Ace, CodeMirror, and Monaco: A comparison of browser code editors (2021) Author : williamstein Score : 185 points Date : 2022-03-14 15:42 UTC (7 hours ago) (HTM) web link (blog.replit.com) (TXT) w3m dump (blog.replit.com) | laurent123456 wrote: | Mobile support means that CodeMirror 6 is often the only option. | I think it's a bit of a waste to start of project with Ace or | Monaco, knowing that it will never work in mobile. | masfrost wrote: | Ace is not perfect on mobile, but it works to some extent. | qbasic_forever wrote: | Agreed, it's really surprising to me that MS hasn't put more | effort into getting a solid mobile-friendly option with Monaco. | [deleted] | ianberdin wrote: | Yes, unfortunately Monaco is far from the most stable, but | powerful out of the box. Therefore http://playcode.io moved from | Ace to Monaco. Speaking of technology! Playcode is the only and | first playground that uses Esbuild in the browser, so it works | super fast. | pictur wrote: | what does it mean to use esbuild in browser? | Lordronn wrote: | kaycebasques wrote: | The code editors in Chrome DevTools are powered by CodeMirror. | masfrost wrote: | Author here. Glad to see the blogpost on HN! | | CodeMirror improved Replit's performance by a lot and by | extension our retention. In fact, after releasing it to mobile in | July[1] our weekly retention rate on mobile increased by a | whopping 70%. That said, solve a lot of mobile usability issues | so it's not all due to performance. On desktop however, it's a | different story, we made sure to just have parity with Monaco and | it still improved retention by %25, almost all due to | performance! | | If you like working on performance come work at Replit, we want | people that care about the performance of our systems! | | Adopting CodeMirror pushed us to write more in a more functional | style that makes the code more fun and simple (not easy) in the | shortrun, and more maintainable in the long run! My teammates | write CodeMirror extensions for kicks and giggles, sometimes they | end up releasing some "bret victor shit"[3]. | | If you like CodeMirror and end up using it in production, try to | get your company to fund the project[4] and open-source as much | as you can! | | [1]: https://blog.replit.com/codemirror-mobile [2]: | https://blog.replit.com/codemirror [3]: | https://blog.replit.com/kaboomdraw [4]: | https://marijnhaverbeke.nl/fund/ | jan_Inkepa wrote: | > Adopting CodeMirror pushed us to write more in a more | functional style that makes the code more fun and simple (not | easy) in the shortrun, and more maintainable in the long run! | | I had a similar kind of good experience with code-mirror. I was | writing my first proper compiler, and making a total dogs | dinner of it. As a distraction, I decided to try put together | an editor with syntax highlighting with CodeMirror. In the | process of just fitting my compiler to the CodeMirror recursive | descent parser I ended up bringing my compiler back from the | brink of disaster. It feels _really_ nice when a framework /API | has enough good-taste/-engineering built into it that it | improves code that uses it :) | | I'll be interested in seeing how the upgrade to 6 goes - I'll | wait until it's officially released, though... | | (People've been using said compiler + IDE for about ten years | now) | [deleted] | nathancahill wrote: | For Markdown specifically, ByteMD is built with Svelte on top of | CodeMirror. It's a real joy to use. | | For editors in general, CodeMirror 6 is an excellent, modular | rewrite of CodeMirror 5. | | Monaco uses it's own build system that requires a lot of | configuration twiddling to get it to work. Powerful, but it's | first and foremost built for VSCode. | bityard wrote: | FYI, this is a few months old, if you want to read something up | to date, check out https://blog.replit.com/codemirror | | Unfortunately copy and paste doesn't work well on Firefox on | Linux in any of these fancy editors because support for the | primary selection is broken and Mozilla doesn't seem interested | in fixing it: | https://bugzilla.mozilla.org/show_bug.cgi?id=1593761 | | The article calls CodeMirror "lightweight" but the minified JS is | still over 1 MB. If you want lightweight then you probably want | something like CodeJar (https://github.com/antonmedv/codejar) | which clocks in at 2 kB. | robocat wrote: | Your points are valid, but are not relevant. | | > Unfortunately copy and paste doesn't work well on Firefox on | Linux | | Code editing in the browser has plenty of valid criticisms, but | that criticism is as pointless as saying it won't work in Lynx. | Use any one of the many many browsers that do support copy and | paste. | | > which clocks in at 2 kB. | | You aren't comparing like-for-like in terms of functionality. | You might as well say just use a <textarea> tag which clocks in | at 0.02kB. | | > but the minified JS is still over 1 MB | | From the article: Modularity, bundling, and footprint: | "CodeMirror is built with modern technologies. You can even use | ES6 modules to import it with no bundler involved. Lazy-loading | features is a breeze; dynamic ES6 imports are all you need. The | project is very modular and has a very slim core.". | | CodeMirror is relatively light, compared against Monaco: | "Monaco is huge. monaco-editor and related libraries | contributed a whopping 51.17 MB to our bundle size (5.01 MB | when parsed + gzipped)", in Monaco "lazy-loading features are | not possible as far as I'm aware". | masfrost wrote: | The 1MB number is not correct, the core of CodeMirror is 150kb | before gzip. Codejar is pretty cool, but it's super minimal, | it's great if you want something very basic. It also doesn't | really work on mobile despite using contentEditable. | bityard wrote: | I'm not taking gzip into consideration, I'm going by the fact | that this file is 1.14MB: | https://codemirror.net/6/codemirror.js | [deleted] | masfrost wrote: | Hmm, not sure. | | Here it is around 300kb inflated https://codemirror-basic- | setup.replitfaris.repl.co/ using the basic-setup package, | and I don't think this build tree-shakes. | | Code for this build is here https://codemirror-basic- | setup.replitfaris.repl.co/__repl | grayrest wrote: | The size is going to depend on the set of features enabled | and I expect that build has everything turned on so that it | can be used for all the demos. | | I did a quick check of a CM6 project (customizing the JS | lexer) with the base options and a JS-derived lexer and it | came out to 405k / 124k gzip. I wouldn't consider it | especially lightweight but I think the size is reasonable | for the feature set. | metadata wrote: | CodeMirror is promising. Monaco is _huge_ and clunky to | integrate, but it works really well once you get past the steep | learning curve. It has everything one needs to build a full IDE | around it (as VSCode demonstrates, quite convincingly). | | Right now, someone with own parser/language analyzer (I have | built parsers for several SQL dialects) has just Monaco to work | with as LSP for CM6 doesn't seem to exist yet. | | Will be closely watching CM development. | draw_down wrote: | masfrost wrote: | Author here: We might release our LSP implementation for | CodeMirror some time this year. | | The LSP integration for Monaco is lackluster, it works, but | isn't great. We thought LSP would work perfectly on Monaco only | to find out that the Monaco APIs are very different from LSP | APIs or even VSCode APIs. The 3rd party package out there is | good, but you need a bunch of monkey-patching to make it work | in an "IDE" environment. | rektide wrote: | lsp would be so awesome to see! please do consider releasing. | | thanks for releasing codemirror-vim! not having vim | capabilities has been one of the longest standing blockers to | me using anything web-platform based. i understand there are | some vim plugins for various platforms, but great to see some | efforts out in the open for codemirror6. | https://github.com/replit/codemirror-vim | proofrock wrote: | Any thoughts on Code Server? It's vs code in a browser, I've been | used it for one year now and it's great. But maybe it's outside | the scope of the article? | bastardoperator wrote: | Considering I can now press '.' on GitHub and get vscode, not | including codespaces or opting to run in vscode on the desktop, | why would I use one of these alternatives? And to be clear, I'm | not advocating anything, genuinely curious what makes these | better then the alternatives. | qbasic_forever wrote: | When you press . on github you _are_ using one of those options | --monaco, as built into VS Code's new client/PWA experience. | bastardoperator wrote: | Exactly what I was looking to understand, thank you for the | feedback. | CarlGroovy wrote: | Maybe if you were developing on a Chromebook. But yes, I don't | see any other reason. I'm curious too. | ianbutler wrote: | vscode is built on top of Monaco. These are all lower level | editors with very well exposed APIs that let you build on top | of them. It's more for developing something with a code editor | versus directly using them everyday as your editor, though I'm | sure people do. | textadventure wrote: | You are thinking of personal use cases, but the point of these | editors is that they strive to be as light weight as possible | and are meant to be part of some online service that for some | aspect of their functionality/features includes offering an | embedded code editor. VScode has too much stuff for most of | those use cases where you'd use something like CodeMirror. | itslennysfault wrote: | IMO... you don't. Microsoft won the day (for now anyways). | samwillis wrote: | Not mentioned in the article but CodeMirror has a brilliant story | for realtime collaborative editing. You have two options: | | - An Operational Transform (OT) based system built by Marijn (the | creator of CodeMirror) | | - A Conflict Free Replicated Datatype (CRDT) based system using | Yjs built by Kevin Jahns (the creator of Yjs) - | https://github.com/yjs/y-codemirror | | OT Demo: https://codemirror.net/6/examples/collab/ | | Yjs Demo: https://demos.yjs.dev/codemirror/codemirror.html | | Both are brilliant, but I'm a huge fan of Yjs - the number of | different bindings to different editors (and state systems) is | incredible. It's a great platform to build collaborative tools on | and the big plus is offline editing support, you can have a | document diverge significantly while offline and still merge | successfully. OTs are a little more difficult to make work well | for a significant period offline. | | I don't know which of the above Replit use, I would suspect the | OT version as they mention building a OT system for Ace in the | article. | masfrost wrote: | We had to handroll our own OT implementation inhouse (based on | https://github.com/ottypes/text-unicode) since we had built the | system for it already. I suspect we would've used or forked | CodeMirror's collab package if we were starting today. | | Also huge fan of yjs, but the implementation is not compatible | with codemirror 6, only version 5 (AFAIK) | mlajtos wrote: | There is Yjs bindings for CM6: | https://github.com/yjs/y-codemirror.next | masfrost wrote: | Amazing, thanks | productceo wrote: | I think in Stack Overflow Developer Survey or in the State of JS | Survey, 3% or less responded they use cloud IDE. I wonder whether | they are solving some real problem that cannot be solved in | desktop IDE, and whether they will really take off one day. | arve0 wrote: | I think they are solving for management, for example by locking | down the dev environment. Not saying it's impossible in desktop | IDEs, but maybe harder? | matsemann wrote: | After being annoyed with Python's crazy unstable tooling, I've | resorted to running everything I do in docker containers. | | Makes it really easy to get a new project up and running. | "docker compose up", and point pycharm to the python container | as the remote interpreter and it's up and running. No longer | having to spend a few days getting the local env up and running | on some developer's unlucky configuration of software+hardware. | | So while I still use a local IDE, and run most of my stuff in a | container locally, it's not too far off from I feel it's viable | to move everything to a computer in the cloud. Our DS people | are working like that already, with their notebooks and stuff. | ssivark wrote: | That might be the case today, but will that be the case two | decades from now? I.E. if you had to optimize for friendliness | for the next several million programmers around the world, is | there potential to simplify the tooling and improve the | onboarding & deployment experience? | atonse wrote: | Now that so many people are using VS Code anyway, it is the | most perfect situation if you're dealing with sensitive data. | | You just never have local copies of anything. Everything just | runs on a server from your thin client. | | Even useful if you need extra horsepower for a Language Server. | qbasic_forever wrote: | I would wager 75% or more of those respondents actually are | using monaco as a code editor though--it's what powers VS | Code's IDE editing experience. | slaymaker1907 wrote: | The killer app for cloud IDEs is honestly going to be something | GitHub code navigation. Imagine being able to do PRs with click | to definition, find all references, etc., without having to | pull in the changes locally. It's also great even right now for | reading open source projects when you are trying to understand | how something works. | | They are great for viewing code, but I'm not convinced they are | good for writing code. | gabrielsroka wrote: | Have you seen this? | https://docs.github.com/en/codespaces/the-githubdev-web- | base... | madacol wrote: | The closest is to press ".", or change url from github.com to | github.dev. That opens up the github repo in a VScode/Monaco | editor | matsemann wrote: | Reviewing PRs on GitHub is embarrassingly bad, given that | it's their core feature. It hasn't been upgraded for years, | even, missing features BitBucket/Stash had like 10 years ago. | Now a file tree is finally in beta, so it's possible to | navigate between the files. But it's still impossible to see | the context around changes without having to press | expand/(...) a hundred times. | | I've recently experimented with the PR feature inside | JetBrains IDE's. It allows one to navigate quite well without | having to actually switch branch. Like it so far, nice to see | the whole file and related files, not just the diff. | imnitishng wrote: | TBH reviewing PRs on VSCode's Pull Request extension works | pretty well for me. I agree it is a bit slow but I get to | see the changes with all my keybindings, themes and other | tweaks, this just makes the experience better IMO. | mltony wrote: | One more point to consider: CodeMirror is not accessible for | blind users with screenreaders, as it just presents an empty text | area. While Monaco is acdcessible, at least VSCode is. This used | to cause a lot of pain for blind people using Jupyter, which uses | CodeMirror (or at least used to). | jkaptur wrote: | The article says that the new version of CodeMirror uses a | contenteditable and native selection, which I would expect to | pretty much "just work" with screenreaders - is that not true? | robocat wrote: | I presume that is because it is a complicated feature, but not | technically impossible? Although perhaps using contentEditable* | makes an implementation more difficult? | | * From article: "CodeMirror would achieve that by leaning on | native browser text editing (via contentEditable) rather than | implementing text editing entirely in the library/javascript.". | | Edit: from https://blog.replit.com/codemirror "CodeMirror 6 is | a complete rewrite of the CodeMirror editor with a focus on | accessibility, touchscreen support, and extensibility.". I | expect that marjin really cares about accessibility. However, | in my limited experience, as a lone developer I couldn't make | our complex product properly accessible unless that was the | focus of say six months effort, which we couldn't afford at the | time. | mltony wrote: | Ah, you're right, CodeMirror 6 appears to be more accessible. | However it still only shows one line at a time. So that's | still worse than Monaco. Monaco can show one or two hundred | lines at a time. So with CodeMirror 6 I still would have to | read text line by line without any way to skip a function for | example, which is unnecesarily tedious. | | Sure, I understand that people don't have infinite time to | spend on perfect accessibility. I was careful not to have any | blaming tone in my message. | sto_hristo wrote: | Might be worth taking a look at ProseMirror - it's fully modular | and you can put it together by yourself - it's the ultimate in | flexibility. | mlajtos wrote: | The article is about code editors, ProseMirror is for building | rich text editor. However, CodeMirror and ProseMirror has the | same author - Marijn Haverbeke. | teddyh wrote: | I prefer using a local editor using the withExEditor browser | extension: | | https://github.com/asamuzaK/withExEditorHost | fn-mote wrote: | [Replit specific rant, but in my defense it's their blog post.] | | I don't understand the in-browser code editor experience. How | does it work? | | I tried the emacs keybindings on replit... what a joke - | Control-N to go to the next line? Nope. Control-P for previous? | Nope. Meta-F? opens the file menu. I don't even know what | keybindings I should be hoping will work. | | Vi keybindings are much more usable in-browser (obviously). | | A massive problem for me was getting out of the frame and not | being able to get back in. I wanted to do something like | ":compile". Or ":n" to get to the next focusable input field. | | Maybe there are function keys bound? I wish I could find out. | | Is there any possibility of one of these "IDEs" having auto- | indent / reindent? I see from the docs there's supposed to be | one, but all I get is not-smart left/right motion. | | Working with beginners it would be very nice. | easrng wrote: | I think in Monaco you can right click -> Format Document or | something like that. | SonOfLilit wrote: | I read this just two days ago to settle on CodeMirror for the | demo page of my new regex syntax! | | Great blogpost. | stevebmark wrote: | As a new user of Monaco trying to incorporate it into a project: | I disagree with Monaco's documentation being good. Monaco's | documentation is terrible, it's auto-generated API documentation. | Examples are outdated or flat out wrong. To make matters worse, | the (unofficial?) React plugin documentation is unreadable to | newcomers https://www.npmjs.com/package/@monaco-editor/react | danielvaughn wrote: | Yep. I ended up not even being able to import it as an npm | package. Literally just copied it old-school-style into my | repo, and iframed it in. The good thing about Monaco is that | it's _very_ good once you get it working. It 's just the | getting-it-working that really sucks. | kinduff wrote: | I've been following Marijn for years in his development on | CodeMirror and all I have is great admiration of all the work he | has made over the last couple of years, how he gives support, and | provide patches to fix reported bugs. | | Just for that fact I've been implementing CodeMirror in every | project I need to. | numbsafari wrote: | Using a browser based IDE is really powerful as an option, but | comes with a major cost of having to co-exist with the browser in | terms of keyboard macros/chords. | | Personally, I've found it to be really annoying. | | Using VSCode as a desktop connected to a remote code server, or | using JetBrains Projector, is the true sweet spot where you | combine the remote capabilities with a native app. Also fits well | with vim/emacs TUI-style dev. | | If I were building an IDE today, I would absolutely be building | it as a client-server app from day 1. | kitsunesoba wrote: | More generally with web apps the extraneous browser chrome | (some of which carries over into "installed" PWAs, even) is | annoying. If web apps are to be treated as true peers to their | native desktop counterparts, browserisms like back buttons must | be left behind. | hsbauauvhabzb wrote: | Iirc you can't reconfigure keybindings in any major browser. To | me that's terrible UX, preventative of richer web applications, | and a usability issue. | | I'm not suggesting JavaScript should be able to redefine keys | without permission, but I can't even disable CTRL+w as a power | user... | mariusmg wrote: | >If I were building an IDE today, I would absolutely be | building it as a client-server app from day 1. | | Why ? The last thing you want as a user when pressing a key in | a IDE is to then wait for a network request. | dijit wrote: | Rendering will be done locally, so keypresses will be | instant, the intelligent response will have 20ms lag, but | that's not exactly much addition (as a total percentage) with | current IDEs. | tsegers wrote: | That's exactly what a lot of users that do development on a | beefy remote machine from a light machine they use as a | terminal want. Ssh+vim+tmux is a pretty common setup. That | network request might add 20ms of lag, but means that | anything that requires CPU power will be an order of | magnitude faster. The unhappy path (a bad or absent | connection) is bad, but the happy path is pretty damn happy. | ObscureScience wrote: | I guess the combination is the holy grail, but the effort | may not be worth it in alot of cases. | | What I'm referring to would be a caching view which both | hides latency, batches communication for efficiency and | perhaps even does some actions on the client-side buffer if | it's deemed appropriate. | whimsicalism wrote: | ssh+vim+tmux actually unlocked my iPad as a coding tool, | which is incredible. I can go on a bike ride, stop in the | park, get a bit of work done with some tea in a thermos, | and then bike back home. | FpUser wrote: | And bill client for the whole day ;) | wbobeirne wrote: | For PWAs, you can "install" the app to your machine / phone | which gives it its own icon and launches it in its own window. | This also allows it to override most default shortcuts | (Cmd/Ctrl+W, Cmd/Ctrl+T etc.) I use this with | https://github.com/coder/code-server on my personal server and | it's a way better experience for me than mucking around with | SSH / SFTP plugins. | polote wrote: | And there is also this more recent article | https://blog.replit.com/codemirror of why they chose CodeMirror | williamstein wrote: | Thanks. It is great how they put so much effort into explaining | their choices. | victornomad wrote: | I integrated Ace in a couple of projects for already 10 years ago | and the experience was incredible smooth to use and upgrade | versions. | | One of them the uses was for the Remote Editor of my programming | environment for Android, PHONK | https://github.com/victordiaz/PHONK (is unmantained nowadays | because of lack of time). | | What I loved the most was the API to tweak the editor the way you | want. Ace come with a demo where you can tweak all parameters | easily. The only bug I encountered back in the day was some | scrolling issues with ipads but probably is solved already. | | I tried also CodeMirror and Monaco but somehow went back to Ace | because of its simple setup. | kleiba wrote: | OT: What are the main features that make you as a developer | prefer a (browser-based or not) IDE over editors like vim/emacs? | Does it make a difference if we're talking about professional | development vs. hobby projects? | neoneye2 wrote: | I did a summer project last year and picked CodeMirror 5, after | trying out several web editors. I can't remember why I made that | choice. It had to work well with wasm + webworker. I'm very | satisfied about CodeMirror 5 and is looking forward for version | 6. | | https://loda-lang.org/edit/?oeis=2487 | ilovecaching wrote: | I like being able to create shareable snippets and appreciate the | need for code editors on the web in some places. I would never | rely on a web based editor as my full time editor. I have read a | few dystopian takes where we rent our editors in the cloud | (VSCode/Fleet seem to be leading this). Software is a trade, and | the editor is the primary tool of the trade. Your editor should | be able to follow you wherever you go, be easy to shape to your | liking by being FOSS that you can compile yourself, and you | should never rent it for money. Own the tools you rely on to make | a living. Reading through usesthis.com and many a blog post, I've | yet to find a programmer I admire that isn't using either | vim/emacs for these reasons. | seanw444 wrote: | I'm glad this is an MIT-licensed project. This seems very | lightweight, covers a lot of edge cases, is accessible, and | seems to be fairly performant. Very good for a web editor. For | websites like Pastebin or something where this comes in handy, | I applaud the project. | | But I agree, I will still never leave Emacs :) though, I don't | think this project is aimed at replacing standalone editors. | afry1 wrote: | In theory, I agree with you, but on the whole, this is a rather | elitist viewpoint. | | The vast majority of the world uses a mobile phone to connect | to the internet. While I do agree that web-based editors aren't | as good as desktop-based editors, and that there's potential | for abuse in the transactional nature of web-based editors, a | web-based editor is the best that billions of people can | manage. | | It's not perfect, but I'd take a world with online code editors | over a world where coding is only possible in a desktop | environment. A world with more programmers and more people who | are knowledgeable about how their digital lives really work is | better than a world with fewer in the know, or fewer who are | empowered to know due to technological limitations. | zewish wrote: | After a couple of weeks of research we found Slate in for a | project we're working on. In case somebody needs a proper editor | framework - you definitely need to give Slate a try | (https://github.com/ianstormtaylor/slate). It's one of the best | editor frameworks I've used, and it also has a really nice React | integration. | mlajtos wrote: | The article is about code editors, Slate is for building rich | text editor. ___________________________________________________________________ (page generated 2022-03-14 23:00 UTC)