<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Yao Ding</title>
    <description>The latest articles on DEV Community by Yao Ding (@yaodingyd).</description>
    <link>https://dev.to/yaodingyd</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F908288%2F390ee86b-3ed0-4db6-91dd-6dca9afab511.jpeg</url>
      <title>DEV Community: Yao Ding</title>
      <link>https://dev.to/yaodingyd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yaodingyd"/>
    <language>en</language>
    <item>
      <title>My Experience with Migrating Create-React-App to Vite/Rsbuild</title>
      <dc:creator>Yao Ding</dc:creator>
      <pubDate>Thu, 20 Feb 2025 16:41:51 +0000</pubDate>
      <link>https://dev.to/yaodingyd/my-experience-with-migrating-create-react-app-to-vitersbuild-1jd7</link>
      <guid>https://dev.to/yaodingyd/my-experience-with-migrating-create-react-app-to-vitersbuild-1jd7</guid>
      <description>&lt;p&gt;Recently, the React team has &lt;a href="https://react.dev/blog/2025/02/14/sunsetting-create-react-app" rel="noopener noreferrer"&gt;officially deprecated Create React App (CRA)&lt;/a&gt; and recommends moving to either a framework or a build tool. This created &lt;a href="https://x.com/youyuxi/status/1891721924197351497" rel="noopener noreferrer"&gt;some discourse&lt;/a&gt; online about whether the React team had been hesitant to recommend a build tool, and I feel like this is the right time to actually test the migration from Create React App. I’m choosing &lt;a href="https://github.com/aqualinkorg/aqualink-app" rel="noopener noreferrer"&gt;one open-source project&lt;/a&gt; I contribute to, which is a rather simple Single Page Application (SPA) and a perfect candidate. In this case, I’m testing Vite and Rsbuild since I’m not really a Parcel user. It’s my grease pass. I'll check all possible angles, including documentation, community support, and overall developer experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vite
&lt;/h2&gt;

&lt;p&gt;To be honest, I’m kind of surprised that the Vite documentation does not have an official guide for CRA migration. That's not really an issue, though, since there are so many good guides from the community. I used the &lt;a href="https://www.robinwieruch.de/vite-create-react-app/" rel="noopener noreferrer"&gt;migration guide recommended by the React team&lt;/a&gt;, and it roughly follows these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Update dependencies (add Vite, remove react-scripts)&lt;/li&gt;
&lt;li&gt;Create &lt;code&gt;vite.config.js&lt;/code&gt; with basic settings&lt;/li&gt;
&lt;li&gt;Update import path resolution to keep using &lt;code&gt;src&lt;/code&gt; as &lt;code&gt;basePath&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Move &lt;code&gt;index.html&lt;/code&gt; out of the &lt;code&gt;public&lt;/code&gt; folder&lt;/li&gt;
&lt;li&gt;Install the &lt;code&gt;svgr&lt;/code&gt; plugin and update import names&lt;/li&gt;
&lt;li&gt;Update environment variable names to follow the Vite pattern&lt;/li&gt;
&lt;li&gt;Replace &lt;code&gt;process.env&lt;/code&gt; usage with &lt;code&gt;import.meta&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The complete details are in this &lt;a href="https://github.com/aqualinkorg/aqualink-app/pull/1101" rel="noopener noreferrer"&gt;PR&lt;/a&gt;. With the above guide and the magic of ChatGPT, I was able to finish the migration in under an hour. The app works fine locally, and I can definitely feel the app startup time being shortened. There are some minor issues, like some asset import paths still not resolving correctly, but I feel pretty good about it in general.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rsbuild
&lt;/h2&gt;

