Visual Studio Code is not a classic editor nor a traditional IDE. It is a platform for development tools that is completely based on web technologies. While Eclipse is a monolithic Java application with native UI widgets, VSCode consists of multiple Node.js processes that communicate through a Chromium-based user interface.
Advantage: VSCode looks like a browser and uses the same rendering engine, but is a native desktop application with web technology as the UI layer. This technology is called Electron.
Before we look at Electron, a fundamental understanding of Node.js is crucial. Node.js is a JavaScript runtime environment based on Google Chrome’s V8 engine – however without a browser, but with access to the operating system.
This means specifically:
Electron turns web technologies into desktop applications. Or simply: Chromium + Node.js = Desktop App.
This means you develop an application with HTML, CSS and JavaScript, except this application can read files, open terminals, start other programs and do everything a native desktop software can do. Because Electron bundles a Chromium instance with a Node.js runtime in a single package.
This architecture also has its price: Higher resource consumption than native applications.
The benefit: Significantly faster development and cross-platform consistency.
VSCode is divided into three separate areas:
A Node.js process that starts the application, manages windows and acts as a message broker. Here run:
A Chromium process that displays the VSCode interface. Everything you see – editor, sidebar, terminal, status bar – is HTML and CSS. The Monaco Editor (the text editor core of VSCode) is a JavaScript component that runs in this process.
Practical consequence: You can debug VSCode
interfaces like a webpage. Like in the browser: The Chromium DevTools
can be opened with Cmd/Ctrl + Shift + I and allow live
debugging of the UI.
A separate Node.js process in which all extensions run. This separation is crucial: If, for example, an extension crashes, VSCode remains stable. Extensions never communicate directly with the user interface, but everything goes through defined APIs.
The three processes communicate via Inter-Process Communication (IPC) with each other. This is asynchronous message-passing, i.e. message-based and process-oriented. In extension development, these are typically Promise-based API calls.
For extension development this means:
await is standard,
not exception// Typical: Asynchronous API call
const document = await vscode.workspace.openTextDocument(uri);
await vscode.window.showTextDocument(document);
// Typical: Register event listener
vscode.workspace.onDidChangeTextDocument(event => {
// React to document changes
});The extension API of VSCode is not direct access to Node.js
or a DOM, but an abstract, stable API layer
that acts as a bridge between the extension host and the actual
application. All calls like
vscode.workspace.openTextDocument or
vscode.window.showTextDocument are wrapper
functions that internally communicate via Inter-Process
Communication (IPC) with the main and renderer process.
Important for understanding:
vscode API is not the native
fs module of Node.jsThe example with
await vscode.workspace.openTextDocument(...) is therefore
not direct file access in the sense of fs.readFile(...),
but an API request to the VSCode core, which is processed by the host
system and returned via an internal message.
Consequence for extension developers:
vscodeThose who need deeper Node.js functionality (e.g. HTTP requests,
filesystem operations, spawning processes) can use this within
the extension itself via require('fs'),
require('child_process') etc., but access to VSCode
functionality always occurs exclusively through the
API.
| Component | Technology | Function | Extension Relevance |
|---|---|---|---|
| Extension Host | Node.js | Isolated runtime for extensions | Full NPM ecosystem, filesystem access |
| Main Process | Electron | Application logic, file management | API calls delegated here |
| Renderer Process | Chromium | UI rendering, editor display | Webviews, theming, DOM-based UI |
| Extension API | TypeScript | Typed abstraction layer | All VSCode functions, IntelliSense support |
| Aspect | Java/Eclipse | VSCode/TypeScript |
|---|---|---|
| API Access | Direct object access (SWT, JFace) | Wrapper API via IPC |
| Execution Model | Synchronous, blocking | Asynchronous, Promise-based |
| UI Integration | Native UI controls | Web standards (HTML/CSS) |
| Error Handling | Runtime exceptions | Compile-time + Promise rejections |
| Dependency Management | OSGi, Target Platform | NPM, package.json |
| Debugging | Same JVM | Extension Development Host |
| Property | Technical Implementation | Practical Consequence |
|---|---|---|
| Wrapped | All calls via IPC, not direct | No DOM manipulation, API calls only |
| Asynchronous | Promise-based, even for simple operations | await for all VSCode functions |
| Typed | Complete TypeScript definitions | IntelliSense for entire API |
| Versioned | Semantic versioning, engine requirements | Explicit VSCode version in package.json |
| Isolated | Extension runs in separate Node.js process | No side effects between extensions |
Core understanding:
vscode.workspace.openTextDocument() is not
fs.readFile(), but a typed IPC message to
the VSCode core with guaranteed return signature.
| Aspect | Eclipse | VSCode |
|---|---|---|
| Basic Architecture | Monolithic JVM | Multi-Process (Electron) |
| UI Framework | SWT/JFace (native widgets) | HTML/CSS/DOM |
| Plugin Isolation | Classloader separation | Process separation |
| API Design | Synchronous Java APIs | Asynchronous TypeScript APIs |
| Communication | Direct object calls | Message-passing (IPC) |
| Deployment | JAR bundles (OSGi) | NPM + VSIX packages |
| Language | Java | TypeScript/JavaScript |
| Debugging | Eclipse debugger | Chrome DevTools |
VSCode is consistently web-native designed. Those coming from Eclipse work not only with a new API, but also with a different architectural paradigm that is event-driven, asynchronous and modular.