&lt;p&gt;To be fair, I should say that migrating to Vite already made me familiar with the general process, so I sort of got a head start with Rsbuild. I do want to give the Rsbuild team credit for putting up an official and thorough &lt;a href="https://rsbuild.dev/guide/migration/cra" rel="noopener noreferrer"&gt;migration guide&lt;/a&gt;, and I didn't really need to look anywhere else. The changes are rather simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Update dependencies (add Rsbuild, remove react-scripts)&lt;/li&gt;
&lt;li&gt;Create &lt;code&gt;rsbuild.config.ts&lt;/code&gt; and add all necessary settings, including SVG, ESLint, environment variables, and build output&lt;/li&gt;
&lt;li&gt;Update &lt;code&gt;index.html&lt;/code&gt; for import paths&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And that's it! I didn't need to make changes in the source code or really any other places besides the config file, so the change set in this &lt;a href="https://github.com/aqualinkorg/aqualink-app/pull/1102" rel="noopener noreferrer"&gt;PR&lt;/a&gt; is ridiculously small. I finished the migration in probably under 10 minutes, and the app runs smoothly locally with no issues at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Technically speaking, I didn't finish the migration completely since I have not verified the build version and didn't really touch on tests. Still, this was a good experience and definitely shows the power of modern tooling. I think both Vite and Rsbuild offer an excellent experience, and honestly, Rsbuild wins here for me with thorough official documentation and fewer invasive changes in the code.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://yaodingyd.github.io/blog/migrating-create-react-app-to-vite-rsbuild/" rel="noopener noreferrer"&gt;Originally published in my personal blog&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vite</category>
      <category>rspack</category>
      <category>react</category>
    </item>
    <item>
      <title>React Server Component is perfect for Backends-for-Frontends</title>
      <dc:creator>Yao Ding</dc:creator>
      <pubDate>Wed, 26 Jun 2024 19:30:20 +0000</pubDate>
      <link>https://dev.to/yaodingyd/react-server-component-is-perfect-for-backends-for-frontends-123n</link>
      <guid>https://dev.to/yaodingyd/react-server-component-is-perfect-for-backends-for-frontends-123n</guid>
      <description>&lt;p&gt;By now, you should be familiar with React Server Components (RSC) or at least have heard about them. RSC is the latest addition to React's feature set, offering significant benefits such as reduced client-side JavaScript bundles, improved user experience by eliminating extra network roundtrips, and the ability to run server code directly in React components. As someone who has always worked in a traditional team setup with separate backend and frontend teams, I've been contemplating the feasibility of both teams adopting this paradigm. It's clear that there are some major hurdles to overcome.&lt;/p&gt;

&lt;h2&gt;
  
  
  How conventional backend/frontend works
&lt;/h2&gt;

&lt;p&gt;Let's first revisit the non-RSC server/client development flow. Suppose you have a list of product features to implement. Typically, the following would occur:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A design review where backend and frontend teams agree upon an API specification that defines server behavior. While implementation is discussed, the focus is usually on the interface.&lt;/li&gt;
&lt;li&gt;The Backend team will implement the server behavior with this API spec, and release under a version, like &lt;code&gt;/api/v1/my-product&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The frontend team consumes this API and builds the UI behavior.&lt;/li&gt;
&lt;li&gt;Work for backend and frontend teams might happen sequentially, but it could also occur in parallel. Once the API is defined, frontend teams can mock test data based on the API interface.&lt;/li&gt;
&lt;li&gt;When new product requirements arise, the API can be enhanced or deprecated in favor of a new version with breaking changes. The frontend team can simply switch to different API versions to opt into different behaviors.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;While this flow may seem to have significant overhead, it offers some notable benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend and backend can test their parts completely in isolation and achieve end-to-end testing within their respective boundaries.&lt;/li&gt;
&lt;li&gt;API endpoints remain stable as long as the version doesn't change, ensuring consistent server behavior.&lt;/li&gt;
&lt;li&gt;Maintaining different versions of UIs is relatively inexpensive, as we can simply replace calls to different endpoints.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Implementing RSC in Conventional Backend/Frontend Setup
&lt;/h2&gt;

&lt;p&gt;Now, let's examine how RSC would work. For a fair comparison, we can assume both backend and frontend teams have domain knowledge of JavaScript and React. We can split work into a server component that handles data fetching and business logic processing, then passes data as props to a client component. Several considerations come to mind:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fuzzy server responsibilities&lt;/strong&gt;: Without a clear return from server components, everything becomes an implementation detail. Previously, API endpoints provided a defined contract to follow. With server components, we don't have explicit expectations from the server, requiring code analysis to determine what the server component should fetch and pass down to the client. This lack of clarity might reduce confidence in refactoring server code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Increased testing complexity&lt;/strong&gt;: How would you test that a server component is working as expected? With API endpoints, we can perform integration tests to ensure that given certain requests, responses match expectations. For server components, ensuring proper data fetching and return becomes more challenging, likely requiring extensive mocking and tapping into implementation details to test in isolation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintaining stable server behavior&lt;/strong&gt;: With API endpoints, we have versioning. Do we need to maintain different versions of server components? This could add another layer of ambiguity to server implementation.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For enterprise applications, debugging processes involving backend interactions with datastores can be particularly challenging. When server components handle all aspects, this complexity could increase significantly.&lt;/p&gt;

&lt;p&gt;On a positive note, server actions may be easier to adopt as they are pure functions with clear inputs and outputs. We can treat them similarly to API endpoints, with stable and clear interfaces, isolated testing, and version control.&lt;/p&gt;

&lt;p&gt;However, in large organizations where backend and frontend teams often work with different stacks or in separate repositories, implementing these approaches can be challenging.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backends-for-Frontends: A Perfect Fit for RSC
&lt;/h2&gt;

&lt;p&gt;React Server Components (including server actions) could be an ideal fit for the &lt;a href="https://samnewman.io/patterns/architectural/bff/"&gt;backends-for-frontends(BFF)&lt;/a&gt; pattern. In this pattern, we would have dedicated API endpoints for specific UI behavior, and the endpoints will typically be maintained by the UI team. We still have general-purpose backend that connects to datastore and do heavy-lifting business logic, and react server component will just handles the BFF part. &lt;/p&gt;

&lt;p&gt;As Sam Newman states:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The BFF is tightly focused on a single UI, and just that UI."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Since BFF is tightly coupled to a single UI, we needn't worry about strong contracts for server behavior, as the UI is the sole output. We should no longer test backend and frontend in isolation, as they are both part of the implementation details. Instead, we should focus on end-to-end testing.&lt;/p&gt;

&lt;p&gt;The benefits of server components shine in this context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We can skip the overhead of releasing API endpoints.&lt;/li&gt;
&lt;li&gt;We achieve better code colocation for all frontend code.&lt;/li&gt;
&lt;li&gt;We eliminate multiple network roundtrips to fetch data.&lt;/li&gt;
&lt;li&gt;Client bundle size is significantly reduced.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's a perfect match for the BFF pattern.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Ryan Florence, creator of Remix (a React server framework), aptly described Remix as a &lt;a href="https://x.com/ryanflorence/status/1791477026060452091"&gt;center stack&lt;/a&gt;. I believe RSC serves a similar purpose, sitting between users and the general backend, bridging the network in the process. With that in mind, the future looks promising for React Server Components.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://yaodingyd.github.io/blog/react-server-component-is-perfect-for-backends-for-frontends/"&gt;https://yaodingyd.github.io/blog/react-server-component-is-perfect-for-backends-for-frontends/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Data Fetching, HTML Streaming and RSC: the Next Way or the Remix Way</title>
      <dc:creator>Yao Ding</dc:creator>
      <pubDate>Fri, 25 Nov 2022 03:07:56 +0000</pubDate>
      <link>https://dev.to/yaodingyd/data-fetching-html-streaming-and-rsc-the-next-way-or-the-remix-way-bcd</link>
      <guid>https://dev.to/yaodingyd/data-fetching-html-streaming-and-rsc-the-next-way-or-the-remix-way-bcd</guid>
      <description>&lt;p&gt;The recent two big announcements from the React community(or if you only care about React, then that qualifies as the whole web community) is the release of Next.js 13 and Remix joining Shopify. Admittedly, meta frameworks increasingly are like smartphones these days: they look alike, use similarly but are implemented differently to claim they run better benchmarks, and this applies for Next.js 13 and Remix too: a lot similarities (nested route, layout, server side data-fetching) but some fundamentally different implementations. &lt;/p&gt;

&lt;p&gt;Next.js 13 is deemed as almost the official React framework by the React core team, with its integration with streaming Server Side Rendering(SSR) and React Server Component(RSC), while Remix, coming from react-router, takes a different approach and leans more on the web platform. Let's look at these differences and learn about the tradeoffs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Streaming SSR
&lt;/h2&gt;

&lt;p&gt;HTML streaming is not really a new thing. &lt;a href="https://blog.codinghorror.com/the-lost-art-of-progressive-html-rendering/"&gt;There are posts dated as early as from 2005&lt;/a&gt;, and it has been kept mentioned over the years, but just never took off. &lt;a href="https://dev.to/tigt/the-weirdly-obscure-art-of-streamed-html-4gc2"&gt;Taylor Hunt wrote a nice article about why it is not common&lt;/a&gt;, and aside from inconsistent naming and poor support, I think another reason on a deeper level is the gain of actual decreased Time to First Byte (TTFB) comparing with heavy implementation effort is just too marginal(see an example &lt;a href="https://remix.run/blog/react-server-components#ssr-streaming-nextjs-demo"&gt;here&lt;/a&gt;).  &lt;/p&gt;

&lt;p&gt;Even though this is considered as a core piece of &lt;a href="https://twitter.com/dan_abramov/status/1585095883309617154"&gt;the React architecture&lt;/a&gt; and &lt;a href="https://twitter.com/ryanflorence/status/1586820807581261824"&gt;soon will be in Remix&lt;/a&gt; too, I still feel like it will end up like web components: everyone knows about it but no one uses it just because there are better alternatives. But if somehow Next.js can make this as ergonomical and practical as possible, and it can be used out-of-the-box and app naturally get optimized TTFB, it might get adopted widely, so let's wait and see. &lt;/p&gt;

&lt;h2&gt;
  
  
  RSC
&lt;/h2&gt;

&lt;p&gt;The biggest advantage of using RSC is of course to reduce the codes shipped to the client side. On the Remix side, it touts the concept of Progressive Enhancement, that apps will work correctly without JavaScript and all assets are prefetched/preloaded in parallel. So either way the initial runtime should not scale as the application codebase grows. Another big selling point of RSC is that server logic co-locates with corresponding components, and Remix achieves the same goal with route-level loader/actions. In my opinion, this view/logic colocation might be the best thing and drastically improves the developer experience, saving so much back-and-forth when developing APIs and views together. &lt;/p&gt;

&lt;p&gt;RSC definitely has its perks, although the mental model of differentiating server and client components could be repetitive and error prone, as mentioned in &lt;a href="https://hydrogen.shopify.dev/roadmap/?shpxid=a60ff6a6-660E-48E8-C426-B7CA02B7D7E9#data-loading"&gt;Shopify's post about why they turn to the Remix model&lt;/a&gt;. Developers would need to carefully plan their components structure and pay attention to the constraints of using server and client component, with &lt;a href="https://github.com/reactjs/rfcs/pull/229"&gt;the incoming change to hooks&lt;/a&gt; further increases the cognitive efforts. My two cents is this very much feels like a leaky abstraction which can be solved with something like a compiler -- React would just know if this should be a server or client component, instead of asking user to do the grunt work. Hopefully there will be something like &lt;a href="https://www.youtube.com/watch?v=lGEMwh32soc"&gt;React without memo&lt;/a&gt; in the future, but for RSC.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Fetching
&lt;/h2&gt;

&lt;p&gt;The key differences for data fetching as summed by the Shopify team is whether the queries are run on route-level (loader in Remix) or component-level (RSC in Next). For each request, for Remix all data fetchers within nested routes are called in parallel, then Remix return a completed rendered HTML; while Next.js returns HTML immediately with placeholders(Suspense), fetching data sequentially following component hierarchy, then returns with a completed rendered HTML. This seems to be a &lt;a href="https://twitter.com/ryanflorence/status/1586820806625046529"&gt;philosophical design differences between these two projects&lt;/a&gt;. Each pattern has its use case, as the &lt;a href="https://remix.run/blog/react-server-components#our-take"&gt;Remix team describes&lt;/a&gt; RSC &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;has a chance of providing a better UX when your user's network is fast, but your server's data loading is slow.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That means if your server is always fast, and you cannot guarantee your user's network is fast too, Remix might be better. The interesting part about Shopify buying Remix, is that I would assume Shopify is very confident about its API will never be slow, so the server rendering model is better than the streaming model. &lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;There will never be a perfect web framework, and you should really weigh in the tradeoffs based on the use cases, but generally you can't go wrong choosing either one here. Both are battle-tested, developed by brilliant people and backed by large companies. Next.js might has the upper hand of having the largest community, but since Shopify bought Remix, it might also get more community support. I'm very excited about the future both frameworks bring to us!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>nextjs</category>
      <category>remix</category>
    </item>
    <item>
      <title>What's with All the Runtimes for JavaScript?</title>
      <dc:creator>Yao Ding</dc:creator>
      <pubDate>Sat, 13 Aug 2022 23:28:11 +0000</pubDate>
      <link>https://dev.to/yaodingyd/whats-with-all-the-runtimes-for-javascript-3odp</link>
      <guid>https://dev.to/yaodingyd/whats-with-all-the-runtimes-for-javascript-3odp</guid>
      <description>&lt;p&gt;Right now it is an exciting time for JavaScript. We just got a new shiny fast runtime &lt;a href="https://bun.sh/"&gt;Bun&lt;/a&gt;, with the last new kid Deno being released only 4 years ago, and we have edge computing/serverless runtimes like Cloudflare worker and &lt;a href="https://blueboat.io/"&gt;Blueboat&lt;/a&gt;. With all these hypes for the JavaScript community, I could not help but ask, how come only JavaScript gets all these fancy new runtimes? Why don’t we hear these more often in other languages?&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a runtime anyway?
&lt;/h2&gt;

&lt;p&gt;Runtime can mean different things, but here we refer to the runtime environment or runtime system, which is the system where the program is intended to be run. Basically, it means you need to install some libraries or use some executables to run your codes, like how you would use node command to run your JavaScript codes. One thing to note is that you might confuse it with “runtime library“. Sometimes we also talk about “runtime” in certain compiled languages,  but more often these are standard libraries that are included during every build to manage heap/stack and garbage collections. Check out some faqs like the one for &lt;a href="https://go.dev/doc/faq#runtime"&gt;Go&lt;/a&gt; and for &lt;a href="https://prev.rust-lang.org/en-US/faq.html#does-rust-have-a-runtime"&gt;Rust&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some languages don’t need one
&lt;/h2&gt;

&lt;p&gt;The interesting thing about runtime is not all languages require one to run their programs. Let’s take some static-typed, compiled languages for example. Usually they are compiled ahead-of-time into binary executables, and sometimes for modern languages like go, these executables can be even cross-platform. When you run these executables on a computer, you do not necessarily need to pre-install any required libraries on that computer. So for these languages, we don’t even need a runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  Others might have a few runtimes, but often with an official implementation
&lt;/h2&gt;

&lt;p&gt;Being a static-typed and compiled language, Java does need a runtime, which is a virtual machine called Java Virtual Machine(JVM). When Java source codes are being compiled, they are transformed into bytecodes, and these bytecodes will be executed in JVM. In some sense, python being an interpreted language is actually &lt;a href="https://stackoverflow.com/questions/441824/java-virtual-machine-vs-python-interpreter-parlance/1732383#1732383"&gt;quite similar to Java&lt;/a&gt;: the Python interpreter would first transform python source codes to bytecodes and these bytecodes would be executed in the Python virtual machine. The difference is for Python the interpreter and virtual machine are both inside the same executable.  So for these two languages, they would both require a runtime, to either interpret and/or run the intermediate codes. For Java, there are different &lt;a href="https://en.wikipedia.org/wiki/List_of_Java_virtual_machines"&gt;JVMs&lt;/a&gt;; for Python, there are also &lt;a href="https://www.python.org/download/alternatives/"&gt;alternatives&lt;/a&gt; other than the default CPython. These are all different runtimes, but most of the time we always use the default reference implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  JavaScript runtime is made of JavaScript engine and implementations of other APIs
&lt;/h2&gt;

&lt;p&gt;Historically being an embedded language, we use JavaScript to perform tasks in the host environment, most of the time being a browser. These tasks, like DOM manipulation, adding event listeners, and fetching HTTP requests, though initiated by JavaScript codes, are all part of Web APIs and not part of the core language.  So browser would need an “engine” to run these JavaScript codes to get work done.  The term “JavaScript Engine“ echos the other major part of a browser -  &lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Rendering_engine"&gt;rendering engine&lt;/a&gt;, and is more suitable than “JavaScript interpreter“ since modern engines also use Just-In-Time compilation for performance improvement(Interestingly, only the PHP community uses the word “engine” to refer its interpreter).&lt;/p&gt;

&lt;p&gt;So we can think of the JavaScript engine as a minimum runtime that is an implementation of the ECMAScript spec, or the “core JavaScript“, and it will only execute JavaScript synchronously, which is not that useful. The runtime will add all the good stuff that we want: for the browser environment, it’s DOM, Fetch and other Web APIs; for the server environment, it’s file systems, networking and also some Web APIs.  If I can use an analogy:  the JavaScript engine is like a human brain that can understand instructions, and runtime is the complete human with a brain and a body that can both understand instructions and perform tasks. Just to think that something necessary and simple as the console API is not included in the ECMAScript spec and has be to add by the runtime. To make up these “bodies“, or to implement these APIs, we also need to use other low-level languages, like for Node it’s c++,  for Deno it’s Rust, and for Bun it’s Zig. These are all driven by the community; the lack of an official organization or a reference implementation for server-side JavaScript also makes it possible that one cannot overshadow the others.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;So there you have it, for other languages, either it does not need a runtime at all, or it has several runtimes but one being predominately used. For JavaScript, with multiple choices for web browsers, we also have several contenders for runtimes, and there always will be newcomers to challenge the status quo.  Just like how all the major frontend frameworks compete with each other and make the web better altogether, I believe all runtimes are going in the same good direction for server-side JavaScript, for that we have to thank all the creative and hard-working community contributors, who keep making JavaScript fresh and exciting.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
